• 締切済み

アークタンジェントテーブルの誤差補正方法について

下記のサイトのソースを元に アークタンジェント( atan2()関数 )をテーブル化してみたのですが http://asdf.wkeya.com/code/usetable_hpp.html 誤差が気になり何か良い補正の方法はないかと探して見たところ なかなか見つかりませんでした 次のサイトでSinテーブルの誤差を修正する方法は見つけたのですが http://ctrlwww.ee.noda.tus.ac.jp/wiki/kansai/index.php/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96 そこでatanテーブルの誤差を補正する なにかわかりやすくよい方法はないでしょうか?

noname#231244
noname#231244

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

No.3の訂正です。 >テイラー展開の最初の項はTacosanで書かれていますので、 テイラー展開の最初の項はNo2でTacosanさんが書かれていますので、 と書くべきところを、Tacosanさんすみません。 No.3の二次の項までを入れてざっと計算してみましたがCで倍精度ではatanの方が速かったです、No.2で書かれている一次までだとテーブルを使う方が若干速いという結果でした。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

No.1です テイラー展開の最初の項はTacosanで書かれていますので、その次の項からは http://mail2.nara-edu.ac.jp/~asait/c_program/sample0/taylor_note.htm が参考になると思います。 続きを書くと atan a + x/(1+a^2)-x^2*a/(1+a^2)^2...... のようになります。 ここまで計算するとatanの方が速い可能性もありますので、単に速度を上げる目的なら注意してください。テーブル引きは意外と時間がかかりますので。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「誤差が気になり」ってところは, 本当は「どのあたりの引数でどのくらいの誤差になっているのか, そして必要な精度はどうなっているのか」を知りたいんだけど.... テイラー展開すると atan(x+a) = atan a + x/(1+a^2) + ... かな. あるいは線形補間するとか.

noname#231244
質問者

補足

精度に関してなんですが -45~45度を90分割~450分割した場合を考えています 使いまわせるように 精度を選択できるようにしておきたいなと思ったので

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

テイラー展開を使うのが一番簡単なように思います。 質問欄の2番目のリンクは、sin(a+b)のsinの加法定理を使って、cos(b)とsin(b)を taylor展開できれいに展開できていますが、atanの場合は適当な加法定理がなさそうなので、強引にテイラー展開するのが簡単そうです。 x=a+bとおいて(aはテーブルにある角度、bはその近傍) atan(a+b)-atan(a)をそれぞれ展開し、 その結果をテーブルから求めたatan(a)に足すとそこそこの精度が得られます。 この場合はaの項が残りますのでリンクのような美しさはないですが。 SSEのようなベクトル計算機能のないCPUだと多分速度が得られるように思いますが、最近のCPUだとテーブルを使わない方法と比べてみるのもおもしろいと思います。

noname#231244
質問者

補足

x=a+bで aはatan2(y,x)の引数y/xで引けるテーブルの値なのはわかるのですが bはどうやって求めれば良いのでしょうか? 2つ目のURLの gosa=x-sinindex*M_PI/254 のあたりから取れば良いのでしょうか?

