use warnings; use strict; # 例 x^2 定積分の近似値 my $a = 0; my $b = 1; my $N = 100; my $Integrand = '$x*$x'; my $MidpointRule = &MIDPOINTRULE($a, $b, $N, $Integrand); print "$MidpointRule\n"; # 中点法則 Midpoint Rule # 引数 左端a 右端b 分割数 被積分関数 ($a, $b, $N, $Integrand) # 戻り値 中点法則 ($MidpointRule) sub MIDPOINTRULE{ my ($a, $b, $N, $Integrand) = @_; ($a, $b) = ($b, $a) if($a > $b); my $MidpointRule = 0; my $h = ($b - $a) / $N; my $Sum = 0; # 分割数の確認 if($N < 2){ return 0; } # 計算 for(my $i = 1; $i <= $N; $i++){ my $x = $a + ((((2 * $i) - 1) / 2) * $h); my $tmp = &INTEGRAND($x, $Integrand); $Sum += $tmp; } # 中点法則 Midpoint Rule $MidpointRule = $Sum * $h; return $MidpointRule; } # 被積分関数 Integrand # 引数 積分変数 被積分関数 (\@Integrand) # 戻り値 被積分関数 ($Integrand) sub INTEGRAND{ my ($x, $Integrand) = @_; my $tmp = eval($Integrand); return $tmp; }