• 検索結果がありません。

方程式の数値解( find root )

ドキュメント内 if if-else if-elif-else (ページ 100-103)

方程式の数値解を求めるにはfind_rootを使います:

方程式の数値解を区間[a, b]の中で探す

1 f i n d _ r o o t (方 程 式, a , b )

find_rootは区間の中に解が複数個存在しても1つの解しか返しません。

例:x2+ 2x9 = 0の解を[5,5]の中で探すには次のようにします:

1 s a g e : f i n d _ r o o t ( x ^ 2 + 2 * x -9==0 , -5 ,5)

2 2 . 1 6 2 2 7 7 6 6 0 1 6 8 3 7 9 1

上と同じ方程式で解を探す範囲を狭くすると,解が無くなってしまいますが,このときはエラーとなります:

1 f i n d _ r o o t ( x ^ 2 + 2 * x -9==0 , -2 ,2)

実行結果の例 Traceback (click to the left of this block for traceback)

...

RuntimeError: f appears to have no zero on the interval

エラーメッセージでは方程式f はその区間では0にならなかったといっています。find_rootの利点は,答 えは厳密ではないけれども,複雑な関数であっても数値解を求める事ができる点にあります:

1 s a g e : f i n d _ r o o t ( tan ( x )==8 - x ^3 , -10 ,10)

2 2 . 1 2 6 1 6 8 9 0 4 4 8 3 1 9 9 3

ただ,解付近の振る舞いが非常に悪い関数関数では,それほど正確な答えが出ないこともあります:

1 s a g e : f i n d _ r o o t ( x ^400 , -5 ,5)

2 0 . 1 3 1 5 5 6 1 9 7 2 3 5 6 5 8 7 6

もちろん上の方程式の解はx= 0のみです。これは数値解を求めるときにNewton法という方法を用いてい るためで,この方法では微分係数が非常に小さくなる点の付近では近似の精度が悪くなります。

右極限と左極限の指定は次の様にします:

1 s a g e : l i m i t (1/ x , x =0 , dir = ’+ ’) # 右 極 限

2 + I n f i n i t y # 正 の 無 限 大

3 s a g e : l i m i t (1/ x , x =0 , dir = ’ - ’) # 左 極 限

4 - I n f i n i t y # 負 の 無 限 大

43 SAGEによる微分と積分

そして左極限と右極限が一致しないのですが 1 s a g e : l i m i t (1/ x , x =0)

2 I n f i n i t y

となるので,Infinityは必ずしも+を意味していないことがわかります。

さて次に極限

xlim0xa (8)

を求めることを考えてみます。これが定まるかどうかはaの値に依存します。このようなとき,assumeに よってaの性質を指定すると解決する場合があります。

以下の命令を,一回実行するごとにRestart worksheetを繰り返しながら実行してみよう:

1 var (’ a ’)

2 l i m i t ( x ^ a , x =0)

実行結果の例 Traceback (click to the left of this block for traceback)

...

Is a positive, negative, or zero? #aの値を聞いてくる

そこでa >0と仮定します 1 var (’ a ’)

2 a s s u m e ( a >0) # a >0と 仮 定 す る 3 l i m i t ( x ^ a , x =0)

実行結果の例 Traceback (click to the left of this block for traceback)

...

Is a an integer? #まだ値は定まらない。

そして右極限を指定すると求まります:

1 var (’ a ’); a s s u m e ( a >0)

2 l i m i t ( x ^ a , x =0 , dir=’ + ’) # 右 極 限

実行結果の例 0

またaが偶数であると指定しても極限は求まります:

1 var (’ a ’);

2 a s s u m e ( a ,’ e v e n ’) 3 l i m i t ( x ^ a , x =0)

実行結果の例 0

43 Sage による微分と積分

関数f(x)の微分は次で行います:

関数f(x)の微分

1 di f f ( f , x ) ま た は d e r i v a t i v e ( f , x ) ま た は f . d e r i v a t i v e ( x ) 関数fのxについての微分。

例:

1 s a g e : d i f f ( sin ( x ) , x )

2 cos ( x )

Sageによる不定積分は次の命令で行います:

関数f(x)の不定積分

f(x)dx

1 i n t e g r a l ( f ( x ) , x ) ま た は i n t e g r a t e ( f ( x ) , x )

代数的に計算され,結果は厳密です。ただし出力結果に積分定数はありません

例:

1 s a g e : i n t e g r a l ( sin ( x ) , x )

2 - cos ( x )

3 s a g e : i n t e g r a l ( x ^4)

4 1 / 5 * x ^5

5 s a g e : i n t e g r a l (1/(1 - x ^ 3 ) )

6 1 / 3 * s q r t ( 3 ) * a r c t a n ( 1 / 3 * ( 2 * x + 1)* s q r t ( 3 ) ) - 1 / 3 * log ( x - 1)

7 + 1 / 6 * log ( x ^2 + x + 1)

もちろん,いつでも原始関数が求まるわけではありません:

1 s a g e : i n t e g r a l ( sin ( x )/ log ( x ) , x )

2 -( log ( x )* i n t e g r a t e ( cos ( x )/( x * log ( x )^2) , x ) + cos ( x ))/ log ( x )

被積分関数に他の変数が混じっている場合は次のように,変数の宣言をしてから積分の命令を実行します:

1 a = var (’ a ’)

2 i n t e g r a l ( cos ( a * x ) , x )

実行結果の例 sin(a*x)/a

関数f(x)の定積分

b a

f(x)dx

xの関数fの定積分は

1 i n t e g r a l ( f , x , a , b ) ま た は i n t e g r a l ( f ,( x , a , b )) ま た は f . i n t e g r a l ( x , a , b )

integralのかわりにintegrateを使っても結果は同じです。

例:

1 s a g e : i n t e g r a l ( x ^2 , x ,0 ,2)

43.1 不定積分はできないけど定積分なら出来る場合 43 SAGEによる微分と積分

2 8/3

43.1 不定積分はできないけど定積分なら出来る場合

定積分は求まらないが,不定積分の厳密値なら得られる場合があります。たとえば(1−x4)1/2の原始関

数はintegralでは求まりませんが,定積分∫1

0(1−x4)1/2dxは求まります。次を実行してみましょう:

1 var (’ x ’)

2 ans = i n t e g r a t e (1/ s q r t ((1 - x ^4)) ,0 ,1) # 積 分 値 をa n sと す る

3 p r i n t ans # a n sを プ リ ン ト

4 p r i n t n ( ans ) # a n sの 数 値 を プ リ ン ト

実行結果の例 1/4*beta(1/4, 1/2)

1.31102877714606

ここでbetaはベータ関数

β(x, y) =

1 0

tx1(1−t)y1dt

です。Sage4*ではベータ関数はデフォルトでサポートされていなかったので数値を得るためにはMaximaを

呼び出す必要がありましたが,Sage5 からはサポートされて手軽に扱えるようになりました。

ドキュメント内 if if-else if-elif-else (ページ 100-103)