トピック

僕のcosがあぁ((

テーラー展開を使って描いたcosのグラフがx=12πあたりで崩れちゃいました。 f(x)=Σx^(2n+1)/(2n+1)! 足し算してて変数に入れられる上限にぶつかっちゃったのかなぁと思っているのですが、上限っていくつでしたっけ?(初歩的な質問すみません汗 それと、上限を越えたらその変数はどうなりますか? その上限以上を扱うためにはどうしたらいいですか?
15そうだね
プレイ済み
返信[1]
親投稿
すみません、式間違ってました。 *(-1)^nが抜けてました。
0そうだね
プレイ済み
返信[2]
親投稿
さらに間違えてました。 書いた式sinの方でした(うろ覚えで式なんか書かなきゃ良かったと後悔)
0そうだね
プレイ済み
返信[3]
親投稿
れい rei-nntnd
プチコンは64ビットの浮動小数点数を使っている。 「倍精度」というやつ。 符号部1ビット指数部11ビット仮数部52+1bitで、 11ビットなので 上限は2^1023程度 でも問題はそこじゃないんじゃないかね テーラー展開、収束するにはxが小さくないとだめでしょ。
2そうだね
プレイ済み
返信[4]
親投稿
れいさん回答ありがとうございます。 2^1023ですか。 めちゃめちゃ大きいなぁ... 上限いくかなんて想像できないorz とりあえず2^1023と12π^50を比べたら遥かに2^1023が大きいご様子。 指数部、仮数部...ぐぐってきます。 え、x小さくないと近似できないんでしたっけ?(←勉強不足) そこを指摘されて、完全に上限越えたことが原因だと思っていた僕は穴があったら入りたい気分です笑 nをどんどん大きくすれば大丈夫だろうなんて思ってましたが... 確認でcos,sinのテーラー展開の収束半径を計算すると、∞になりました。 あれ?やっぱり上限越えたことが原因なんじゃ...(諦めてない) テーラー展開についてはちょっと勉強しなおして参ります。
0そうだね
プレイ済み
返信[5]
親投稿
以下勉強してきた結果 sin,cos,expとかは収束半径∞だし、オイラーの公式とかテーラー展開使って証明されてるし、きっとxは大きくても複素数でも問題ないのでしょう。
0そうだね
プレイ済み
返信[6]
親投稿
不動小数点型について少し勉強してきて(主におちゃめさんのプチコン講座にて。m(_ _)mイツモオセワニナッテマース) グラフが崩れた原因を考えてみました。 間違ってるところ、補足などありましたら教えていただきたいです。 ↓ nが大きくなるにつれ、計算過程で2^53を越える値が出てきた。その結果実際の値との誤差がグラフに現れるレベルに大きくなり、グラフの形が乱れた。 具体的にはx^(2n)>2^53または(2n)!>2^53となったときから誤差が出始める。
0そうだね
プレイ済み
返信[7]
親投稿
れい rei-nntnd
あーすまん。全然正確な言い方ではなかった。 > きっとxは大きくても複素数でも問題ないのでしょう。 そりゃ分母にn!入ってるし収束はする。がその速度と精度が違うのが問題。 計算精度内で収束するにはxが小さくないとダメ。 > nが大きくなるにつれ、計算過程で2^53を越える値が出てきた。その結果 2^53では表現しきれない値が出てきたので足し算引き算した結果誤差が大きくなってしまった。 とくにsinやcosの場合符号の異なる数字を足すことになるので「桁落ち誤差」が生じる。 これが主な理由。
2そうだね
プレイ済み
返信[8]
親投稿
なるほど。 では、かけ算わり算の順序を工夫して計算過程で2^53を越えないようにできればx大きくてもきれいに描けそうですね。 x/(2n)*x/(2n-1)*... みたいな感じで。 for n=1to 100 t=1 for i=1to 2n t=t*x/i next a=pow((-1),n)*t f=f+a next
0そうだね
プレイ済み
返信[9]
親投稿
だめかぁ...
0そうだね
プレイ済み
返信[10]
親投稿
れい rei-nntnd
残念ながらsinやcosなどはその程度の工夫ではダメで、すぐに発散してしまう。 数項くみあわせると多少ましになるが、それでもごくわずかしか効かない。 なにしろ各項が指数関数的にでかくなるわけなので、誤差もその程度に大きくなる。 誤差をたかだか定数倍ほど減らしても焼け石に水なんだわ。 より詳しくは…ここには書ききれないし、俺にはすぐには書けない。 numerical recipesなどの名著を参考にしてくれ。
1そうだね
プレイ済み
返信[11]
親投稿
ツララ LongIceSword
逆に考えたらこの仕組みを応用して乱数作れたりするんじゃないです? あまさとさんが三角関数を使って疑似乱数作られてましたけど、多分そういうことですよね?
4そうだね
プレイ済み
返信[12]
親投稿
さらに色々しましたが根本的にはどうしても解決できなさそうですね。
0そうだね
プレイ済み
返信[13]
親投稿
本の紹介ありがとうございます。 さっそく図書館で借りて読んでいます。 乱数確かに出来そうですね。
0そうだね
プレイ済み
返信[14]
親投稿
最終的に、計算過程で大きくなったら割り算進めて、小さくなったら掛け算進めるような順序にしました。 まあ誤差は消せませんでした。 れいさんありがとうございました! 閉めます。
0そうだね
プレイ済み