[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

49. contrib_ode


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

49.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 (--)  - (1 + x y) -- + y = 0
                    dx               dx
(%i3) contrib_ode(eqn,y,x);
                    dy 2             dy
(%t3)            x (--)  - (1 + x y) -- + y = 0
                    dx               dx

              first order equation not linear in y'

                                             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);
                       dy 2     dy
(%t3)                 (--)  + x -- - y = 0
                       dx       dx

              first order equation not linear in y'

                                           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)                     -- = (x + y)
                          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  a       n - 2    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)を実行したら 長いデバッグトレースとメッセージが表示されます。

Categories:  Differential equations · Share packages · Package contrib_ode


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

49.2 Functions and Variables for contrib_ode

関数: contrib_ode (eqn, y, x)

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

Categories:  Package contrib_ode

関数: 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);
       gauss_a(- 6, - 2, - 3, - x)  gauss_b(- 6, - 2, - 3, - x)
(%o2) {---------------------------, ---------------------------}
                    4                            4
                   x                            x

Categories:  Package contrib_ode

関数: 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)                   --- + (b + a x) 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 (b + a x)
(%o3) [y = bessel_y(-, --------------) %k2 sqrt(a x + b)
                    3       3 a
                                          3/2
                            1  2 (b + a x)
                 + bessel_j(-, --------------) %k1 sqrt(a x + b)]
                            3       3 a
(%i4) ode_check(eqn,ans[1]);
(%o4)                           0

Categories:  Package contrib_ode

システム変数: method

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

Categories:  Package contrib_ode

変数: %c

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

Categories:  Package contrib_ode

変数: %k1

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

Categories:  Package contrib_ode

変数: %k2

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

Categories:  Package contrib_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も参照してください。

Categories:  Package contrib_ode

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

gauss_aを参照してください。

Categories:  Package contrib_ode

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

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

Categories:  Package contrib_ode

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

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

Categories:  Package contrib_ode

関数: 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も参照してください。

Categories:  Package contrib_ode

関数: kummer_u (a, b, x)

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

kummer_mを参照してください。

Categories:  Package contrib_ode

関数: dkummer_m (a, b, x)

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

Categories:  Package contrib_ode

関数: dkummer_u (a, b, x)

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

Categories:  Package contrib_ode

関数: bessel_simplify (expr)

Bessel関数 bessel_j, bessel_y, bessel_i, bessel_k, hankel_1, hankel_2, strauve_h, strauve_lを含む式を整理します。 最高次数 nの関数を次数 n-1と n-2の関数で置き換えるのに (Abramowitz and Stegun, Handbook of Mathematical Functions, 9.1.27節に与えられる) 漸化式を使います。

すべての次数の差が2より小さくなるまでこのプレセスを繰り返します。

 
(%i1) load('contrib_ode)$
(%i2) bessel_simplify(4*bessel_j(n,x^2)*(x^2-n^2/x^2)
  +x*((bessel_j(n-2,x^2)-bessel_j(n,x^2))*x
  -(bessel_j(n,x^2)-bessel_j(n+2,x^2))*x)
  -2*bessel_j(n+1,x^2)+2*bessel_j(n-1,x^2));
(%o2)                           0
(%i3) bessel_simplify(-2*bessel_j(1,z)*z^3-10*bessel_j(2,z)*z^2
 +15*%pi*bessel_j(1,z)*struve_h(3,z)*z-15*%pi*struve_h(1,z)*bessel_j(3,z)*z
 -15*%pi*bessel_j(0,z)*struve_h(2,z)*z+15*%pi*struve_h(0,z)*bessel_j(2,z)*z
 -30*%pi*bessel_j(1,z)*struve_h(2,z)+30*%pi*struve_h(1,z)*bessel_j(2,z));
(%o3)                           0

関数: expintegral_e_simplify (expr)

漸化式 (A&S 5.1.14)を使って指数積分 expintegral_eを含む式を整理します。

expintegral_e(n+1,z) = (1/n) * (exp(-z)-z*expintegral_e(n,z)) n = 1,2,3 ....


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

49.3 Possible improvements to contrib_ode

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


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

49.4 Test cases for contrib_ode

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


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

49.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)


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by 市川雄二 on February, 2 2019 using texi2html 1.76.