Next: , Previous:   [Contents][Index]

44 contrib_ode


44.1 Introduction to contrib_ode

Maximaの常微分方程式(ODE)ソルバode2は 一階と二階の初等線形ODEを解きます。 関数contrib_odeは 線形と非線形一階ODEと線形斉次二階ODEに関する追加の方法で ode2を拡張します。 コードは、まだ開発中で、コールの順序は将来のリリースで変わるかもしれません。 一旦コードが安定化したら、投稿ディレクトリから移して、Maximaに統合されるかもしれません。

このパッケージは、 使用前に コマンドload("contrib_ode")でロードしなければいけません。

contrib_odeのコール取り決めは ode2と同一です。 3つの引数を取ります: ODE (右辺が0なら左辺だけでもいいです)、 従属変数、独立変数。 成功した時、解のリストを返します。

解の形式は ode2と異なります。 非線形方程式は複数解を持つので、 contrib_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_odeode2をコールします。 その後、以下の方法を試します: 因数分解、Clairault, Lagrange, Riccati, Abel, Lie対称性を使った方法 もしAbel方法が失敗したら、 Lie方法はAbel方程式には試みられませんが、 もしRiccati方法が未解決二階ODEを返したら、 Lie方法が試みられます。

二階ODEに対して、contrib_odeode2をコールし、その後odelinをコールします。

もしコマンド put('contrib_ode,true,'verbose)が実行されたら、 長いデバッグトレースとメッセージが表示されます。


44.2 Functions and Variables for contrib_ode

関数: contrib_ode (eqn, y, x)

独立変数xと従属変数yに関するODE eqnの解のリストを返します。

関数: odelin (eqn, y, x)

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

関数: ode_check (eqn, soln)

可能な解solnを代入した後、 ODE eqnの値を返します。 もしsolneqnの解なら 値はゼロと同値です。

(%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

変数methodは成功した解法に設定されます。

変数: %c

%cは一階ODEの積分定数です。

変数: %k1

%k1は二階ODEの最初の積分定数です。

変数: %k2

%k2は二階ODEの二番目の積分定数です。

関数: gauss_a (a, b, c, x)

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)。

これらの関数は odelincontrib_odeが返すODEの解の中でだけ使われます。 これらの関数の定義と使用はMaimaの将来のリリースで変わるかもしれません。

gauss_b, dgauss_a, gauss_bも参照してください。

関数: gauss_b (a, b, c, x)

See gauss_a.

関数: dgauss_a (a, b, c, x)

gauss_a(a, b, c, x)xに関する導関数。

関数: dgauss_b (a, b, c, x)

gauss_b(a, b, c, x)xに関する導関数。

関数: kummer_m (a, b, x)

Abramowitz and Stegun, Handbook of Mathematical Functions, Section 13.1.2の中で定義される KummerのM関数

この関数は odelincontrib_odeが返すODEの解の中でだけ使われます。 この関数の定義と使用はMaimaの将来のリリースで変わるかもしれません。

kummer_u, dkummer_m, dkummer_uも参照してください。

関数: kummer_u (a, b, x)

Abramowitz and Stegun, Handbook of Mathematical Functions, Section 13.1.3の中で定義される KummerのU関数

kummer_mを参照してください。

関数: dkummer_m (a, b, x)

kummer_m(a, b, x)xに関する導関数。

関数: dkummer_u (a, b, x)

kummer_u(a, b, x)xに関する導関数。


44.3 Possible improvements to contrib_ode

これらのルーチンは開発進行中です。まだ以下をする必要があります:


44.4 Test cases for contrib_ode

Murphy, Kamke, Zwillingerと他で ルーチンはおおよそ千のテストケース上でテストされています。 これらはテストサブディレクトリに含まれています。


44.5 References for contrib_ode

  1. E. Kamke, Differentialgleichungen Losungsmethoden und Losungen, Vol 1, Geest & Portig, Leipzig, 1961
  2. G. M. Murphy, Ordinary Differential Equations and Their Solutions, Van Nostrand, New York, 1960
  3. D. Zwillinger, Handbook of Differential Equations, 3rd edition, Academic Press, 1998
  4. F. Schwarz, Symmetry Analysis of Abel’s Equation, Studies in Applied Mathematics, 100:269-294 (1998)
  5. F. Schwarz, Algorithmic Solution of Abel’s Equation, Computing 61, 39-49 (1998)
  6. E. S. Cheb-Terrab, A. D. Roche, Symmetries and First Order ODE Patterns, Computer Physics Communications 113 (1998), p 239. (http://lie.uwaterloo.ca/papers/ode_vii.pdf)
  7. E. S. Cheb-Terrab, T. Kolokolnikov, First Order ODEs, Symmetries and Linear Transformations, European Journal of Applied Mathematics, Vol. 14, No. 2, pp. 231-246 (2003). (http://arxiv.org/abs/math-ph/0007023,
    http://lie.uwaterloo.ca/papers/ode_iv.pdf)
  8. G. W. Bluman, S. C. Anco, Symmetry and Integration Methods for Differential Equations, Springer, (2002)
  9. M. Bronstein, S. Lafaille, Solutions of linear ordinary differential equations in terms of special functions, Proceedings of ISSAC 2002, Lille, ACM Press, 23-28. (http://www-sop.inria.fr/cafe/Manuel.Bronstein/publications/issac2002.pdf)

Next: , Previous:   [Contents][Index]