contrib_ode (Maxima 5.50.0 Manual)

## 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`と同一です。 ３つの引数を取ります: 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`を使った ２つのパラメトリック解を持ちます。 この場合、パラメトリック解を操作して、陽解を与えることができます。

    (%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)`が実行されたら、 長いデバッグトレースとメッセージが表示されます。

Differential equations · Share packages · Package contrib_ode ·

### 44.2 Functions and Variables for contrib_ode ¶

関数: contrib_ode (eqn, y, x) ¶

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

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

  Package contrib_ode ·

関数: ode_check (eqn, soln) ¶

  可能な解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

  Package contrib_ode ·

システム変数: method ¶

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

  Package contrib_ode ·

変数: %c ¶

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

  Package contrib_ode ·

変数: %k1 ¶

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

  Package contrib_ode ·

変数: %k2 ¶

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

  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` の任意の２つの独立解を表します(A&S 15.5.1)。

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

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

  Package contrib_ode ·

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

  See `gauss_a`.

  Package contrib_ode ·

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

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

  Package contrib_ode ·

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

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

  Package contrib_ode ·

関数: kummer_m (a, b, 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`も参照してください。

  Package contrib_ode ·

関数: kummer_u (a, b, x) ¶

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

  `kummer_m`を参照してください。

  Package contrib_ode ·

関数: dkummer_m (a, b, x) ¶

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

  Package contrib_ode ·

関数: dkummer_u (a, b, x) ¶

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

  Package contrib_ode ·

### 44.3 Possible improvements to contrib_ode ¶

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

- FACTOR方法`ode1_factor`を多重根で機能するように拡張すること。
- FACTOR方法`ode1_factor`を より高次因子を解こうとするように拡張すること。 現在、線形因子を解こうとするだけです。
- LAGRANGEルーチン`ode1_lagrange`を複素根より実根を優先するように直すこと。
- Riccati方程式のための他の方法を追加すること。
- 第二種Abel方程式の検出を改善すること。 今のパターンマッチングは弱いです。
- Work on the Lie対称群ルーチン`ode1_lie`に関する仕事。 2,3の相当な問題があります: いくつかの部分が未実装です; いくつかのテストケースが無限ループのようです; 他のテストケースではクラッシュします; さらに他では非常に複雑な「解」を返します。 本当にリリースの準備ができていたか疑っています。
- もっとテストケースを追加すること。

### 44.4 Test cases for contrib_ode ¶

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

- The Clairaultルーチン`ode1_clairault`は、 特異解を含み、 MurphyとKamkeの中のClairault方程式の 知られている解すべてを見つけます。
- 他のルーチンは、多重解が存在する時に しばしば単一界を返します。
- `ode1_lie`の「解」のいくつかは過度に複雑でチェックが不可能です。
- いくつかのクラッシュがあります。

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