# impl

微分代数方程式

## 呼出し手順

    y=impl([type],y0,ydot0,t0,t [,atol, [rtol]],res,adda [,jac])

## パラメータ

y0,ydot0

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

t0

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

t

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

res,adda

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

type

  文字列 `'adams'` または `'stiff'`

atol,rtol

  `y`と同じ大きさの実数スカラーまたは実数ベクトル.

jac

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

## 説明

陰的な線形微分方程式の解

A(t,y) dy/dt=g(t,y), y(t0)=y0

`t0` は初期時刻, `y0` は初期条件, `t0`における`y`の時間微分 ベクトル `ydot0` も指定する必要があります. 入力 `res`は外部ルーチン,すなわち, 指定された構文を有する関数,また規定の呼び出し手順を有する FortranサブルーチンまたはC関数の名前(文字列), またはリストです.

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

    r = res(t,y,ydot)

ただし `t` は実数ベクトル (時間) そして `y` および `ydot` は実数ベクトルr ( 状態量および状態量の微分)です. この関数は `r=g(t,y)-A(t,y)*ydot`を返す必要があります.

`res`が文字列の場合, FortranサブルーチンまたはC関数の名前を指します. この例については, `SCI/modules/differential_equations/sci_gateway/fortran/Ex-impl.f`を参照ください.

`res` をリストとすることもできます: `ode`のヘルプを参照ください.

入力 `adda` も外部ルーチンですi.

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

    r = adda(t,y,p)

これは`r=A(t,y)+p`を返します. ただし, `p` は `A(t,y)`に加算される行列です.

`adda` が文字列の場合, FortranサブルーチンまたはC関数の名前を指します. この例については, `SCI/modules/differential_equations/sci_gateway/fortran/Ex-impl.f`を参照ください.

`adda` をリストとすることもできます: `ode`のヘルプを参照ください.

入力 `jac` も外部ルーチンです.

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

    j = jac(t,y,ydot)

これは `r=g(t,y)-A(t,y)*ydot`の `y`に関するヤコビアンを返します.

`jac` が文字列の場合, FortranサブルーチンまたはC関数の名前を指します. この例については, `SCI/modules/differential_equations/sci_gateway/fortran/Ex-impl.f`を参照ください.

`jac` をリストとすることも可能です: `ode`のヘルプを参照ください.

## 例

    y=impl([1;0;0],[-0.04;0.04;0],0,0.4,'resid','aplusp');
    // Using hot restart
    //[x1,w,iw]=impl([1;0;0],[-0.04;0.04;0],0,0.2,'resid','aplusp');
    // hot start from previous call
    //[x1]=impl([1;0;0],[-0.04;0.04;0],0.2,0.4,'resid','aplusp',w,iw);
    //maxi(abs(x1-x))

## 参照

- dassl
- ode
- external