1 <?xml version="1.0" encoding="UTF-8"?>
4 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
\r
5 * Copyright (C) 2013 - Scilab Enterprises
\r
7 * This file must be used under the terms of the CeCILL.
\r
8 * This source file is licensed as described in the file COPYING, which
\r
9 * you should have received as part of this distribution.
\r
10 * The terms are also available at
\r
11 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
\r
15 <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" xmlns:scilab="http://www.scilab.org" xml:id="daskr" xml:lang="ja">
19 <refname>daskr</refname>
21 <refpurpose>ゼロ交差を有するDAEソルバー</refpurpose>
29 <synopsis>[r, nn [, hd]] = daskr(x0, t0, t [, atol [, rtol]], res [, jac], ng, surf [, info [, psol] [, pjac]] [, hd])</synopsis>
47 は <literal>y0</literal> (<literal>ydot0</literal> は
49 ゼロを初期推定値として <literal>dassl</literal> により推定)
51 または行列 <literal>[y0 ydot0]</literal>のどちらかです.
53 <literal>g(t,y0,ydot0)</literal> はゼロに等しい必要があります.
55 <literal>ydot0</literal> の推定値のみ既知の場合,
57 <literal>info(7)=1</literal> を指定してください.
69 <para>初期条件の実数列ベクトル.</para>
83 <literal>y</literal> at <literal>t0</literal> (推定値でも可)における<literal>y</literal>の時間微分の実数列ベクトル.
103 <para>実数, 初期時間.</para>
119 <literal>info(2)=1</literal>と指定することにより,
121 dasslの各ステップ点で解を得ることができます.
137 2個のエントリ <literal>[times num]</literal>を有するベクトル.
139 <literal>times</literal> は面が交差する点における時間の値,
141 <literal>num</literal> は交差する面の数です.
151 <term>atol, rtol</term>
157 <literal>y</literal>と同じ大きさの実数スカラーまたは列ベクトル.
159 <literal>atol, rtol</literal> はそれぞれ解の絶対及び相対許容誤差を
163 <literal>y</literal>の各要素について指定されます.
179 <link linkend="external">external</link> (関数またはリストまたは文字列).
181 <literal>g(t,y,ydot)</literal>の値を計算します. 以下のようになります :
189 <para>Scilab関数.</para>
193 <literal>[r,ires]=res(t,y,ydot)</literal> かつ
195 <literal>res</literal> は残差
197 <literal>r=g(t,y,ydot)</literal> かつ エラーフラグ
199 <literal>ires</literal>を返すこと.
201 <literal>res</literal> は, <literal>r</literal>の計算に成功した場合は<literal>ires = 0</literal>,
203 残差が<literal>(t,y,ydot)</literal> において局所的に定義されないには
205 <literal>=-1</literal>, パラメータが許容範囲を逸脱している場合には <literal>=-2</literal>
217 <para>この形式により, t, y, ydot 以外のパラメータを関数に指定出来ます.
223 <programlisting role="no-scilab-exec"><![CDATA[
\r
224 list(res,x1,x2,...)
\r
229 <literal>res</literal> の呼び出し形式は以下とします
233 <programlisting role="no-scilab-exec"><![CDATA[
\r
234 r=res(t,y,ydot,x1,x2,...)
\r
239 <literal>res</literal> は
241 <literal>(t,y,ydot,x1,x2,...)</literal>の関数として<literal>r=g(t,y,ydot)</literal>を返します.
246 警告: この形式は<literal>関数</literal>に渡す別の引数が存在しない場合には
258 <para>ScilabにリンクされたCまたはFortranサブルーチンの名前を指定します.
262 <para>Cの場合, 呼び出し手順は次のようにします:</para>
264 <programlisting role="no-scilab-exec"><![CDATA[
\r
265 void res(double *t, double y[], double yd[], double r[],
\r
266 int *ires, double rpar[], int ipar[])
\r
269 <para>Fortranの場合, 以下としま:</para>
271 <programlisting role="no-scilab-exec"><![CDATA[
\r
272 subroutine res(t,y,yd,r,ires,rpar,ipar)
\r
273 double precision t, y(*),yd(*),r(*),rpar(*)
\r
274 integer ires,ipar(*)
\r
279 <literal>rpar</literal> および <literal>ipar</literal> 配列は存在する必要がありますが使用できません.
299 <link linkend="external">external</link> (関数またはリストまたは文字列). 指定した<literal>cj</literal>
301 の値について, <literal>dg/dy + cj*dg/dydot</literal> の値を計算します.
309 <para>Scilab関数.</para>
312 呼び出し手順は <literal>r=jac(t,y,ydot,cj)</literal> で,
314 <literal>jac</literal> 関数は
316 <literal>r=dg(t,y,ydot)/dy+cj*dg(t,y,ydot)/dydot</literal>を返す必要があります.
320 <literal>cj</literal> は実数スカラーです.
330 <para>以下のように指定します</para>
332 <programlisting role="no-scilab-exec"><![CDATA[
\r
333 list(jac,x1,x2,...)
\r
338 <literal>jac</literal> の呼び出し手順は以下のようになります
342 <programlisting role="no-scilab-exec"><![CDATA[
\r
343 r=jac(t,y,ydot,cj,x1,x2,...)
\r
348 さらに<literal>jac</literal> は
350 <literal>(t,y,ydot,cj,x1,x2,...)</literal>の関数として<literal>dg/dy + cj*dg/dydot</literal> を返します.
360 <para>scilabにリンクされたCまたはFortran サブルーチンの名前を指定します
364 <para>Cの場合, 呼び出し手順は以下となります:</para>
366 <programlisting role="no-scilab-exec"><![CDATA[
\r
367 void jac(double *t, double y[], double yd[], double pd[],
\r
368 double *cj, double rpar[], int ipar[])
\r
371 <para>Fortranの場合は以下となります:</para>
373 <programlisting role="no-scilab-exec"><![CDATA[
\r
374 subroutine jac(t,y,yd,pd,cj,rpar,ipar)
\r
375 double precision t, y(*),yd(*),pd(*),cj,rpar(*)
\r
395 <link linkend="external">external</link> (関数またはリストまたは文字列).
397 <literal>ng</literal>個の要素を有する列ベクトル <literal>surf(t,y)</literal> の値を計算します.
409 <para>Scilab関数.</para>
413 <literal>surf(t,y)</literal>とします
423 <para>以下のように定義します</para>
425 <programlisting role="no-scilab-exec"><![CDATA[
\r
426 list(surf,x1,x2,...)
\r
431 <literal>surf</literal>の呼び出し手順は以下とします
435 <programlisting role="no-scilab-exec"><![CDATA[
\r
436 r=surf(t,y,x1,x2,...)
\r
445 <para>ScilabにリンクされたC または Fortran サブルーチンの名前を指定します.
449 <para>Cの場合, 呼び出し手順は以下とします:</para>
451 <programlisting role="no-scilab-exec"><![CDATA[
\r
452 void surf(int *ny, double *t, double y[], int *ng, double gout[])
\r
455 <para>Fortranの場合, 以下とします:</para>
457 <programlisting role="no-scilab-exec"><![CDATA[
\r
458 subroutine surf(ny,t,y,ng,gout)
\r
459 double precision t, y(*),gout(*)
\r
479 <literal>14</literal> 個の要素を有するリスト. デフォルト値は
481 <literal>list([],0,[],[],[],0,[],0,[],0,[],[],[],1)</literal>です.
495 <literal>g</literal> を評価できる時刻の最大値を実数スカラーで指定します.
497 時間を制限しない場合は空の行列<literal>[]</literal>を指定します.
513 <literal>dassl</literal> が中間計算値を返すか(<literal>flag=1</literal>)
517 (<literal>flag=0</literal>)を指定するフラグ.
533 <literal>2</literal> 要素のベクトルで,
535 <literal>jac</literal>; <literal>r(i - j + ml + mu + 1,j) =
537 "dg(i)/dy(j)+cj*dg(i)/dydot(j)"
540 で計算するバンド行列の定義域<literal>[ml,mu]</literal>を指定します.
542 <literal>info(3)=[]</literal>の場合, <literal>jac</literal> は通常の行列
546 <literal>info(8)=1</literal>の場合, ダミーとして扱われます.
560 <para>最大ステップサイズを指定する実数スカラー値.
562 制限しない場合は <literal>info(4)=[]</literal>を指定します.
576 <para>初期ステップサイズを指定する実数スカラー値.
578 指定しない場合は <literal>info(5)=[]</literal>を指定します.
594 解が非負であることが既知な場合は <literal>info(6)=1</literal>,
596 それ以外は <literal>info(6)=0</literal> を指定します.
612 ydot0 が<literal>g(t0,y0,ydot0)=0</literal>のように指定された場合,
614 <literal>info(7)=[]</literal> と指定します.
616 それ以外の場合は <literal>info(7)=[+-1, ..., +-1]</literal>とします.
618 ここで,y(i)が微分変数の場合は<literal>info(7)(i)=1</literal>,
620 y(i)が代数変数(関数g(t,y,ydot)に微分値が陽に現れない)の場合は
622 <literal>info(7)(i)=-1</literal>とします.
640 ソルバーでKrylov反復法を使用したい場合,<literal>info(8)=1</literal>と指定し,
642 <literal>psol</literal>にルーチンを指定します.
644 それ以外の場合(dasslの直接法)は<literal>info(8)=0</literal>を指定します.
662 <literal>info(8)=0</literal>とした場合はダミー引数として処理されます.
666 <literal>info(9)=[maxl kmp nrmax epli]</literal>を指定します, ただし:
672 - maxl = mSPIGMRアルゴリズムの最大反復回数 (デフォルト
674 <literal>min(5,neq)</literal>),
680 - kmp = SPIGMRアルゴリズムで直交化を行うベクトルの数
688 - nrmax = 各非線形反復におけるSPIGMRアルゴリズムのリスタート最大数
690 (デフォルト <literal>5</literal>),
696 - epli = SPIGMRアルゴリズムの収束安定定数 (デフォルト <literal>0.05</literal>).
706 <term>info(10)</term>
714 <literal>info(7)=[]</literal>の場合はダミーとして処理されます.
716 初期条件の計算直後にソルバーを停止させる場合は
718 <literal>info(10)=1</literal>と指定し,それ以外は
720 <literal>info(10)=0</literal>と指定します.
730 <term>info(11)</term>
736 <literal>psol</literal>用のプリコンディショナ計算およびLU分解ルーチン.
738 <literal>info(8)=0</literal>の場合はダミーとして扱われます.
740 <link linkend="external">external</link> <literal>psol</literal>が特定の
742 ルーチンを使用する必要がある場合は,<literal>info(11)=1</literal>を指定し,
744 <literal>pjac</literal>ルーチンを指定します.
746 それ以外は<literal>info(11)=0</literal>とします.
756 <term>info(12)</term>
762 全変数についてエラー制御をローカルに行いたい場合,
764 <literal>info(12)=[]</literal>を指定します. それ以外は,
766 <literal>info(12)=[+-1, ..., +-1]</literal>を指定します.
768 ただし, y(i)が微分変数の場合は <literal>info(12)(i)=1</literal>,
770 y(i)が代数変数(微係数が関数g(t,y,ydot)に陽に現れない) の場合は
772 <literal>info(12)(i)=-1</literal>とします.
782 <term>info(13)</term>
790 <literal>info(7)=[]</literal>の場合はダミーとして扱われます.
794 <literal>info(13)=[mxnit mxnj mxnh lsoff stptol epinit]</literal>を指定します,
802 - mxnit = ヤコビアンまたはプリコンディショナ評価毎のニュートン反復の最大回数
804 (デフォルト:<literal>info(8)=0</literal>の場合は <literal>5</literal>,
806 それ以外は <literal>15</literal>),
812 - mxnj = ヤコビアンまたはプリコンディショナ評価の最大回数
814 (デフォルト:<literal>info(8)=0</literal>の場合は <literal>6</literal>,
816 それ以外は <literal>2</literal>),
822 - mxnh = info(7) ≠ [] の場合に試行する人工的なステップサイズ
826 (デフォルト <literal>5</literal>),
832 - lsoff = ライン探索アルゴリズムをオフにするフラグ
834 (lsoff = 0 はライン探索有効を意味します, lsoff = 1 はオフを意味します)
836 (デフォルト: <literal>0</literal>),
842 - stptol = ライン探索アルゴリズムの最小スケール刻み (デフォルト: <literal>(丸め誤差単位)^(2/3)</literal>),
848 - epinit = ニュートン反復収束判定の振幅係数 (デフォルト <literal>0.01</literal>).
858 <term>info(14)</term>
866 出力を最小化する場合は <literal>info(14)=1</literal>,
868 最大化する場合は <literal>info(14)=2</literal>, それ以外は
870 <literal>info(14)=0</literal>を指定します.
892 <link linkend="external">external</link> (関数またはリストまたは文字列).
894 線形システム<literal>P*x = b</literal>を解きます.
896 ただし, P はプリコンディショナで, ルーチン <literal>pjac</literal>
898 が事前に計算して, wp 及び iwpに保存します.
906 <para>Scilab関数.</para>
910 <literal>[r, ier] = psol(wp, iwp, b)</literal> とします.
912 <literal>psol</literal> 関数はシステムの解<literal>r</literal>と
914 エラーフラグ<literal>ier</literal>を返す必要があります.
924 <para>以下のような形式とします</para>
926 <programlisting role="no-scilab-exec"><![CDATA[
\r
927 list(psol,x1,x2,...)
\r
932 <literal>psol</literal>の呼び出し手順は以下とします
936 <programlisting role="no-scilab-exec"><![CDATA[
\r
937 psol(wp,iwp,b,x1,x2,...)
\r
942 <literal>psol</literal> は <literal>r</literal>の解を返します.
952 <para>ScilabにリンクされたCまたはFortranサブルーチンの名前を指定します
956 <para>Cの場合,呼び出し手順は以下とします:</para>
958 <programlisting role="no-scilab-exec"><![CDATA[
\r
959 void psol (int*neq, double*t, double*y, double*ydot, double*savr,
\r
960 double*wk, double*cj, double*wght, double*wp, int*iwp, double*b, double*eplin, int*ier, double*rpar, int*ipar)
\r
963 ただし,配列 <literal>wp</literal> および <literal>iwp</literal> はプリコンディショナ
965 <literal>P</literal>の行列要素を行圧縮形式で有します.
967 <para>Fortranの場合は以下とします:</para>
969 <programlisting role="no-scilab-exec"><![CDATA[
\r
970 subroutine psol (neq, t, y, ydot, savr, wk, cj, wght,
\r
971 wp, iwp, b, eplin, ier, rpar, ipar)
\r
972 double precision t,y(*),ydot(*),savr(*),wk(*),cj,wght(*),wp(*),
\r
974 integer neq,iwp(*),ier,ipar(*)
\r
993 <link linkend="external">external</link> (関数またはリストまたは文字列).
995 指定したパラメータ<literal>cj</literal>について
997 <literal>dg/dy + cj*dg/dydot</literal>を計算し,
999 doubleおよびint配列にLU分解を行います.
1007 <para>Scilab関数.</para>
1011 <literal>[wp, iwp, ires] = pjac(neq, t, y, ydot, h, cj, rewt, savr)</literal>
1015 配列 wp および iwp には全てのプリコンディショナ情報が
1027 <para>以下の形式とします</para>
1029 <programlisting role="no-scilab-exec"><![CDATA[
\r
1030 list(pjac,x1,x2,...)
\r
1031 ]]></programlisting>
1035 <literal>pjac</literal>の呼び出し手順は以下とします
1039 <programlisting role="no-scilab-exec"><![CDATA[
\r
1040 pjac(neq,t,y,ydot,h,cj,rewt,savr,x1,x2,...)
\r
1041 ]]></programlisting>
1045 <literal>pjac</literal> は,
1047 <literal>(neq,t,y,ydot,h,cj,rewt,savr,x1,x2,...)</literal>の関数として
1049 分解した <literal>dg/dy + cj*dg/dydot</literal> を返します.
1059 <para>ScilabにリンクされたCまたはFortran形式のサブルーチン名を指定します
1063 <para>Cの場合,呼び出し手順は以下とします:</para>
1065 <programlisting role="no-scilab-exec"><![CDATA[
\r
1066 void pjac (double*res, int*ires, int*neq, double*t, double*y, double*ydot, double*rewt, double*savr,
\r
1067 double*wk, double*h, double*cj, double*wp, int*iwp, int*ier, double*rpar, int*ipar)
\r
1068 ]]></programlisting>
1070 <para>Fortranの場合, 以下のとします:</para>
1072 <programlisting role="no-scilab-exec"><![CDATA[
\r
1073 subroutine pjac (res, ires, neq, t, y, ydot, rewt, savr,
\r
1074 wk, h, cj, wp, iwp, ier, rpar, ipar)
\r
1075 double precision res(*), t, y(*), ydot(*), rewt(*), savr(*),
\r
1076 wk(*), h, cj, wp(*), rpar(*)
\r
1077 integer ires, neq, iwp(*), ier, ipar(*)
\r
1078 ]]></programlisting>
1096 <literal>dassl</literal>コンテキストを保存し,積分を再開できるようにする実数ベクトル.
1114 各列はベクトル<literal>[t;x(t);xdot(t)]</literal>で,
1116 <literal>t</literal> は解が計算される添字の時刻です.
1132 <para>陰的微分方程式の解.</para>
1134 <programlisting role="no-scilab-exec"><![CDATA[
\r
1136 y(t0) = y0 and ydot(t0) = ydot0
\r
1137 ]]></programlisting>
1141 局面交差した時刻と面交差した数を<literal>nn</literal>に返します.
1145 <para>詳細な例は SCI/modules/differential_equations/tests/unit_tests/daskr.tst にあります.</para>
1153 <programlisting role="example"><![CDATA[
\r
1154 // dy/dt = ((2*log(y)+8)/t -5)*y, y(1) = 1, 1 <= t <=6
\r
1155 // g1 = ((2*log(y)+8)/t - 5)*y
\r
1156 // g2 = log(y) - 2.2491
\r
1157 y0 = 1; t = 2:6; t0 = 1; y0d = 3;
\r
1158 atol = 1.d-6; rtol = 0; ng = 2;
\r
1160 deff('[delta,ires] = res1(t,y,ydot)','ires = 0; delta = ydot-((2*log(y)+8)/t-5)*y')
\r
1161 deff('[rts] = gr1(t,y)','rts = [((2*log(y)+8)/t-5)*y; log(y)-2.2491]')
\r
1163 [yy,nn] = daskr([y0,y0d],t0,t,atol,rtol,res1,ng,gr1);
\r
1166 // nn = [2.4698972 2] を返します
\r
1167 ]]></programlisting>
1171 <refsection role="see also">
1175 <simplelist type="inline">
1179 <link linkend="ode">ode</link>
1185 <link linkend="dasrt">dasrt</link>
1191 <link linkend="dassl">dassl</link>
1197 <link linkend="impl">impl</link>
1203 <link linkend="fort">fort</link>
1209 <link linkend="link">link</link>
1215 <link linkend="external">external</link>
1231 <revnumber>5.5.0</revnumber>
1233 <revdescription>daskr ソルバーが追加されました</revdescription>