# 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

  外部関数または文字列またはリスト.

w, iw

  実数ベクトル.

ng

  整数.

g

  外部関数または文字列またはリスト.

## 説明

この構文により (最初の引数が`"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("roots",y0,0,2,f,ng,g)

    deff("[z]=g(t,y)","z=y-[2;2;33]")
    [y,rd]=ode("roots",1,0,2,f,3,g)

## 参照

- dasrt
- ode