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