[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

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

·

Categories: Differential equations ·Share packages ·Package contrib_ode

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

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

  ·

  Categories: 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

  ·

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

  これらの関数は `odelin`と `contrib_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関数

  この関数は `odelin`と `contrib_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

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 44.3 Possible improvements to contrib_ode

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

- FACTOR方法 `ode1_factor`を多重根で機能するように拡張すること。
- FACTOR方法 `ode1_factor`をより高次因子を解こうとするように拡張すること。 現在、線形因子を解こうとするだけです。
- LAGRANGEルーチン `ode1_lagrange`を複素根より実根を優先するように直すこと。
- Riccati方程式のための他の方法を追加すること。
- 第二種Abel方程式の検出を改善すること。 今のパターンマッチングは弱いです。
- 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)

[ << ] | [ >> ] |  |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

この文書は市川 雄二によって2012年1月月7日にtexi2html 1.82を用いて生成されました。