Next: descriptive, Previous: cobyla [Contents][Index]
Next: Functions and Variables for contrib_ode, Previous: contrib_ode, Up: contrib_ode [Contents][Index]
Maximaの常微分方程式(ODE)ソルバode2
は
一階と二階の初等線形ODEを解きます。
関数contrib_ode
は
線形と非線形一階ODEと線形斉次二階ODEに関する追加の方法で
ode2
を拡張します。
コードは、まだ開発中で、コールの順序は将来のリリースで変わるかもしれません。
一旦コードが安定化したら、投稿ディレクトリから移して、Maximaに統合されるかもしれません。
このパッケージは、
使用前に
コマンドload("contrib_ode")
でロードしなければいけません。
contrib_ode
のコール取り決めは
ode2
と同一です。
3つの引数を取ります:
ODE (右辺が0なら左辺だけでもいいです)、
従属変数、独立変数。
成功した時、解のリストを返します。
解の形式は
ode2
と異なります。
非線形方程式は複数解を持つので、
contrib_ode
は解のリストを返します。
解それぞれは複数の形式を持ちます:
%t
を使ったパラメトリック解、または、
%u
に関する別のODEへの変換
%c
は
一階方程式の積分定数を表すのに使われます。
%k1
と%k2
は
二階方程式の定数を表すのに使われます。
もしcontrib_ode
が
いかなる理由でも解を得られないなら、
たぶんエラーメッセージを印字した後、
false
を返します。
一階非線形ODEは複数解を持ち得るので、 解のリストを返す必要があります。 例えば:
(%i1) load("contrib_ode")$ (%i2) eqn:x*'diff(y,x)^2-(1+x*y)*'diff(y,x)+y=0; dy 2 dy (%o2) x (--) - (x y + 1) -- + y = 0 dx dx (%i3) contrib_ode(eqn,y,x); x (%o3) [y = log(x) + %c, y = %c %e ] (%i4) method; (%o4) factor
以下の例の二番目の解のように、 非線形ODEは積分定数を持たない特異解を持ち得ます:
(%i1) load("contrib_ode")$ (%i2) eqn:'diff(y,x)^2+x*'diff(y,x)-y=0; dy 2 dy (%o2) (--) + x -- - y = 0 dx dx (%i3) contrib_ode(eqn,y,x); 2 2 x (%o3) [y = %c x + %c , y = - --] 4 (%i4) method; (%o4) clairault
以下のODEは
ダミー変数%t
を使った
2つのパラメトリック解を持ちます。
この場合、パラメトリック解を操作して、陽解を与えることができます。
(%i1) load("contrib_ode")$ (%i2) eqn:'diff(y,x)=(x+y)^2; dy 2 (%o2) -- = (y + x) dx (%i3) contrib_ode(eqn,y,x); (%o3) [[x = %c - atan(sqrt(%t)), y = - x - sqrt(%t)], [x = atan(sqrt(%t)) + %c, y = sqrt(%t) - x]] (%i4) method; (%o4) lagrange
以下の例(Kamke 1.112)は、陰解を例示します。
(%i1) load("contrib_ode")$ (%i2) assume(x>0,y>0); (%o2) [x > 0, y > 0] (%i3) eqn:x*'diff(y,x)-x*sqrt(y^2+x^2)-y; dy 2 2 (%o3) x -- - x sqrt(y + x ) - y dx (%i4) contrib_ode(eqn,y,x); y (%o4) [x - asinh(-) = %c] x (%i5) method; (%o5) lie
以下のRiccati方程式は
変数%u
に関する線形二階ODEに変換されます。
Maximaは
新しいODEを解くことができません。
だから、未評価で返されます。
(%i1) load("contrib_ode")$ (%i2) eqn:x^2*'diff(y,x)=a+b*x^n+c*x^2*y^2; 2 dy 2 2 n (%o2) x -- = c x y + b x + a dx (%i3) contrib_ode(eqn,y,x); d%u --- 2 dx 2 n - 2 a d %u (%o3) [[y = - ----, %u c (b x + --) + ---- c = 0]] %u c 2 2 x dx (%i4) method; (%o4) riccati
一階ODEに対して、contrib_ode
はode2
をコールします。
その後、以下の方法を試します:
因数分解、Clairault, Lagrange, Riccati,
Abel, Lie対称性を使った方法
もしAbel方法が失敗したら、
Lie方法はAbel方程式には試みられませんが、
もしRiccati方法が未解決二階ODEを返したら、
Lie方法が試みられます。
二階ODEに対して、contrib_ode
はode2
をコールし、その後odelin
をコールします。
もしコマンド
put('contrib_ode,true,'verbose)
が実行されたら、
長いデバッグトレースとメッセージが表示されます。
Next: Possible improvements to contrib_ode, Previous: Introduction to contrib_ode, Up: contrib_ode [Contents][Index]
独立変数xと従属変数yに関するODE eqnの解のリストを返します。
odelin
は
独立変数xと従属変数yに関する
一階および二階線形斉次ODEを解きます。
ODEの基本的な解一式を返します。
二階ODEに対して、odelin
は、
与えられた特殊関数を使って解を探索する
BronsteinとLafailleによる方法
を使います。
(%i1) load("contrib_ode"); (%i2) odelin(x*(x+1)*'diff(y,x,2)+(x+5)*'diff(y,x,1)+(-4)*y,y,x); ...trying factor method ...solving 7 equations in 4 variables ...trying the Bessel solver ...solving 1 equations in 2 variables ...trying the F01 solver ...solving 1 equations in 3 variables ...trying the spherodial wave solver ...solving 1 equations in 4 variables ...trying the square root Bessel solver ...solving 1 equations in 2 variables ...trying the 2F1 solver ...solving 9 equations in 5 variables gauss_a(- 6, - 2, - 3, - x) gauss_b(- 6, - 2, - 3, - x) (%o2) {---------------------------, ---------------------------} 4 4 x x
可能な解solnを代入した後、 ODE eqnの値を返します。 もしsolnがeqnの解なら 値はゼロと同値です。
(%i1) load("contrib_ode")$ (%i2) eqn:'diff(y,x,2)+(a*x+b)*y; 2 d y (%o2) --- + (a x + b) y 2 dx (%i3) ans:[y = bessel_y(1/3,2*(a*x+b)^(3/2)/(3*a))*%k2*sqrt(a*x+b) +bessel_j(1/3,2*(a*x+b)^(3/2)/(3*a))*%k1*sqrt(a*x+b)]; 3/2 1 2 (a x + b) (%o3) [y = bessel_y(-, --------------) %k2 sqrt(a x + b) 3 3 a 3/2 1 2 (a x + b) + bessel_j(-, --------------) %k1 sqrt(a x + b)] 3 3 a (%i4) ode_check(eqn,ans[1]); (%o4) 0
変数method
は成功した解法に設定されます。
%c
は一階ODEの積分定数です。
%k1
は二階ODEの最初の積分定数です。
%k2
は二階ODEの二番目の積分定数です。
gauss_a(a,b,c,x)
とgauss_b(a,b,c,x)
は2F1幾何関数です。
それらは超幾何微分方程式
x(1-x) diff(y,x,2) + [c-(a+b+1)x diff(y,x) - aby = 0
の任意の2つの独立解を表します(A&S 15.5.1)。
これらの関数は
odelin
とcontrib_ode
が返すODEの解の中でだけ使われます。
これらの関数の定義と使用はMaimaの将来のリリースで変わるかもしれません。
gauss_b
, dgauss_a
, gauss_b
も参照してください。
See gauss_a
.
gauss_a(a, b, c, x)
のxに関する導関数。
gauss_b(a, b, c, x)
のxに関する導関数。
Abramowitz and Stegun, Handbook of Mathematical Functions, Section 13.1.2の中で定義される KummerのM関数
この関数は
odelin
とcontrib_ode
が返すODEの解の中でだけ使われます。
この関数の定義と使用はMaimaの将来のリリースで変わるかもしれません。
kummer_u
, dkummer_m
, dkummer_u
も参照してください。
Abramowitz and Stegun, Handbook of Mathematical Functions, Section 13.1.3の中で定義される KummerのU関数
kummer_m
を参照してください。
kummer_m(a, b, x)
のxに関する導関数。
kummer_u(a, b, x)
のxに関する導関数。
Next: Test cases for contrib_ode, Previous: Functions and Variables for contrib_ode, Up: contrib_ode [Contents][Index]
これらのルーチンは開発進行中です。まだ以下をする必要があります:
ode1_factor
を多重根で機能するように拡張すること。
ode1_factor
を
より高次因子を解こうとするように拡張すること。
現在、線形因子を解こうとするだけです。
ode1_lagrange
を複素根より実根を優先するように直すこと。
ode1_lie
に関する仕事。
2,3の相当な問題があります:
いくつかの部分が未実装です;
いくつかのテストケースが無限ループのようです;
他のテストケースではクラッシュします;
さらに他では非常に複雑な「解」を返します。
本当にリリースの準備ができていたか疑っています。
Next: References for contrib_ode, Previous: Possible improvements to contrib_ode, Up: contrib_ode [Contents][Index]
Murphy, Kamke, Zwillingerと他で ルーチンはおおよそ千のテストケース上でテストされています。 これらはテストサブディレクトリに含まれています。
ode1_clairault
は、
特異解を含み、
MurphyとKamkeの中のClairault方程式の
知られている解すべてを見つけます。
ode1_lie
の「解」のいくつかは過度に複雑でチェックが不可能です。
Previous: Test cases for contrib_ode, Up: contrib_ode [Contents][Index]
Next: descriptive, Previous: cobyla [Contents][Index]