1
1
<?xml version="1.0" encoding="UTF-8"?>
2
2
<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" version="5.0-subset Scilab" xml:id="ode" xml:lang="ja">
5
<refpurpose>常微分方程式ソルバ</refpurpose>
9
<synopsis>y=ode(y0,t0,t,f)
10
[y,w,iw]=ode([type],y0,t0,t [,rtol [,atol]],f [,jac] [,w,iw])
11
[y,rd,w,iw]=ode("root",y0,t0,t [,rtol [,atol]],f [,jac],ng,g [,w,iw])
12
y=ode("discrete",y0,k0,kvect,f)
21
<para>実数ベクトルまたは行列 (初期条件).</para>
27
<para>実数スカラー (初期時間).</para>
33
<para>実数ベクトル (解を計算する時間).</para>
39
<para>外部 (関数または文字列またはリスト).</para>
46
以下の文字列のどれか: <literal>"adams"</literal>,
47
<literal>"stiff"</literal>, <literal>"rk"</literal>,
48
<literal>"rkf"</literal>, <literal>"fix"</literal>,
49
<literal>"discrete"</literal>, <literal>"roots"</literal>.
54
<term>rtol, atol</term>
57
実数定数または<literal>y</literal>と同じ大きさの実数ベクトル.
64
<para>外部 (関数または文字列またはリスト).</para>
82
<para>外部 (関数または文字列またはリスト).</para>
88
<para>整数 (初期時間).</para>
102
<literal>ode</literal> は,dy/dt=f(t,y) , y(t0)=y0で定義された
103
明示的なODEシステムを解くための標準関数です.
104
この関数は,種々のソルバ,特に ODEPACKへのインターフェイスです.
105
解く問題の型と使用される手法は最初のオプション引数<literal>type</literal>
107
<literal>type</literal>は,以下の文字列のどれかになります:
111
<term><not given>:</term>
114
パッケージODEPACKの<literal>lsoda</literal> ソルバが
116
このソルバは非スティッフな問題用の予測子/修正子 Adams 法とスティッフな問題用の
117
後退差分法(BDF)を自動的に選択します.
118
まず非スティッフな手法が使用され,使用する手法を
119
決定するためにデータを動的にモニタします.
124
<term>"adams":</term>
126
<para>これは非スティッフな問題用です. ODEPACKパッケージの
127
<literal>lsode</literal> ソルバがコールされ, この関数は
133
<term>"stiff":</term>
135
<para>これはスティッフな問題用です. ODEPACKパッケージの
136
<literal>lsode</literal> ソルバがコールされ, BDF法が使用されます.
143
<para>4次の適応型 Runge-Kutta (RK4) 法.</para>
150
Fehlbergの4次と5次の Runge-Kutta法に基づくShampine および Wattsのプログラム
152
この方法は非スティッフおよびややスティッフな問題用で,
153
微係数の評価コストが低い場合に適しています.
154
この手法は一般にユーザが高い精度を望む場合には使用するべきではありません.
162
<literal>"rkf"</literal>と同じソルバですがユーザインターフェイスが非常にシンプルで,
163
<literal>rtol</literal> および <literal>atol</literal>パラメータのみを
165
この手法は使用できる中で最も簡単な手法です.
172
<para>解を得る機能を有するODE ソルバ. ODEPACKパッケージの
173
<literal>lsodar</literal> ソルバが使用されます.
174
使用されているのは<literal>lsoda</literal> ソルバを改変したもので,
175
指定したベクトル関数の根を見つけることができます.
176
詳細は <link linkend="ode_root">ode_root</link> のヘルプを参照してください.
181
<term>"discrete":</term>
184
離散時間シミュレーション. 詳細は <link linkend="ode_discrete">ode_discrete</link> のヘルプを参照してください.
190
このヘルプでは,標準的な陽のODEシステムに関する<literal>ode</literal>
5
<refpurpose>常微分方程式ソルバ</refpurpose>
9
<synopsis>y=ode(y0,t0,t,f)
10
[y,w,iw]=ode([type],y0,t0,t [,rtol [,atol]],f [,jac] [,w,iw])
11
[y,rd,w,iw]=ode("root",y0,t0,t [,rtol [,atol]],f [,jac],ng,g [,w,iw])
12
y=ode("discrete",y0,k0,kvect,f)
21
<para>実数ベクトルまたは行列 (初期条件).</para>
27
<para>実数スカラー (初期時間).</para>
33
<para>実数ベクトル (解を計算する時間).</para>
39
<para>外部 (関数または文字列またはリスト).</para>
46
以下の文字列のどれか: <literal>"adams"</literal>,
47
<literal>"stiff"</literal>, <literal>"rk"</literal>,
48
<literal>"rkf"</literal>, <literal>"fix"</literal>,
49
<literal>"discrete"</literal>, <literal>"roots"</literal>.
54
<term>rtol, atol</term>
57
実数定数または<literal>y</literal>と同じ大きさの実数ベクトル.
64
<para>外部 (関数または文字列またはリスト).</para>
82
<para>外部 (関数または文字列またはリスト).</para>
88
<para>整数 (初期時間).</para>
196
<literal>ode</literal>の最も簡単なコールは次のようになります:
197
<literal>y=ode(y0,t0,t,f)</literal> ただし <literal>y0</literal> は
198
初期条件のベクトル,<literal>t0</literal> は初期時間,
199
<literal>t</literal> は解<literal>y</literal>を計算する時間のベクトル,
200
<literal>y</literal>は解ベクトルの行列<literal>y=[y(t(1)),y(t(2)),...]</literal>
102
<literal>ode</literal> は,dy/dt=f(t,y) , y(t0)=y0で定義された
103
明示的なODEシステムを解くための標準関数です.
104
この関数は,種々のソルバ,特に ODEPACKへのインターフェイスです.
105
解く問題の型と使用される手法は最初のオプション引数<literal>type</literal>
107
<literal>type</literal>は,以下の文字列のどれかになります:
111
<term><not given>:</term>
114
パッケージODEPACKの<literal>lsoda</literal> ソルバが
116
このソルバは非スティッフな問題用の予測子/修正子 Adams 法とスティッフな問題用の
117
後退差分法(BDF)を自動的に選択します.
118
まず非スティッフな手法が使用され,使用する手法を
119
決定するためにデータを動的にモニタします.
124
<term>"adams":</term>
126
<para>これは非スティッフな問題用です. ODEPACKパッケージの
127
<literal>lsode</literal> ソルバがコールされ, この関数は
133
<term>"stiff":</term>
135
<para>これはスティッフな問題用です. ODEPACKパッケージの
136
<literal>lsode</literal> ソルバがコールされ, BDF法が使用されます.
143
<para>4次の適応型 Runge-Kutta (RK4) 法.</para>
150
Fehlbergの4次と5次の Runge-Kutta法に基づくShampine および Wattsのプログラム
152
この方法は非スティッフおよびややスティッフな問題用で,
153
微係数の評価コストが低い場合に適しています.
154
この手法は一般にユーザが高い精度を望む場合には使用するべきではありません.
162
<literal>"rkf"</literal>と同じソルバですがユーザインターフェイスが非常にシンプルで,
163
<literal>rtol</literal> および <literal>atol</literal>パラメータのみを
165
この手法は使用できる中で最も簡単な手法です.
172
<para>解を得る機能を有するODE ソルバ. ODEPACKパッケージの
173
<literal>lsodar</literal> ソルバが使用されます.
174
使用されているのは<literal>lsoda</literal> ソルバを改変したもので,
175
指定したベクトル関数の根を見つけることができます.
176
詳細は <link linkend="ode_root">ode_root</link> のヘルプを参照してください.
181
<term>"discrete":</term>
184
離散時間シミュレーション. 詳細は <link linkend="ode_discrete">ode_discrete</link> のヘルプを参照してください.
204
入力引数 <literal>f</literal> は1次微分方程式
205
dy/dt=f(t,y)のRHSを定義します.
206
これは外部,すなわち指定した構文の関数または指定したコール手続きを
207
有するFortranサブルーチンまたはC関数の名前(文字列),またはリストです:
190
このヘルプでは,標準的な陽のODEシステムに関する<literal>ode</literal>
212
<literal>f</literal> が Scilab 関数の場合,
213
その構文は <literal>ydot = f(t,y)</literal>となります.
214
ただし,<literal>t</literal>は実数スカラー(時間),
215
<literal>y</literal> は実数ベクトル (状態量),
216
<literal>ydot</literal>は実数ベクトル (dy/dt)です.
221
<literal>f</literal> が文字列の場合,
222
FortranサブルーチンまたはC関数の名前が参照されます.
223
すなわち,<literal>ode(y0,t0,t,"fex")</literal>がコマンドの
224
場合,サブルーチン<literal>fex</literal>がコールされます.
226
<para>Fortranルーチンは以下の呼び出し手順とする
227
必要があります: <literal>fex(n,t,y,ydot)</literal>,
228
ただし n は整数, t は倍精度実数, y と ydot は倍精度ベクトルです.
230
<para>C 関数は以下のプロトタイプとする必要があります:
231
<literal>fex(int *n,double *t,double *y,double
236
<literal>t</literal> は時間, <literal>y</literal> は
237
状態量, <literal>ydot</literal>は状態量の微分
240
<para>This external can be build in a OS independant way using
241
<link linkend="ilib_for_link">ilib_for_link</link> and dynamically
242
linked to Scilab by the <link linkend="link">link</link>
248
引数<literal>f</literal> は以下の構造を有するリストと
250
<literal>lst=list(realf,u1,u2,...un)</literal> ただし,
251
<literal>realf</literal> は次の構文を有するScilab関数です:
252
<literal>ydot = f(t,y,u1,u2,...,un)</literal>
255
<literal>realf</literal>の引数にパラメータを使用することができます.
260
関数 <literal>f</literal> はベクトルではなく <literal>p x
263
の行列を返すことができます. この行列表記により,
264
<literal>n=p+q</literal> 次のODEシステム<literal>dY/dt=F(t,Y)</literal>
266
ただし, <literal>Y</literal>は <literal>p x q</literal>の行列です.
267
初期条件 <literal>Y0</literal>も<literal>p x q</literal>の行列
268
である必要があり, <literal>ode</literal>の結果は <literal>p x
271
の行列 <literal>[Y(t_0),Y(t_1),...,Y(t_T)]</literal>
276
<para>オプションの入力パラメータとして次の
279
<literal>rtol</literal> および <literal>atol</literal>.
280
<literal>y(i)</literal>の指定誤差は次のようになります:
281
<literal>rtol(i)*abs(y(i))+atol(i)</literal>
283
<para>そして,状態量の全ての要素に関してこの誤差が小さい場合,
285
<literal>rtol</literal> または
286
<literal>atol</literal> が一つの定数の場合, <literal>rtol(i)</literal>
287
および <literal>atol(i)</literal> はこの定数の値に設定されます.
288
<literal>rtol</literal> および <literal>atol</literal>のデフォルト値は
289
多くのソルバではそれぞれ<literal>rtol=1.d-5</literal> および
290
<literal>atol=1.d-7</literal>,
291
<literal>"rfk"</literal> および <literal>"fix"</literal>では
292
<literal>rtol=1.d-3</literal> および <literal>atol=1.d-4</literal>です.
296
<para>スティッフな問題の場合, RHS関数のヤコビアンを
297
オプションの引数<literal>jac</literal>として
299
これは,外部,すなわち,指定された構文を有する関数,
300
または指定した呼び出し手順を有するFortranサブルーチンまたは
301
C関数の名前(文字列),またはリストです.
304
<literal>jac</literal> が関数の場合,
306
<literal>J=jac(t,y)</literal>とする必要があります.
309
ただし, <literal>t</literal> は実数スカラー (時間)および
310
<literal>y</literal> 実数ベクトル (状態量). 結果の行列
311
<literal>J</literal> は df/dx を評価する必要があります.
312
ただし, <literal>J(k,i) =dfk/dxi</literal> で <literal>fk</literal> は
316
<literal>jac</literal> は文字列で,
317
FortranサブルーチンまたはC関数の名前を指し,
320
<para>Fortranの場合:</para>
321
<programlisting role=""><![CDATA[
196
<literal>ode</literal>の最も簡単なコールは次のようになります:
197
<literal>y=ode(y0,t0,t,f)</literal> ただし <literal>y0</literal> は
198
初期条件のベクトル,<literal>t0</literal> は初期時間,
199
<literal>t</literal> は解<literal>y</literal>を計算する時間のベクトル,
200
<literal>y</literal>は解ベクトルの行列<literal>y=[y(t(1)),y(t(2)),...]</literal>
204
入力引数 <literal>f</literal> は1次微分方程式
205
dy/dt=f(t,y)のRHSを定義します.
206
これは外部,すなわち指定した構文の関数または指定したコール手続きを
207
有するFortranサブルーチンまたはC関数の名前(文字列),またはリストです:
212
<literal>f</literal> が Scilab 関数の場合,
213
その構文は <literal>ydot = f(t,y)</literal>となります.
214
ただし,<literal>t</literal>は実数スカラー(時間),
215
<literal>y</literal> は実数ベクトル (状態量),
216
<literal>ydot</literal>は実数ベクトル (dy/dt)です.
221
<literal>f</literal> が文字列の場合,
222
FortranサブルーチンまたはC関数の名前が参照されます.
223
すなわち,<literal>ode(y0,t0,t,"fex")</literal>がコマンドの
224
場合,サブルーチン<literal>fex</literal>がコールされます.
226
<para>Fortranルーチンは以下の呼び出し手順とする
227
必要があります: <literal>fex(n,t,y,ydot)</literal>,
228
ただし n は整数, t は倍精度実数, y と ydot は倍精度ベクトルです.
230
<para>C 関数は以下のプロトタイプとする必要があります:
231
<literal>fex(int *n,double *t,double *y,double
236
<literal>t</literal> は時間, <literal>y</literal> は
237
状態量, <literal>ydot</literal>は状態量の微分
240
<para>This external can be build in a OS independant way using
241
<link linkend="ilib_for_link">ilib_for_link</link> and dynamically
242
linked to Scilab by the <link linkend="link">link</link>
248
引数<literal>f</literal> は以下の構造を有するリストと
250
<literal>lst=list(realf,u1,u2,...un)</literal> ただし,
251
<literal>realf</literal> は次の構文を有するScilab関数です:
252
<literal>ydot = f(t,y,u1,u2,...,un)</literal>
255
<literal>realf</literal>の引数にパラメータを使用することができます.
260
関数 <literal>f</literal> はベクトルではなく <literal>p x
263
の行列を返すことができます. この行列表記により,
264
<literal>n=p+q</literal> 次のODEシステム<literal>dY/dt=F(t,Y)</literal>
266
ただし, <literal>Y</literal>は <literal>p x q</literal>の行列です.
267
初期条件 <literal>Y0</literal>も<literal>p x q</literal>の行列
268
である必要があり, <literal>ode</literal>の結果は <literal>p x
271
の行列 <literal>[Y(t_0),Y(t_1),...,Y(t_T)]</literal>
276
<para>オプションの入力パラメータとして次の
279
<literal>rtol</literal> および <literal>atol</literal>.
280
<literal>y(i)</literal>の指定誤差は次のようになります:
281
<literal>rtol(i)*abs(y(i))+atol(i)</literal>
283
<para>そして,状態量の全ての要素に関してこの誤差が小さい場合,
285
<literal>rtol</literal> または
286
<literal>atol</literal> が一つの定数の場合, <literal>rtol(i)</literal>
287
および <literal>atol(i)</literal> はこの定数の値に設定されます.
288
<literal>rtol</literal> および <literal>atol</literal>のデフォルト値は
289
多くのソルバではそれぞれ<literal>rtol=1.d-5</literal> および
290
<literal>atol=1.d-7</literal>,
291
<literal>"rfk"</literal> および <literal>"fix"</literal>では
292
<literal>rtol=1.d-3</literal> および <literal>atol=1.d-4</literal>です.
296
<para>スティッフな問題の場合, RHS関数のヤコビアンを
297
オプションの引数<literal>jac</literal>として
299
これは,外部,すなわち,指定された構文を有する関数,
300
または指定した呼び出し手順を有するFortranサブルーチンまたは
301
C関数の名前(文字列),またはリストです.
304
<literal>jac</literal> が関数の場合,
306
<literal>J=jac(t,y)</literal>とする必要があります.
309
ただし, <literal>t</literal> は実数スカラー (時間)および
310
<literal>y</literal> 実数ベクトル (状態量). 結果の行列
311
<literal>J</literal> は df/dx を評価する必要があります.
312
ただし, <literal>J(k,i) =dfk/dxi</literal> で <literal>fk</literal> は
316
<literal>jac</literal> は文字列で,
317
FortranサブルーチンまたはC関数の名前を指し,
320
<para>Fortranの場合:</para>
321
<programlisting role=""><![CDATA[
322
322
subroutine fex(n,t,y,ml,mu,J,nrpd)
323
323
integer n,ml,mu,nrpd
324
324
double precision t,y(*),J(*)
325
325
]]></programlisting>
327
<programlisting role=""><![CDATA[
327
<programlisting role=""><![CDATA[
328
328
void fex(int *n,double *t,double *y,int *ml,int *mu,double *J,int *nrpd,)
329
329
]]></programlisting>
331
<literal>jac(n,t,y,ml,mu,J,nrpd)</literal>. 多くの場合,
332
<literal>ml</literal>,<literal>mu</literal>および
333
<literal>nrpd</literal>を参照するべきではありません.
336
<literal>jac</literal> がリストの場合,
337
<literal>f</literal>と同じ同じ構文が適用されます.
342
オプションの引数 <literal>w</literal> および
343
<literal>iw</literal> は積分ルーチンにより返される情報を
344
保存するベクトルです(詳細は<link linkend="ode_optional_output">ode_optional_output</link> 参照).
345
これらのベクトルが<literal>ode</literal>のRHSで提供される場合,
346
積分は前回の停止時と同じパラメータで再開されます.
351
より多くのオプションを<literal>%ODEOPTIONS</literal>変数
352
によりODEPACKソルバに指定することができます.
353
<link linkend="odeoptions">odeoptions</link>を参照ください.
360
<programlisting role="example"><![CDATA[
331
<literal>jac(n,t,y,ml,mu,J,nrpd)</literal>. 多くの場合,
332
<literal>ml</literal>,<literal>mu</literal>および
333
<literal>nrpd</literal>を参照するべきではありません.
336
<literal>jac</literal> がリストの場合,
337
<literal>f</literal>と同じ同じ構文が適用されます.
342
オプションの引数 <literal>w</literal> および
343
<literal>iw</literal> は積分ルーチンにより返される情報を
344
保存するベクトルです(詳細は<link linkend="ode_optional_output">ode_optional_output</link> 参照).
345
これらのベクトルが<literal>ode</literal>のRHSで提供される場合,
346
積分は前回の停止時と同じパラメータで再開されます.
351
より多くのオプションを<literal>%ODEOPTIONS</literal>変数
352
によりODEPACKソルバに指定することができます.
353
<link linkend="odeoptions">odeoptions</link>を参照ください.
360
<programlisting role="example"><![CDATA[
361
361
// ---------- Simple one dimension ODE (Scilab function external)
362
362
// dy/dt=y^2-y sin(t)+cos(t), y(0)=0
363
363
function ydot=f(t,y),ydot=y^2-y*sin(t)+cos(t),endfunction