Aqui está apenas uma versão polinomial :
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 ter cinco multiplicações (supondo que você possa salvar o resultado de x.*x
) e três adições.
E o scilab
enredo é:
Top é scilab
's asin
vs este, inferior é o erro entre os dois.
Resposta original
A raiz quadrada aqui pode ser um aborrecimento, mas pensei em escrevê-la porque parece divertida. :-)
Esta página sugere:
da página 81 do Handbook of Mathematics Functions, de Milton Abramowitz e Irene Stegun:
arcsin(x)=π/2−1−x−−−−−√(a0+a1∗x+a2∗x2+a3∗x3),
que
a0=1.5707288a1=−0.2121144a2=0.0742610a3=−0.0187293
Eu implementei isso scilab
e funciona bem, exceto em torno de . Apenas refletir sobre para uma aproximação muito melhor.x=−10≤x≤1−1≤x≤0
O gráfico superior mostra scilab
a asin
função da comparação acima (em vermelho tracejado) em relação à minha mudança de verde.
O gráfico inferior mostra o erro da minha alteração (plotar isso e o original nos mesmos eixos significa que o verde parece zero em todos os lugares).
// 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.')