Hintergrund: Ich habe den folgenden Code, der die Gaußfunktion als eine Summe einer unendlichen Reihe berechnet. Die Gaussian Function, in seiner einfachsten Form ist e^- (x^2). Dieser Wert kann als Summe einer unendlichen Reihe unter Verwendung der Taylor-Reihen-Erweiterung berechnet werden.Summe der unendlichen Reihen, die nicht mit Math.exp übereinstimmen
Daher ist 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;
}
Als Vergleich verwende ich Math.exp(-(x*x))
zu sehen, ob meine Funktion ordnungsgemäß funktioniert.
Die Funktion scheint für niedrige Werte von x
zu funktionieren, verhält sich aber danach inkonsistent. Hier die Ausgabe einiger Testfälle:
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
Was fehlt mir hier?
Ich würde schätzen Floating-Nummer Präzision? Du könntest es mit BigDecimal versuchen, um dies zu verhindern (wenn das der Grund ist) – AxelH
Warum dividierst du durch "i" statt "i faktoriell"? – jr593
@AxelH: Ich habe ein paar Berechnungen zu den größten Werten gemacht. Wenn x = 1 & n = 100, 100! berechnet, was 9,332622e + 157 ergibt. Wenn x = 5 & n = 100, wird 5^200 berechnet, was 6,223015e + 139 ist. Wenn es sich um ein Bereichsproblem handelte, sollte es mit x = 1 & n = 100 abgestürzt sein. – Haxiel