2009/08/15

ズルはどこまで許されるのか?

ある人と話して、
 tan(x)のグラフはどう書くの?
という話になった。

計算機に、値をぶち込んで、点をつなぐだけなんですが・・・

- - - - -
ということを、数式処理屋さんが素人さんに言ったところで、解決にならないので、
少しわかるような説明を考えてみた。
- - - - -

tan(x)=sin(x)/cos(x)
なので、cos(x)=0となる点では発散しちゃうのです(ここを問題に質問したわけです)。
そこで、cos(x)=0となるxを計算して、そこの前後では線をつながない。
それだけで、tan(x)のグラフは書けるのですが。。。

cos(x)=0となるxをどう計算するの?

意外にこれが面倒。なぜかというと、無数存在するから。
x=90 ± n*180°
描画範囲さえ決めてしまえば、そこに入る点をピックアップすればいいのですが、
そんな処理を書きたくない(ムズくないけど)


でも、それ以上もそれ以下の書き方もないので・・・
ちょっとズルをしてそれっぽく書ける方法を考えてみる。

sin(x)/cos(x)の分子くん分母さんのテイラー展開を考えます。
(彼らは、
収束半径が無限大なのでそれなりのテイラー近似で、
それっぽい挙動
を示すことが可能です)

実際に、Mapleさんで簡単にやってみます。

とりあえず、それぞれを原点で9次まで展開(Maple使用)
> s:=convert(evalf(taylor(sin(x),x,10)),polynom);
> c:=convert(evalf(taylor(cos(x),x,10)),polynom);

s := 1. x - 0.1666666667 x^3 + 0.008333333333 x^5 - 0.0001984126984 x^7 + 0.000002755731922 x^9
c := 1. - 0.5000000000 x ^2 + 0.04166666667 x^4 - 0.001388888889 x^6 + 0.00002480158730 x^8

そしてプロット
> plot(s/c,x=-10..10,view=[-10..10,-5..5],scaling=CONSTRAINED);











こんな感じ。
発散する場所の処理はこれだけではできないけど、なんちゃってグラフを書くのには十分です。

処理にはいろいろな方法がありますが、長くなるのでここでは述べません。
(cの解でも、十分な精度はあるので、この解の前後でつながないようにすればOKです)


p.s.
高校生のころ、N88Basicでやっていたころと違って、簡単にグラフが書けますね。
テイラー展開もfor文で回して書いていたのに、今はコマンド一発ですからね。

いい時代になりました。

0 件のコメント: