Introduction to contrib_ode (Maxima 5.46.0 Manual)

Next: Functions and Variables for contrib_ode, Previous: contrib_ode, Up: contrib_ode [Contents][Index]

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

Next: Functions and Variables for contrib_ode, Previous: contrib_ode, Up: contrib_ode [Contents][Index]