ode_root 求解付きの常微分方程式ソルバ

## 呼び出し手順

                [y, rd, w, iw] = ode("root", y0, t0, t [,rtol [,atol]], f [,jac], ng, g [,w,iw])

## 引数

y0

  実数ベクトルまたは行列 (初期条件).

t0

  実数スカラー (初期時間).

t

  実数ベクトル (解を計算する時間).

f

  外部ルーチン,すなわち,関数または文字列またはリスト.

rtol, atol

  実数定数または`y`と同じ大きさの実数ベクトル.

jac

  外部ルーチン,すなわち,関数または文字列またはリスト.

ng

  整数.

g

  外部ルーチン,すなわち,関数または文字列またはリスト.

y

  実数のベクトルまたは行列.

rd

  実数ベクトル.

w, iw

  実数ベクトル.(入力/出力). See ode() optional output

## 説明

この構文により (最初の引数が`"root"`) `ode` は, 状態量`y(t)`が 面`g(t,y)=0`と交差するまで 微分方程式`dy/dt=f(t,y)` の解を計算します.

`g` に面の方程式を指定します. これは指定した構文を有する外部関数,または 指定したコール手順を有する FortranサブルーチンまたはC関数(文字列)またはリストです.

`g` が関数の場合,その構文は以下のようにする 必要があります:

    z = g(t,y)

ただし, `t` はスカラー実数 (時間), `y` は実数ベクトル (状態量). この関数は, `ng`個の拘束条件に対応する 大きさ`ng`のベクトルを返します. `g` が文字列の場合, この文字列は, FortranサブルーチンまたはC関数を指しており, 以下のようなコール手順となります: `g(n,t,y,ng,gout)`. ただし, `ng`は拘束条件の数, `gout`は`g`の値 (プログラムの出力)です. `g` は, `f` と同じ表記のリストです. (odeのヘルプ参照)．

出力 `rd` は `1 x k` ベクトルです. 最初のエントリは,停止時間を含んでいます. 他のエントリは,`g`のどの要素の符号が変わったのかを 示すエントリです. `k`が2より大きい場合,1以上の面 (`(k-1)` 個の面)が同時に符号が変わったことを意味します.

他の引数と他のオプションは, `ode`と同じです.odeのヘルプを参照ください.

## 例

    // 微分方程式の積分
    // dy/dt=y , y(0)=1, として y(t)=2 となる最小の時間 t を探します
    deff("ydot = f(t,y)", "ydot = y")
    deff("z = g(t,y)", "z = y-2")
    y0 = 1;
    ng = 1;
    [y, rd] = ode("root", y0, 0, 2, f, ng, g)
    deff("z = g(t,y)", "z = y-[2;2;33]")
    [y, rd] = ode("root", 1, 0, 2, f, 3, g)

## 参照

- ode
- ode_optional_output
- ode_discrete
- dae