== maximaの初歩的な操作18 ==
・・・1階常微分方程式・・・

○Xmaxima,wxMaxima のインストール方法,基本操作については[この頁]参照
○wxmaximaを起動すると,初めは入力行も何もないので,とりあえず「何かキーを押します:例えばEnterキーを押す」と入力行が現れます.
○wxmaximaでは,入力行の末尾でShift+Enterを押します.

○wxMaximaで1階または2階の常微分方程式の一般解を求めるには,
(1) ode2( )関数を使う方法
ordinary differential equation of 1st and 2nd order
(2) ラプラス変換を使ってdesolve( )関数で解く方法
があります.この頁では(1)のode2( )関数を使う方法を扱います.
1階微分方程式では積分定数は%cで表され,
2階微分方程式では積分定数は%k1 , %k2で表されます.
○wxmaximaで,
1階微分方程式で初期条件に対応する特殊解を求めるにはic1( )関数が,
initial value problems for 1st order differential equations
2階微分方程式で初期条件に対応する特殊解を求めるにはic2( )関数が
initial value problems for 2nd order differential equations
使えます.

※微分方程式の厳密解は求め方が知られていない場合や,解けても特殊関数の複雑な組合せとなる場合があります.
wxmaximaのヘルプ情報(英文)によれば,
1階常微分方程式については,
線形,変数分離形,同次形,完全微分形,ベルヌーイ形などが試され,解けなければfalseが返される
とされています.
2階常微分方程式については,
定数係数,定数係数に変換できる同次線形,オイラーの微分方程式,定数変化法によって解けるもの,2つの1階微分方程式に分けられるものなどが試されます.解けなければfalseが返される
 級数を用いた解については,このような制限はあまりないがこの頁では扱いません.
≪頭の片隅に!≫
 厳密解・・・有限回の代数的変形や積分操作によって得られる解・・・は,コンピュータでも求められない場合がある.(変数変換のアイデア次第で解ける問題は,人の方が強い場合がある)

 解き方の分かっている問題に当てめる場合や,理論上無限回(実際上は巨大な回数)の操作を用いる級数解や数値解を求める場合コンピュータの方が強い.

 
■1階常微分方程式
≪例1≫
【微分方程式】

