use Math::Cephes qw(gamma); # 第1種変形ベッセル関数 Bessel Function # 引数 次数 変数 ($N, $X) # 戻り値 第1種変形ベッセル関数 ($BesselFunction) sub BESSELFUNCTION{ my ($N, $X) = @_; my $BesselFunction = 0; my $PrevBesselFunction = 0; my $Num1 = 0; my $Den1 = 0; my $Den2 = 0; my $Limit = 100; my $Epsilon = 1.0e-10; for(my $i = 0; $i < $Limit; $i++){ # 分子 $Num1 = ($X / 2) ** ($N + (2 * $i)); # 分母 $Den1 = ($i == 0 ? 1 : ($Den1 * $i)); $Den2 = &gamma($N + $i + 1); # 一つ前 $PrevBesselFunction = $BesselFunction; # 第1種変形ベッセル関数 Bessel Function $BesselFunction += ($Num1 / ($Den1 * $Den2)); # 収束判定 last if(abs($BesselFunction - $PrevBesselFunction) < $Epsilon); } return $BesselFunction; }