Hier ist nur eine Polynomversion :
arcsin( x ) = x +12x33+1 ⋅ 32 ⋅ 4x55+1 ⋅ 3 ⋅ 52 ⋅ 4 ⋅ 6x77
function y = arcsin_test3(x)
y = x.*(1+x.*x.*(1/6+ x.*x.*(3/(2*4*5) + x.*x.*((1*3*5)/(2*4*6*7)))))
endfunction
Das scheint fünf Multiplikationen (vorausgesetzt, Sie können das Ergebnis von speichern x.*x
) und drei Additionen zu haben.
Und die scilab
Handlung ist:
Top ist scilab
‚s asin
vs diese, unten ist der Fehler zwischen den beiden.
Ursprüngliche Antwort
Die Quadratwurzel hier mag ein Ärger sein, aber ich dachte, ich würde es aufschreiben, weil es nach Spaß aussieht. :-)
Diese Seite schlägt vor:
ab Seite 81 des Handbuchs der mathematischen Funktionen von Milton Abramowitz und Irene Stegun:
arcsin( x ) = π/ 2-1 - x- -- -- -- -- -√(ein0+ein1∗ x +ein2∗x2+ein3∗x3) ,
wobei
a0=1.5707288a1=−0.2121144a2=0.0742610a3=−0.0187293
Ich habe dies in implementiert scilab
und es funktioniert OK, außer um . Nur die auf reflektieren , eine viel bessere Annäherung.x=−10≤x≤1−1≤x≤0
Das obere Diagramm zeigt scilab
die asin
Funktion gegen die obige Annäherung (rot gestrichelt) gegen meine Änderung in Grün.
Das untere Diagramm zeigt den Fehler für meine Änderung (das Zeichnen des Originals auf derselben Achse bedeutet, dass das Grün überall Null aussieht).
// 25770
function y = arcsin_test(x)
a0 = 1.5707288
a1 = -0.2121144
a2 = 0.0742610
a3 = -0.0187293
xx = abs(x)
y = %pi/2 - sqrt(1-x).*(a0 + a1*x + a2.*x.*x + a3.*x.*x.*x)
endfunction
function y = arcsin_test2(x)
a0 = 1.5707288
a1 = -0.2121144
a2 = 0.0742610
a3 = -0.0187293
xx = abs(x)
y = %pi/2 - sqrt(1-xx).*(a0 + a1*xx + a2.*xx.*xx + a3.*xx.*xx.*xx)
y = y.*sign(x);
endfunction
x = [-1: .0100001 : 1];
clf
subplot(211)
plot(x,arcsin_test2(x),'g.');
plot(x,arcsin_test(x),'r:');
plot(x,asin(x))
subplot(212)
//plot(x,(arcsin_test(x) - asin(x)),'r:')
plot(x,(arcsin_test2(x) - asin(x)),'g.')