1d78ece6afe7e8d97de9f0346daa7196b3e6ee55
[scilab.git] / scilab / modules / differential_equations / help / ru_RU / ode.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!--
3  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4  * Copyright (C) 2008 - INRIA
5  * Copyright (C) 2011 - DIGITEO - Michael Baudin
6  * Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  -->
17 <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="ode" xml:lang="ru">
18     <refnamediv>
19         <refname>ode</refname>
20         <refpurpose>
21             программа решения обыкновенных дифференциальных уравнений
22         </refpurpose>
23     </refnamediv>
24     <refsynopsisdiv>
25         <title>Последовательность вызова</title>
26         <synopsis>
27             y = ode(y0, t0, t, f)
28             [y, w, iw] = ode([type,]y0, t0, t [,rtol [,atol]],f [,jac] [,w, iw])
29             [y, rd, w, iw] = ode("root", y0, t0, t [,rtol [,atol]], f [,jac], ng, g [, w, iw])
30             y = ode("discrete", y0, k0, kvect, f)
31         </synopsis>
32     </refsynopsisdiv>
33     <refsection>
34         <title>Аргументы</title>
35         <variablelist>
36             <varlistentry>
37                 <term>y0</term>
38                 <listitem>
39                     <para>
40                         вектор или матрица вещественных значений, начальные условия.
41                     </para>
42                 </listitem>
43             </varlistentry>
44             <varlistentry>
45                 <term>t0</term>
46                 <listitem>
47                     <para>
48                         вещественный скаляр, начальное время.
49                     </para>
50                 </listitem>
51             </varlistentry>
52             <varlistentry>
53                 <term>t</term>
54                 <listitem>
55                     <para>
56                         вещественный вектор, моменты времени для которых находится решение.
57                     </para>
58                 </listitem>
59             </varlistentry>
60             <varlistentry>
61                 <term>f</term>
62                 <listitem>
63                     <para>
64                         внешняя функция (функция, строка или список),
65                         правая сторона дифференциального  уравнения.
66                     </para>
67                 </listitem>
68             </varlistentry>
69             <varlistentry>
70                 <term>type</term>
71                 <listitem>
72                     <para>
73                         строка, тип используемой программы решения. Имеются следующие типы
74                         программ решения:        <literal>"adams"</literal>,
75                         <literal>"stiff"</literal>, <literal>"rk"</literal>,
76                         <literal>"rkf"</literal>, <literal>"fix"</literal>,
77                         <literal>"discrete"</literal>, <literal>"roots"</literal>.
78                     </para>
79                 </listitem>
80             </varlistentry>
81             <varlistentry>
82                 <term>rtol</term>
83                 <listitem>
84                     <para>
85                         вещественная константа либо вещественный вектор того же размера,
86                         что и <varname>y</varname>, относительный допуск.
87                     </para>
88                 </listitem>
89             </varlistentry>
90             <varlistentry>
91                 <term>atol</term>
92                 <listitem>
93                     <para>
94                         вещественная константа либо вещественный вектор того же размера,
95                         что и <varname>y</varname>, абсолютный допуск.
96                     </para>
97                 </listitem>
98             </varlistentry>
99             <varlistentry>
100                 <term>jac</term>
101                 <listitem>
102                     <para>
103                         внешняя функция (функция, строка или список), якобиан функции
104                         <varname>f</varname>.
105                     </para>
106                 </listitem>
107             </varlistentry>
108             <varlistentry>
109                 <term>w, iw</term>
110                 <listitem>
111                     <para>вещественные векторы (ВХОДНЫЕ/ВЫХОДНЫЕ).</para>
112                 </listitem>
113             </varlistentry>
114             <varlistentry>
115                 <term>ng</term>
116                 <listitem>
117                     <para>целое число.</para>
118                 </listitem>
119             </varlistentry>
120             <varlistentry>
121                 <term>g</term>
122                 <listitem>
123                     <para>внешняя функция (функция, символьная строка или список).</para>
124                 </listitem>
125             </varlistentry>
126             <varlistentry>
127                 <term>k0</term>
128                 <listitem>
129                     <para>целое число (начальное время).</para>
130                 </listitem>
131             </varlistentry>
132             <varlistentry>
133                 <term>kvect</term>
134                 <listitem>
135                     <para>целочисленный вектор.</para>
136                 </listitem>
137             </varlistentry>
138             <varlistentry>
139                 <term>y</term>
140                 <listitem>
141                     <para>вещественный вектор или матрица (ВЫХОДНАЯ).</para>
142                 </listitem>
143             </varlistentry>
144             <varlistentry>
145                 <term>rd</term>
146                 <listitem>
147                     <para>вещественный вектор (ВЫХОДНОЙ).</para>
148                 </listitem>
149             </varlistentry>
150         </variablelist>
151     </refsection>
152     <refsection>
153         <title>Описание</title>
154         <para>
155             <function>ode</function> решает явные обыкновенные
156             дифференциальные уравнения, определённые как:
157         </para>
158         <para>
159             <latex>
160                 \begin{eqnarray}
161                 \begin{array}{l}
162                 \dfrac{dy}{dt} = f(t,y)\\
163                 y(t_0)=y_0
164                 \end{array}
165                 \end{eqnarray}
166             </latex>
167         </para>
168         <para>
169             Это интерфейс для различных программ решения, в частности для ODEPACK.
170         </para>
171         <para>
172             В данной справке описывается использование
173             <function>ode</function> для стандартных явных систем ОДУ.
174         </para>
175         <para>
176             Самый простой способ вызова <function>ode</function>:
177             <code>y = ode(y0, t0, t, f)</code>, где <varname>y0</varname> -
178             вектор начальных условий, <varname>t0</varname> - начальное время,
179             <varname>t</varname> - вектор моментов времени, для которых вычисляется
180             решение <varname>y</varname> и <varname>y</varname> - матрица векторов
181             решения <literal>y=[y(t(1)),y(t(2)),...]</literal>.
182         </para>
183         <para>
184             Входной аргумент <varname>f</varname> определяет правую сторону
185             дифференциального уравнения первого порядка. Этот аргумент является
186             функцией с определённым заголовком.
187         </para>
188         <itemizedlist>
189             <listitem>
190                 <para>
191                     Если <varname>f</varname> является Scilab-функцией, то её
192                     последовательность вызова должна быть:
193                 </para>
194                 <screen><![CDATA[
195 ydot = f(t,y)
196  ]]></screen>
197                 <para>
198                     где <literal>t</literal> - вещественный скаляр (время), а
199                     <varname>y</varname> - вещественный вектор (состояние) и
200                     <varname>ydot</varname> - вещественный вектор (производная первого
201                     порядка dy/dt).
202                 </para>
203             </listitem>
204             <listitem>
205                 <para>
206                     Если <varname>f</varname> - строка, то это - имя  компилированной
207                     процедуры Fortran или функции C. Например, если вызывается
208                     <code>ode(y0, t0, t, "fex")</code>, то вызывается подпрограмма
209                     <literal>fex</literal>.
210                 </para>
211                 <para>
212                     Процедура Fortran должна иметь заголовок:
213                 </para>
214                 <screen><![CDATA[
215 fex(n,t,y,ydot)
216  ]]></screen>
217                 <para>
218                     где <varname>n</varname> - целое число, <varname>t</varname> --
219                     скаляр двойной точности, <varname>y</varname> и
220                     <varname>ydot</varname> - векторы двойной точности.
221                 </para>
222                 <para>
223                     Функция C должна иметь заголовок:
224                 </para>
225                 <screen><![CDATA[
226 fex(int *n,double *t,double *y,double *ydot)
227  ]]></screen>
228                 <para>
229                     где <varname>t</varname> - время, <varname>y</varname> - состояние,
230                     а <varname>ydot</varname> - производная состояния (dy/dt).
231                 </para>
232                 <para>
233                     Эта внешняя функция может быть собрана способом, независящим от ОС,
234                     используя <link linkend="ilib_for_link">ilib_for_link</link> и
235                     динамически связана с Scilab с помощью функции
236                     <link linkend="link">link</link>.
237                 </para>
238             </listitem>
239             <listitem>
240                 <para>
241                     Может случиться, что симулятору <varname>f</varname> потребуются
242                     дополнительные аргументы. В этом случае можно использовать следующую
243                     возможность. Аргумент <varname>f</varname> может также быть
244                     списком <literal>lst=list(simuf,u1,u2,...un)</literal>, где
245                     <literal>simuf</literal> является Scilab-функцией с синтаксисом:
246                     <literal>ydot = f(t,y,u1,u2,...,un)</literal>, а
247                     <literal>u1</literal>, <literal>u2</literal>, ...,
248                     <literal>un</literal> - дополнительные аргументы, автоматически
249                     передаваемые симулятору <literal>simuf</literal>.
250                 </para>
251             </listitem>
252         </itemizedlist>
253         <para>
254             Функция <varname>f</varname> может возвращать вместо
255             вектора матрицу<literal>p x q</literal>. С этой матричной нотацией
256             решается система <literal>n=p+q</literal> ОДУ
257             <literal>dY/dt=F(t,Y)</literal>, где <literal>Y</literal> - матрица
258             <literal>p x q</literal>.  Затем начальные условия,
259             <literal>Y0</literal>, должны быть так же матрицей
260             <literal>p x q</literal>, а результат <function>ode</function> - матрицей
261             <literal>p x q(T+1)</literal>
262             <literal>[Y(t_0),Y(t_1),...,Y(t_T)]</literal>.
263         </para>
264         <para>
265             Допуски <varname>rtol</varname> и <varname>atol</varname> являются
266             порогами для относительной и абсолютной оценённых ошибок. Оценённая
267             ошибка <literal>y(i)</literal> равна:
268             <literal>rtol(i)*abs(y(i))+atol(i)</literal> и интегрирование выполняется
269             пока эта ошибка мала для каждого из элементов состояния. Если
270             <varname>rtol</varname> и/или <varname>atol</varname> является
271             константой, то <literal>rtol(i)</literal> и/или <literal>atol(i)</literal>
272             являются набором констант. Значения по умолчанию для
273             <varname>rtol</varname> и <varname>atol</varname> соответственно равны
274             <literal>rtol=1.d-5</literal> и <literal>atol=1.d-7</literal> для
275             большинства программ решения, а для <literal>"rfk"</literal> и
276             <literal>"fix"</literal>  <literal>rtol=1.d-3</literal> и
277             <literal>atol=1.d-4</literal>.
278         </para>
279         <para>
280             Для жёстких задач лучше указывать якобиан функции правой стороны в
281             качестве необязательного аргумента <varname>jac</varname>.
282             Якобиан является внешней функцией, т. е. функцией со специальным
283             синтаксисом, либо именем процедуры Fortran или функции C
284             (символьная строка) с определённой последовательностью вызова, либо
285             списком.
286         </para>
287         <itemizedlist>
288             <listitem>
289                 <para>
290                     Если <varname>jac</varname> является функцией, то синтаксис должен
291                     быть <literal>J=jac(t,y)</literal>, где <literal>t</literal> --
292                     вещественный скаляр (время), а <varname>y</varname> - вещественный
293                     вектор (состояние). Результирующая матрица <literal>J</literal>
294                     должна вычислять df/dx, т. е. <literal>J(k,i) = dfk/dxi</literal>, где
295                     <literal>fk</literal> - <literal>k</literal>-тый элемент
296                     <varname>f</varname>.
297                 </para>
298             </listitem>
299             <listitem>
300                 <para>
301                     Если <varname>jac</varname> является символьной строкой, то она
302                     ссылается на имя процедуры Fortran или функции C.
303                 </para>
304                 <para>
305                     Процедура Fortran должна иметь заголовок:
306                 </para>
307                 <screen><![CDATA[
308 subroutine fex(n,t,y,ml,mu,J,nrpd)
309 integer n,ml,mu,nrpd
310 double precision t,y(*),J(*)
311  ]]></screen>
312                 <para>
313                     Функция C должна иметь заголовок:
314                 </para>
315                 <screen><![CDATA[
316 void fex(int *n,double *t,double *y,int *ml,int *mu,double *J,int *nrpd,)
317  ]]></screen>
318                 <para>
319                     В большинстве случаев не нужно ссылаться на <literal>ml</literal>,
320                     <literal>mu</literal> и <literal>nrpd</literal>.
321                 </para>
322             </listitem>
323             <listitem>
324                 <para>
325                     Если <varname>jac</varname> является списком, то для
326                     <varname>f</varname> применяются те же договорённости.
327                 </para>
328             </listitem>
329         </itemizedlist>
330         <para>
331             Необязательные аргументы <varname>w</varname> и
332             <varname>iw</varname> являются векторами для хранения информации,
333             возвращаемой подпрограммой интегрирования (см. <link linkend="ode_optional_output">ode_optional_output</link>).
334             Когда эти векторы указываются с правой стороны  <function>ode</function>,
335             интегрирование начинается заново с теми же параметрами, что и до
336             остановки.
337         </para>
338         <para>
339             Программам решения ODEPACK можно передать больше опций с помощью
340             переменной  <literal>%ODEOPTIONS</literal>. See <link linkend="odeoptions">odeoptions</link>.
341         </para>
342     </refsection>
343     <refsection>
344         <title>Программы решения</title>
345         <para>
346             Тип задачи, которую надо решить и используемый метод зависят от
347             значения первого необязательного аргумента <varname>type</varname>,
348             который может быть одной из следующих строк:
349         </para>
350         <variablelist>
351             <varlistentry>
352                 <term>&lt;не задано&gt;:</term>
353                 <listitem>
354                     <para>
355                         Программа решения <literal>lsoda</literal> из пакета ODEPACK
356                         вызывается по умолчанию. Она автоматически выбирает между
357                         нежёстким  методом прогноза-исправления Адамса
358                         (predictor-corrector Adams method) и жёстким методом обратной
359                         дифференциальной формулой (ОДФ) ( Backward Differentiation
360                         Formula (BDF) method). Изначально она применяет нежёсткий метод и
361                         динамически проверяет данные для того, чтобы решить какой метод
362                         использовать.
363                     </para>
364                 </listitem>
365             </varlistentry>
366             <varlistentry>
367                 <term>"adams":</term>
368                 <listitem>
369                     <para>
370                         Используется для нежёстких задач. Вызывается программа
371                         решения <literal>lsode</literal> из пакета ODEPACK, и она
372                         использует метод Адамса.
373                     </para>
374                 </listitem>
375             </varlistentry>
376             <varlistentry>
377                 <term>"stiff":</term>
378                 <listitem>
379                     <para>
380                         Это для жёстких задач. Вызывается программа решения
381                         <literal>lsode</literal> из пакета ODEPACK, и она использует метод
382                         ОДФ.
383                     </para>
384                 </listitem>
385             </varlistentry>
386             <varlistentry>
387                 <term>"rk":</term>
388                 <listitem>
389                     <para>Адаптивный метод Рунге-Кутты 4-го порядка (RK4).</para>
390                 </listitem>
391             </varlistentry>
392             <varlistentry>
393                 <term>"rkf":</term>
394                 <listitem>
395                     <para>
396                         Используется программа Шампайна и Уотса (Shampine и Watts),
397                         основанная на методе Рунге-Кутты-Фелберга пары 4 и 5-го
398                         порядка (RKF45). Она для нежёстких и среднежёстких задач,
399                         когда получаемые вычисления не дороги. Этот метод не следует, в
400                         общем случае, использовать, если пользователь требует
401                         высокую точность.
402                     </para>
403                 </listitem>
404             </varlistentry>
405             <varlistentry>
406                 <term>"fix":</term>
407                 <listitem>
408                     <para>
409                         Та же программа решения, что и <literal>"rkf"</literal>, но
410                         пользовательский интерфейс очень прост, т. е. программе решения
411                         могут быть переданы только параметры <varname>rtol</varname> и
412                         <varname>atol</varname>. Это самый простой метод для пробы.
413                     </para>
414                 </listitem>
415             </varlistentry>
416             <varlistentry>
417                 <term>"root":</term>
418                 <listitem>
419                     <para>
420                         Программа решения ОДУ с возможностью нахождения корней.
421                         Используется программа решения <literal>lsodar</literal> из пакета
422                         ODEPACK. Она является вариантом программы
423                         решения <literal>lsoda</literal>, где она ищет корни заданной
424                         векторной функции. См. справку по <link linkend="ode_root">ode_root</link>.
425                     </para>
426                 </listitem>
427             </varlistentry>
428             <varlistentry>
429                 <term>"discrete":</term>
430                 <listitem>
431                     <para>
432                         Моделирование дискретного времени. См. справку по <link linkend="ode_discrete">ode_discrete</link>.
433                     </para>
434                 </listitem>
435             </varlistentry>
436         </variablelist>
437     </refsection>
438     <refsection>
439         <title>Примеры</title>
440         <para>
441             В следующем примере мы решим обыкновенное дифференциальное уравнение
442             <literal>dy/dt=y^2-y*sin(t)+cos(t)</literal> с начальным условием
443             <literal>y(0)=0</literal>. Используем программу решения по умолчанию.
444         </para>
445         <programlisting role="example"><![CDATA[
446 function ydot=f(t,y)
447         ydot=y^2-y*sin(t)+cos(t)
448 endfunction
449 y0=0;
450 t0=0;
451 t=0:0.1:%pi;
452 y = ode(y0,t0,t,f);
453 plot(t,y)
454  ]]></programlisting>
455         <para>
456             В следующем примере мы решаем уравнение <literal>dy/dt=A*y</literal>.
457             Точное решение равно <literal>y(t)=expm(A*t)*y(0)</literal>, где
458             <literal>expm</literal> - матричная экспонента.
459             Неизвестное равно матрице  <literal>y(t)</literal> размером 2 на 1.
460         </para>
461         <programlisting role="example"><![CDATA[
462 function ydot=f(t,y)
463     ydot=A*y
464 endfunction
465 function J=Jacobian(t,y)
466     J=A
467 endfunction
468 A=[10,0;0,-1];
469 y0=[0;1];
470 t0=0;
471 t=1;
472 ode("stiff",y0,t0,t,f,Jacobian)
473 // Сравним с точным решением:
474 expm(A*t)*y0
475  ]]></programlisting>
476         <para>
477             В следующем примере мы решаем ОДУ <literal>dx/dt = A*x(t) +
478                 B*u(t)
479             </literal>
480             с <literal>u(t)=sin(omega*t)</literal>.
481             Обратите внимание, что дополнительные аргументы <varname>f</varname>:
482             <literal>A</literal>, <literal>u</literal>, <literal>B</literal>,
483             <literal>omega</literal> передаются в <varname>f</varname> в списке.
484         </para>
485         <programlisting role="example"><![CDATA[
486 function xdot=linear(t,x,A,u,B,omega)
487     xdot=A*x+B*u(t,omega)
488 endfunction
489 function ut=u(t,omega)
490     ut=sin(omega*t)
491 endfunction
492 A=[1 1;0 2];
493 B=[1;1];
494 omega=5;
495 y0=[1;0];
496 t0=0;
497 t=[0.1,0.2,0.5,1];
498 ode(y0,t0,t,list(linear,A,u,B,omega))
499  ]]></programlisting>
500         <para>
501             В следующем примере мы решим дифференциальное уравнение Риккати
502             <literal>dX/dt=A'*X + X*A - X'*B*X + C</literal>, где начальное
503             условие  <literal>X(0)</literal> является единичной матрицей 2 на 2.
504         </para>
505         <programlisting role="example"><![CDATA[
506 function Xdot=ric(t,X,A,B,C)
507     Xdot=A'*X+X*A-X'*B*X+C
508 endfunction
509 A=[1,1;0,2];
510 B=[1,0;0,1];
511 C=[1,0;0,1];
512 y0=eye(A);
513 t0=0;
514 t=0:0.1:%pi;
515 X = ode(y0,t0,t,list(ric,A,B,C))
516  ]]></programlisting>
517         <para>
518             В следующем примере мы решаме дифференциальное уравнение
519             <literal>dY/dt=A*Y</literal>, где неизвестная <literal>Y(t)</literal>
520             является матрицей 2 на 2.  Точное решение равно <literal>expm</literal>
521             <literal>Y(t)=expm(A*t)</literal>, где <literal>expm</literal> --
522             матричная экспонента.
523         </para>
524         <programlisting role="example"><![CDATA[
525 function ydot=f(t,y,A)
526     ydot=A*y;
527 endfunction
528 A=[1,1;0,2];
529 y0=eye(A);
530 t0=0;
531 t=1;
532 ode(y0,t0,t,list(f,A))
533 // Сравнение с точным решением
534 expm(A*t)
535 ode("adams",y0,t0,t,f)
536  ]]></programlisting>
537     </refsection>
538     <refsection>
539         <title>С компилятором</title>
540         <para>
541             Следующий пример требует компилятор C.
542         </para>
543         <programlisting role="example"><![CDATA[
544 // ---------- Простое одномерное ОДУ (внешняя функция на языке C)
545 ccode=['#include <math.h>'
546        'void myode(int *n,double *t,double *y,double *ydot)'
547        '{'
548        '  ydot[0]=y[0]*y[0]-y[0]*sin(*t)+cos(*t);'
549        '}']
550 mputl(ccode,TMPDIR+'/myode.c') // создаём C-файл
551 // Компилируем
552 ilib_for_link('myode','myode.c',[],'c',[],TMPDIR+'/loader.sce');
553 exec(TMPDIR+'/loader.sce') // пошаговая компоновка
554 y0=0;
555 t0=0;
556 t=0:0.1:%pi;
557 y = ode(y0,t0,t,'myode');
558
559  ]]></programlisting>
560     </refsection>
561     <refsection role="see also">
562         <title>Смотрите также</title>
563         <simplelist type="inline">
564             <member>
565                 <link linkend="ode_discrete">ode_discrete</link>
566             </member>
567             <member>
568                 <link linkend="ode_root">ode_root</link>
569             </member>
570             <member>
571                 <link linkend="dassl">dassl</link>
572             </member>
573             <member>
574                 <link linkend="impl">impl</link>
575             </member>
576             <member>
577                 <link linkend="odedc">odedc</link>
578             </member>
579             <member>
580                 <link linkend="odeoptions">odeoptions</link>
581             </member>
582             <member>
583                 <link linkend="csim">csim</link>
584             </member>
585             <member>
586                 <link linkend="ltitr">ltitr</link>
587             </member>
588             <member>
589                 <link linkend="rtitr">rtitr</link>
590             </member>
591             <member>
592                 <link linkend="intg">intg</link>
593             </member>
594         </simplelist>
595     </refsection>
596     <refsection>
597         <title>Литература</title>
598         <para>
599             Alan C. Hindmarsh, "lsode and lsodi, two new initial value ordinary
600             differential equation solvers", ACM-Signum newsletter, vol. 15, no. 4
601             (1980), pp. 10-11.
602         </para>
603     </refsection>
604     <refsection>
605         <title>Используемые функции</title>
606         <para>
607             Связанные процедуры могут быть найдены в директории
608             SCI/modules/differential_equations/src/fortran:
609             lsode.f lsoda.f lsodar.f
610         </para>
611     </refsection>
612 </refentry>