見出し画像

三角関数の非ゼロ問題

Matlabだけでなく他の言語でもよくある話。

三角関数たとえばsin.cosを扱うときに数式の上では$${sin(0),sin(\pi),sin(2\pi),cos(0),cos(\pi),cos(2\pi)}$$
だと、手計算だと
$${sin(0)=0,sin(\pi)=0,sin(2\pi)=0}$$
$${cos(0)=1,cos(\pi)=-1,cos(2\pi)=1}$$
と結果がわかってるので0や1という数字がでてきます。

が、そもそも無理数の円周率$${\pi}$$が15桁で丸められてるためこんな感じになります。

解が±1の時はなぜか正確ですが、0の時はものすごく小さな値を持ち非ゼロとなってしまいます。

で、特に問題なのがゼロ検出したい時、図中下段の式を使うとき$${sin(0)==0,sin(\pi)==0}$$で返すと答えが異なってきます。

sin、cos単体ならいいんですが計算式が複雑になったり、ダイナミックシミュレーションで微分とか積分とか入ると一番初歩的な問題で躓いて全く気が付かないことがあるので注意する必要があります。

よくやるのが

>> abs(sin(2*pi))<0.0001

って範囲指定でゼロ検出する方法です。

ただこれはこれで、ダイナミックシミュレーションするときに場合によってはその他の計算がハンチング起こすので結構悩ましい問題です。

特に値が0(中心)とか1(最大)のポイント抽出したい時にうまくいかないって時は見直すと良いかと思います。

根本は数値の丸めにあるんですが、三角関数の非ゼロ問題の話でした。





この記事が気に入ったらサポートをしてみませんか?