arcsinアルゴリズムを探す


7

誰かが適度に正確なアークサインを計算するための単純なアルゴリズムを持っていますか?「シンプル」とは、出力サンプルごとに5回以下の乗算を必要とするある種の多項式を意味します。「合理的に正確」とは、入力引数がプラスまたはマイナス1に近いときにエラーが10%以下のアルゴを意味します。しばらくウェブを検索しましたが、すぐに役立つものは何も見つかりませんでした。


これは、いくつかのアイデアを与えるかもしれないstackoverflow.com/questions/5920467/...
geometrikal

しかし、なぜルックアップテーブルだけではないのでしょうか。
geometrikal

利用可能なメモリがひどく制限されている実装を考えています。そのため、「ルックアップテーブル」のソリューションは考慮しませんでした。あなたの考えをありがとう。
Richard Lyons

平方根を許可しますか?に近い関数の動作により±1(無限スロープ)、多項式近似はそこでうまく機能しません。
Yves Daoust、2015

CORDICについてはどうでしょうか。これは、数個の加算と減算のみを行い、乗算は行いません。
mattgately

回答:


5

これが多項式バージョンです:

アークシンバツ=バツ+12バツ+124バツ55+15246バツ77
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プロットは:

ここに画像の説明を入力してください

上はscilabasinvsこれです。下は2つの間のエラーです。


元の回答

ここの平方根は面倒かもしれませんが、面白そうなので書きたいと思いました。:-)

このページは提案します:

Milton AbramowitzとIrene Stegunによる 『Handbook of Mathematical Functions』の81ページから:

アークシンバツ=π/21バツa0+a1バツ+a2バツ2+aバツ
どこ
a0=1.5707288a1=0.2121144a2=0.0742610a=0.0187293

私はこれを実装しましたがscilab、周りを除いて問題なく動作しますバツ=1。ただ反映する0バツ11バツ0 はるかに良い近似になります。

上のプロットは、緑の変化に対する上記の近似(破線の赤)に対するscilabasin関数を示しています。

下のプロットは、私の変更のエラーを示しています(同じ軸に元のプロットをすると、緑はどこでもゼロに見えます)。

ここに画像の説明を入力してください

// 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
"Handbook of Mathematical Functions"はその本が大好き
geometrikal

1
ああ撃て。Web検索中にそのWikiの「逆トリガー関数」Webページを見ましたが、「無限シリーズ」の資料を表示するのに十分なほど下にスクロールしませんでした。恥ずかしい。ピーターK.、それは私が借りているもう1つの問題です。(私の元々の問題は、中央差分デジタル微分器のパフォーマンスを改善することでした。これは、アークサイン演算を実行することで実行できると思います。)
Richard Lyons

そうです、しかしリック、あなたは無限のシリーズを行うことはできません。有限にする場合、最適な係数は、無限系列を切り捨てることによって得られるものとは完全には一致しません。MATLABを利用する場合(比較的安価な "自宅使用"ライセンスを現在持っている場合)、心の希望の機能でRemez交換を行うためのMATLABコードを送信できます。
robert bristow-johnson、2015

1
更新:arcsin()関数を使用せずに、元の問題(中央差分微分器よりもパフォーマンスが向上した非常に単純なデジタル微分器を作成)を解決できました。結果を説明するブログをdsprelated.comに投稿する場合があります。みなさん、助けてくれてありがとう!
Richard Lyons

3

私はかなり良い実装をしています アークタン こちら

私はあなたがアイデンティティを使うことができると思います:

アークシンバツ=アークタンバツ1バツ2

あなたが欲しいものを得るために。


さまざまな機能へのリンクは興味深いロバートです。ちょっと笑って、sqrt(1 + x)関数を実装しようとしました。0から4の正しい制限を使用する代わりに、私は台無しにして1から5を使用しました。もちろん、間違った結果を計算しました。しかし、「間違った」結果を2倍すると、正しい結果になりました。面白いでしょ?
Richard Lyons

リック、私は関数が「正しい」(またはかなり正確)であると確信している バツ述べたように。ためにバツ、それだけのために良いです 1バツ2なので、間にいる場合 2 そして 4、それからあなたは少し一定でなければなりません( 2)そこに格納され、あなたはの偶数の指数の違いを知る必要があります 2 と奇数の指数 2
robert bristow-johnson、2015

私もあなたの機能が正しいと信じています。私は自分が行ったばかげた「合計制限」の間違いについてコメントしているだけであり、私の間違いを犯す際に誤った結果を計算しました。しかし、私は自分の誤った結果が正しい結果のちょうど半分であることに気づきました。私が言ったのは、私の間違った結果が正しい結果と「興味深い」関係にあるということだけでした。混乱して申し訳ありません、ロバート。
Richard Lyons

2

曲線の中央部分はかなり線形であり、2項または3項へのテイラー近似が適切な開始点です(最小二乗多項式はわずかにより良く適合します)。

傾斜が無限であるため、側面はより問題になります。対処する方法は、変換を使用することです

アークシンバツ=π2アークシン1バツ2

これは平方根を含みます。


あなたの議論なら z は浮動小数点で表され、平方根の高速近似は、指数を半分にし、仮数に線形変換を適用することによって得られます。

しましょう z=メートル2e1メートル<2、その後 z=メートル2e/2。概算できますメートル 沿って 21メートル+2

  • 指数を取る e 離れて(それをクリアすると、 メートル);
  • もし e 均等、計算 21メートル+2;
  • もし e 奇数、計算 221メートル+2;
  • 指数を設定する e/2

ここに画像の説明を入力してください


興味深い平方根アルゴリズムを試すのが楽しみです!
Richard Lyons

これらの係数を使用すると、誤差は常に正になります。わずかな調整により、対称にして最大誤差を半分にすることができます。
Yves Daoust、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.