Aquí hay solo una versión polinómica :
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
que parece tener cinco multiplicaciones (suponiendo que pueda guardar el resultado x.*x
) y tres adiciones.
Y la scilab
trama es:
La parte superior es scilab
's asin
contra esta, la parte inferior es el error entre los dos.
Respuesta original
La raíz cuadrada aquí puede ser una molestia, pero pensé en escribirla porque parece divertida. :-)
Esta página sugiere:
de la página 81 del Manual de funciones matemáticas, por Milton Abramowitz e Irene Stegun:
arcsin(x)=π/2−1−x−−−−−√(a0+a1∗x+a2∗x2+a3∗x3),
dónde
a0=1.5707288a1=−0.2121144a2=0.0742610a3=−0.0187293
He implementado esto scilab
y funciona bien, excepto alrededorx=−1. Solo reflejando el0≤x≤1 a −1≤x≤0 hace una aproximación mucho mejor.
La gráfica superior muestra scilab
la asin
función de la aproximación anterior (en rojo discontinuo) contra mi cambio en verde.
La gráfica inferior muestra el error para mi cambio (trazar eso y el original en los mismos ejes significa que el verde parece cero en todas partes).
// 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.')