背景:ガウス関数を無限級数の和として計算する次のコードがあります。 Gaussian Functionは、最も簡単な形式ではe^- (x^2)です。 これは、テイラー級数展開を使用して、無限級数の和として計算できます。Math.expの結果と矛盾する無限級数の和
したがって、e^- (x^2)= 1 - (x^2)+(x^4)/ 2! - (x^6)/ 3! ....
public static double expSeries (double x, int n){
double result = 0.0, x0 = 1.0, x1;
result+= x0;
for (int i=1; i<=n; i++){
x1 = x0 * ((x*x)/i);
if (i%2 == 0){
result += x1;
} else {
result -= x1;
}
x0 = x1;
}
return result;
}
比較として、私はMath.exp(-(x*x))
を使用して、私の機能が正しく機能するかどうかを確認します。
この関数は低い値のx
では機能するようですが、それ以降は一貫して動作しません。いくつかのテストケースの出力は次のとおりです。
x=1; n=10 Result : 0.3678794642857144 Math.exp: 0.36787944117144233 x=1; n=100 Result : 0.36787944117144245 Math.exp: 0.36787944117144233 x=2; n=100 Result : 0.018315638888733953 Math.exp: 0.01831563888873418 x=3; n=100 Result : 1.234098038990534E-4 Math.exp: 1.2340980408667956E-4 x=4; n=100 Result : 1.1247503313371918E-7 Math.exp: 1.1253517471925912E-7 x=5; n=100 Result : 8.181278981021932E-7 Math.exp: 1.3887943864964021E-11 x=6; n=100 Result : -0.03197975209642004 Math.exp: 2.319522830243569E-16 x=7; n=100 Result : 3.6698962220692825E10 Math.exp: 5.242885663363464E-22
ここでは何が欠けていますか?
私は浮動小数点精度を推測するでしょうか?これを防ぐためにBigDecimalを試すことができます(理由がある場合) – AxelH
なぜ私はfactorialの代わりに 'i'で割りますか? – jr593
@AxelH:私は最大の値についていくつかの計算をしました。 x = 1およびn = 100の場合、100!が計算され、9.332622e + 157となる。 x = 5およびn = 100の場合、5×200が計算され、6.223015e + 139である。それが範囲の問題だったなら、私はそれがx = 1&n = 100で墜落していたはずだと思います。 – Haxiel