【wxMaximaでの入力】
ode2( 'diff(y , x)=x^2*y^2 , y , x);
【出力される結果】
…(*)
【補足説明】
○関数ode2( )の引数は
ode2( 微分方程式 , 従属変数 , 独立変数);
の順に指定します.
メニューから対話型メニューで行うには,「方程式」→「微分方程式を解く」と進んで,上記の引数3個を書き込みます.
○その場合において,注意すべきこととして導関数を表す記号diff(y , x)にはシングルクォートを付けて'diff(y , x)と書きます.(単にdiff(y , x)と書くと,この文脈の中では文字yを文字xで(偏)微分した0に変わります.ここでは,この式自体を生かしたいので,名詞化処理処理としてシングルクォートを付けるようです.)
 次のように,xの関数であることを明示して使う場合には,シングルクォートを付けても付けなくても同じ結果が得られます.
ode2( diff(f(x),x)=x^2*f(x)^2 , f(x) , x);

○微分方程式の部分で等号を省略して単に式を指定した場合は,=0が省略されたものとみなされます.(右辺=0)

diff( )の第3引数の1を省略すれば,第1次導関数を表しますが,第2次導関数を表す場合はdiff(y , x , 2 )のように第3引数を2にします.

○この一般解は,次のようにyについて解かれた形に直せます.


○一般解(*)のうちで,与えられた初期条件「x=0のときy=−3」を満たす特殊解を求めるには,
ic1( 一般解 , x=0 , y=−3);
とします.
になります.

 このように,先に一般解を求めてから,続いてある初期条件を満たす特殊解を求めるには,一般解の式に名前を付けておいて後でそれを引用するとよいので,上記の一般解を求めるコマンドを
siki1 : ode2( 'diff(y , x)=x^2*y^2 , y , x);
などとしておいてから
ic1( siki1 , x=0 , y=−3);
とすればよいことになります.
 Maximaでは単に%と書けば直前の出力式を表すことになっているので,一般解を求めた直後に初期条件を加える場合には,式にな名前がなくても
ic1( % , x=0 , y=−3);
でできます.
メニューから対話型メニューで行うには,「方程式」→「特殊解を求める(1階微分方程式)」と進んで,上記の引数3個を書き込みます.

≪例2≫
【微分方程式】

のとき
【wxMaximaでの入力】
siki2 : ode2(x*'diff(y,x)+2*y=%e^x , y , x);
ic1(siki2,x=1,y=0);
【出力される結果】

Maximaでは積分定数は%cで表わし,自然対数は%eで表します


≪例3≫
【微分方程式】

のとき
【wxMaximaでの入力】
不定積分の結果として対数が登場するときに,その真数に絶対値を付けるには,あらかじめ変数logabsのプロパティをtrueにしておきます
logabs : true; …(1)
siki3 : ode2((1-x^2)*'diff(y,x)+x*y=2*x, y, x); …(2)
累乗根(radicals),指数関数,対数関数が含まれる式を標準的な(canonical )式に直すには,関数radcan( )を実行します.
siki4 : radcan(siki3); …(3)
ic1(siki4 , x=0 , y=1); …(4)
【補足説明】
○この微分方程式の解が対数関数を含む式になるということは,やってから分かることで,やってみないと分かりません.だから,(2)よりも先に(1)を実行しておくというのは実際には無理です.まず(2)を実行して対数関数が登場するのを見届けたら,(1)を実行してからもう一度(2)をやり直すことになります.

 この煩わしさを避けるには,
siki3 : ode2((1-x^2)*'diff(y,x)+x*y=2*x, y, x) , logabs; …(2’)
 のようにカンマで区切ってlogabsを続けて実行するとよいでしょう.(この場合,logabsの値はこのコマンドを実行するとき trueとなり,以後の設定に影響しません・・・とはいえ,logが登場するかどうかが,やってみないと分からなければ,少し違うだけとも言えますが)

○(3)について
 例えばのように累乗根,指数関数,対数関数の組合せによってはもっと簡単な表現式がある場合に,式を簡単にする関数です.
 この関数は,メニューから「式の変形」→「関数の整理」と進んでも実行することができます.
【出力される結果】
(2)→
Maximaでは積分定数は%cで表わし,自然対数は%eで表します
(3)→
(4)→

≪例4≫
【微分方程式】

【wxMaximaでの入力】
ode2((x+y)^2*'diff(y,x)=1 , y , x); …(*)
【出力される結果】
false
【補足説明】
 未知関数yやその導関数y’の積などが登場する非線形微分方程式をそのままコンピュータにかけても厳密解が求まらないことがあります.このような場合でも,何らかの変数変換を行えば解けることがあります.
⇒ [コンピュータが働くように変形する]
とおくと



は変数分離形→解ける
【wxMaximaでの入力】
ode2(t^2*('diff(t,x)-1)=1, t, x); …(**)
【出力される結果】

変数を元に戻すと
…(答)



 
その他:1階常微分方程式の例と結果
○≪変数分離形は解ける…非線形でも可≫
○微分方程式
wxMaximaでの入力
出力される結果(および備考)
ode2( 'diff(y,x)=x*y/(1+2*x^2) , y , x);

radcan(%);を実行することにより

ode2( 'diff(y,x)-%e^x*y=2*%e^(2*x) , y , x);

radcan(%);を実行することにより

ode2( 'diff(y,x)=(x-a)*(y-p)/((x-b)*(y-q)) , y , x);

 
○≪同次形(の形になるもの)は解ける…非線形でも可≫
○微分方程式
wxMaximaでの入力
出力される結果(および備考)

ode2(x*'diff(y,x)=x+y , y , x);

この解には対数関数が登場するので,既に述べた内容を踏まえると,あらかじめlogabs : true;を実行しておくべしとなるが,なぜか?そうすると解け切らずに

などという結果が表示されます.
 期待される答は,であるはずだが?

ode2(x^2+y^2=2*x*y*'diff(y,x) , y , x);

ode2((2*x*y-x^2)*'diff(y,x)+y^2-2*x*y=0 , y , x);
 
○≪線形微分方程式(の形)は解ける≫
○微分方程式
wxMaximaでの入力
出力される結果(および備考)

ode2( 'diff(y,x)-2*y=%e^(5*x) , y , x);

式の展開expand(%);を実行すれば

ode2( 'diff(y,x)+y=cos(x) , y , x);

式の展開expand(%);を実行すれば

ode2((%e^y-x)*'diff(y,x)=y , y , x);

元の微分方程式は線形微分方程式とは言えないが,独立変数と従属変数を逆にすると

の形になるので(少し計算すれば分かる),xyの関数として線形微分方程式で表されることになる.このように立場を変えれば解ける問題は自動的に試されるようです.
 
○≪完全微分形(の形)は解ける≫
○微分方程式
wxMaximaでの入力
出力される結果(および備考)

ode2(2*x+y+x*'diff(y,x)=0 , y, x);

微分形式dx ,dyのままode2()関数に記入するのは無理なようなので,

の形で方程式を解きます.
 この方程式はとおくと

が成り立つので完全微分形になっており,が一般解です.wxMaximaから得られた解を少し変形すればこの式になります.
 ただし,この問題は同次形ともいえるのでMaximaが同次形を解く手順で解いている可能性があります.

ode2(y*%e^x+(%e^x-cos(y))*'diff(y,x)=0 , y , x);

微分形式dx ,dyのままode2()関数に記入するのは無理なようなので,

の形で方程式を解きます.
この方程式はとおくと

が成り立つので完全微分形になっており,が一般解です.
 
○≪全微分方程式で積分因子の発見を要する問題は,解ける場合と解けない場合がある≫
○微分方程式
wxMaximaでの入力
出力される結果(および備考)

ode2(x^2+2*x-y^2-2*y*'diff(y,x)=0 , y , x);

 この方程式はとおくと


が成り立つので積分因子を掛ければ完全微分形になります.
この問題では,積分因子M(x,y)xだけの関数である場合に,Maximaがこれを見つけて解けます.

ode2(y*%e^x+(%e^x-cos(y))*'diff(y,x)=0 , y , x);

 この方程式はとおくと


が成り立つので積分因子を掛ければ完全微分形になります.
この問題では,積分因子M(x,y)yだけの関数である場合に,Maximaがこれを見つけて解けます.

ode2(x^2*y^2-y+(x^2*y^2-x)*'diff(y,x)=0 , y , x);

 この方程式はとおくと


が成り立つので積分因子を掛ければ完全微分形になります.
しかし,この問題では積分因子M(x,y)xyの関数である場合に,Maximaがこれを見つけて解くことはできません.
ode2(1/(x^2*y^2)*(x^2*y^2-y)+1/(x^2*y^2)*(x^2*y^2-x)*'diff(y,x)=0
, y , x);
の形に変形すれば,次の解が得られます.

ode2(y*(x*y+1)+x*(6*x*y-4)*'diff(y,x)=0 , y , x);
radcan(%);を実行することにより
 この解は少し変形すると
と書けます.

 この方程式を全微分方程式として解くには,積分因子を見つける必要がありますが,この問題では積分因子M(x,y)x,yの関数である場合でも,Maximaがこれを見つけて解くことができます.
 
○≪ベルヌーイ形(の形)は解ける≫
○微分方程式
wxMaximaでの入力
出力される結果(および備考)

ode2( 'diff(y,x)+y/2=y^3*cos(x) , y , x);

この解は変形して次の形に書くことができます


ode2(2*x*y^2*'diff(y,x)-y^3+x=0 , y , x);

この解は変形して次の形に書くことができます

 
○≪変数変換によって既知の形に直す問題は,解ける場合と解けない場合がある≫
○微分方程式
wxMaximaでの入力
出力される結果(および備考)

ode2((2*x-y+1)*'diff(y,x)=4*x-2*y+3 , y , x);


この問題はとおくと,変数分離形になり


ですが,maximaはこの変形を見つけるようです.

ode2((x-y)^2*'diff(y,x)=1 , y , x);

この問題はとおくと,変数分離形になり

ですが,maximaはこの変形を見つけられないようです.

...(携帯版)メニューに戻る

...(PC版)メニューに戻る