関連するQ&A

  • Sinテーブルの値からAtan等の値の出し方

    Sinテーブルを使い Atanの値を出す方法を探したのですが 方法が見つかりませんでしたので質問します 使用言語はC++です 次のようなSinテーブルがあるとします 大きさは901で0~90度までの値を分割して入れてある データ型はdouble テーブル引きの結果にSin、Cosの値を使った テイラー展開を用いて誤差を小さくしている 以下のサイトのSinテーブルを参考にしています http://ctrlwww.ee.noda.tus.ac.jp/wiki/kansai/index.php/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96 上記のSinテーブルを使うことで Sin、Cos、Tanの近似値が出せる状態から Asin、Acos、Atanの値を出す方法はあるでしょうか 標準関数を使えばいいと言われてしまえばそこで終わりですが せっかくSinテーブル+テイラー展開による補正で相応の精度で値を出せるのなら 逆三角関数の値をこれを使って出せないかと考えました いろいろとサイトを回りましたが ほとんどが標準関数を使っての物だったので もし方法があるのならお答えいただけるとありがたいです

  • 位相角の計算 アークタンジェント

    位相角の計算をしているのですが, a+jωの位相角は,φ=atan(ω/a)になります. (a+jω)/(b+jkω)の位相角の計算はどのように行ったらよいのでしょうか? φ=atan(ω/a)-atan(kω/b)という計算であっていますか? もしあっていればその理由を,違っているのなら,正しい計算方法を教えていただけないでしょうか.よろしくお願いします.

  • 理想気体と実在気体の誤差を補正する方法

    気体には実在気体と理想気体が存在しますが、その誤差を補正する方法を教えてください。できれば、参考になるサイトもお願いします。

  • テーブルタップを壁にかける方法

    テーブルタップを壁にかける方法 テーブルタップの「SSW66G」 http://www.amazon.co.jp/%E3%82%AA%E3%83%BC%E3%83%A0%E9%9B%BB%E6%A9%9F-SSW66G-%E5%AE%89%E5%85%A8%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%B3%E3%83%88-6%E5%80%8B%E5%8F%A32-5m/dp/B000FHUQ70 を壁にかけたいのですが、なにかいい方法はないでしょうか? 本体後ろ側には、鍵穴みたいな釘にかけるような穴は有ります。

  • 回帰線の誤差と繰り返し誤差の分離について

    お世話になります。 化学分析方法について公定法のAと迅速法のBを比較検討しています。 A法で値が既知の試料5種類についてB法で3回~5回測定し, 回帰線を書きました。この回帰線の誤差の中には, 繰り返し測定の誤差と回帰線の誤差が含まれていると思います。 これを分離するのは分散分析と思いますが,方法がまったくわかりません。質問が抽象的ですみませんが,ヒントや考え方だけでも教えていただきたくお願いします。もちろん,関連サイトの紹介も歓迎します。 よろしくお願いします。

  • テーブルの分け方を教えてください。

    現在、大学で行った実験をデータベース化しよう としているのですがその際のテーブル分け方を 教えてください。 一つの実験を行ったとき ::::::::::::::::::::::::::::::::::: タイトル  解説  実験方法 特徴 材料 加工機 ◇実験条件 実験条件1   実験条件2    実験条件3・・・ 条件名A    条件名B     条件名C・・・ 32.1 34.5   21 65 89    20 40                ◇誤差 誤差条件1 誤差条件2・・・・  誤差名E  誤差名F 35 64   45 65 38 21 :::::::::::::::::::::::::::::::::::: 以上のデータがとれるとします。 ・タイトル 解説 実験方法 特徴 材料 加工機は文書データです。 ・実験条件1.2.3とありますが、実験によって実験条件数はまちまちです。  誤差条件にしても同様です。 ・また、実験条件名・誤差名ともに1回しか出てこないような名前ばかりです。 (ほかの実験で同じ条件は使いません)  誤差名も同様です。 ・条件の値、上の例でいうと、32.1 34.5等は一つの条件に何個入るかまちまちです。  2個だったり3個だったり4個だったりします。  誤差での値も同様です。 このような条件で沢山のデータがある場合、どのようにテーブル分けすればよいのでしょうか? 宜しくお願いします。

  • 3D空間内の2つの図形の間の角度を求めるには?

    3D空間で、顔テクスチャーを貼り付けた、立方体Aと立方体Bを適当に配置したときに、立方体Aの方向を向くように立方体Bを回転させる方法について調べています。 2次元の場合は 回転角=Math.atan2(図形BのY座標-図形AのY座標,図形BのX座標-図形AのX座標)*180/Math.PI; のように、アークタンジェントを使えばよいのですが、3次元の場合はどのように考えればよいのでしょうか?

  • LU分解の誤差

    javaで               元が{{a},{b},{c}}という3行1列の行  LU分解すると{{d},{e},{f}} となる行列があるとすると      (a+b+c=15200)-(d+e+f=15082)=128となり128の誤差がでるんですが誤差128はやはり大きすぎるので正しくLU分解が行われていないのでしょうか?

  • できればピボットテーブルを使いたい

    エクセルのデータとして 【1sheet】 A 10 B 20 C 30 D 40 E 50 【2sheet】 B 50 C 10 E 20 A 40 D 30 【3sheet】 D 30 B 20 A 10 E 50 C 40 【4sheet】 E 20 C 40 A 30 B 10 D 50 とバラバラなデータがあるとします。 上記の場合、合計は A 90 B 100 C 120 D 150 E 140 となりますが、わざわざ1つずつ計算機で算出しています。 これをピボットテーブルというものを使って集計することはできますか? もし出来るならば簡単で構わないので方法を教えて下さると助かります。 また、ピボットテーブルは使えないまたは、使わないほうが良いということで算出する場合、どのような効率の良い方法があるのでしょうか? お願いします。

  • プランク定数の相対誤差について

    プランク定数の相対誤差をしらべてみると、単位によって大きさが違うのですが、これはなぜなのでしょうか? たとえば、2010年CODATA推奨値の場合、J・s単位だと相対誤差は 4.4×10^-8 なのに、eV・s単位だと2.2×10^-8 になっています。 単に単位を変えただけなのに、誤差が減ったり増えたりしてしまうのは不思議なのですが・・・。単位を変換するときに、素電荷eの相対誤差2.2x10^-8が入るか入らないか、ということなのでしょうか?しかし、それだと誤差がなぜ2乗和でなくて単純な和になっているのかがわからないです。両者は相関もないですし。 ご存知の方がいらっしゃったら教えていただければ幸いです。 Wikipediaのプランク定数のページ http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%83%B3%E3%82%AF%E5%AE%9A%E6%95%B0

専門家に質問してみよう