誰かが適度に正確なアークサインを計算するための単純なアルゴリズムを持っていますか?「シンプル」とは、出力サンプルごとに5回以下の乗算を必要とするある種の多項式を意味します。「合理的に正確」とは、入力引数がプラスまたはマイナス1に近いときにエラーが10%以下のアルゴを意味します。しばらくウェブを検索しましたが、すぐに役立つものは何も見つかりませんでした。
誰かが適度に正確なアークサインを計算するための単純なアルゴリズムを持っていますか?「シンプル」とは、出力サンプルごとに5回以下の乗算を必要とするある種の多項式を意味します。「合理的に正確」とは、入力引数がプラスまたはマイナス1に近いときにエラーが10%以下のアルゴを意味します。しばらくウェブを検索しましたが、すぐに役立つものは何も見つかりませんでした。
回答:
これが多項式バージョンです:
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
5つの乗算(の結果を保存できると想定x.*x
)と3つの加算があるようです。
そしてscilab
プロットは:
上はscilab
のasin
vsこれです。下は2つの間のエラーです。
元の回答
ここの平方根は面倒かもしれませんが、面白そうなので書きたいと思いました。:-)
このページは提案します:
Milton AbramowitzとIrene Stegunによる 『Handbook of Mathematical Functions』の81ページから:
私はこれを実装しましたがscilab
、周りを除いて問題なく動作します。ただ反映する に はるかに良い近似になります。
上のプロットは、緑の変化に対する上記の近似(破線の赤)に対するscilab
のasin
関数を示しています。
下のプロットは、私の変更のエラーを示しています(同じ軸に元のプロットをすると、緑はどこでもゼロに見えます)。
// 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.')
曲線の中央部分はかなり線形であり、2項または3項へのテイラー近似が適切な開始点です(最小二乗多項式はわずかにより良く適合します)。
傾斜が無限であるため、側面はより問題になります。対処する方法は、変換を使用することです
これは平方根を含みます。
あなたの議論なら は浮動小数点で表され、平方根の高速近似は、指数を半分にし、仮数に線形変換を適用することによって得られます。
しましょう 、 、その後 。概算できます 沿って 。