/* -*- MaTX -*- * * 【名前】 * OdeAuto() - 4次RK法(自動刻み調節)で常微分方程式を解く * * 【形式】 * {T,X} = OdeAuto(t0,t1,x0,diff_eqs) * Array T,X,U; * Real t0,t1; * Matrix x0; * Matrix diff_eqs(t,x,u); (Real t; Matrix x,u;) * * {T,X,U} = OdeAuto(t0,t1,x0,diff_eqs,link_eqs) * Array T,X,U; * Real t0,t1; * Matrix x0; * Matrix diff_eqs(t,x,u); (Real t; Matrix x,u;) * Matrix link_eqs(t,x); (Real t; Matrix x;) * * {T,X,U} = OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps) * Array T,X,U; * Real t0,t1; * Matrix x0; * Matrix diff_eqs(t,x,u); (Real t; Matrix x,u;) * Matrix link_eqs(t,x); (Real t; Matrix x;) * Real eps; * * {T,X,U} = OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps,dtsav) * Array T,X,U; * Real t0,t1; * Matrix x0; * Matrix diff_eqs(t,x,u); (Real t; Matrix x,u;) * Matrix link_eqs(t,x); (Real t; Matrix x;) * Real eps,dtsav; * * {T,X,U} = OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps,dtsav,dtmin) * Array T,X,U; * Real t0,t1; * Matrix x0; * Matrix diff_eqs(t,x,u); (Real t; Matrix x,u;) * Matrix link_eqs(t,x); (Real t; Matrix x;) * Real eps,dtsav,dtmin; * * {T,X,U} = OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps,dtsav, * dtmin,dtmax) * Array T,X,U; * Real t0,t1; * Matrix x0; * Matrix diff_eqs(t,x,u); (Real t; Matrix x,u;) * Matrix link_eqs(t,x); (Real t; Matrix x;) * Real eps,dtsav,dtmin,dtmax; * * 【機能説明】 * {T,X} = OdeAuto(t0,t1,x0,diff_eqs)は,関数diff_eqs()で定義される * 常微分方程式を 4 次のルンゲクッタのアルゴリズムを使い,各時刻に * おける誤差が eps = 1.0E-6 以下になるよう刻み幅を自動調節しながら * 解き,状態の時系列 X と時間の系列 T を返す。 * * 刻み幅の最小値は,dtmin = EPS,最大値は dtmax = abs(t1-t0)/5, * データ保存の最小間隔は,dtsav = 1.0E-3 である。刻み幅を dtmin に * しても,誤差が eps 以下にならない場合,警告メッセージを表示し, * 次の時刻へ進む。 * * {T,X,U} = OdeAuto(t0,t1,x0,diff_eqs,link_eqs)は,link_eqs() の * 計算結果を外部信号 u として,関数 diff_eqs() に渡しながら,常微分 * 方程式を解き,状態の時系列 X,外部信号の時系列 U,時間の系列 T を * 返す。 * * OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps)は,各時刻における打ち切り * 誤差が eps になるよう刻み幅を調節しながら常微分方程式を解く。 * * OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps,dtsav)は,保存するデータの * 間隔を dtsav 以上にし,データを間引く。 * * OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps,dtsav,dtmin)は,刻み幅の * 最小値を dtmin にする。 * * OdeAuto(t0,t1,x0,diff_eqs,link_eqs,eps,dtsav,dtmin,dtmax)は, * 刻み幅の最大値を dtmax にする。 * * 引数の意味を次に示す。 * * t0 : 初期時刻 * t1 : 終端時刻 * x0 : 初期状態 * diff_eqs(t,x,u) : 時刻 t,状態 x,外部信号 u から * : 状態の微分を計算 * link_eqs(t,x) : 時刻 t,状態 x から外部信号を計算する * eps : 各時刻の打ち切り誤差の最大値 * dtsave : データ保存の最小間隔 * dtmin : 刻み幅の最小値 * dtmax : 刻み幅の最大値 * * 【例題】 * ユーザーズマニュアル参照。 * * 【関連項目】 * rngkut4(), Ode(), OdeHybrid(), OdeHybridAuto() */