~ubuntu-branches/ubuntu/raring/scilab/raring-proposed

« back to all changes in this revision

Viewing changes to modules/differential_equations/help/ru_RU/dae.xml

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2012-08-30 14:42:38 UTC
  • mfrom: (1.4.7)
  • Revision ID: package-import@ubuntu.com-20120830144238-c1y2og7dbm7m9nig
Tags: 5.4.0-beta-3-1~exp1
* New upstream release
* Update the scirenderer dep
* Get ride of libjhdf5-java dependency

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
 *
13
13
 -->
14
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:ns3="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="dae" xml:lang="ru">
15
 
  <refnamediv>
16
 
    <refname>dae</refname>
17
 
    <refpurpose>программа решения дифференциальных алгебраических уравнений
18
 
      (ДАУ)
19
 
    </refpurpose>
20
 
  </refnamediv>
21
 
  <refsynopsisdiv>
22
 
    <title>Последовательность вызова</title>
23
 
    <synopsis> 
24
 
      y=dae(initial,t0,t,res) 
25
 
      [y [,hd]]=dae(initial,t0,t [,rtol, [atol]],res [,jac] [,hd])
26
 
      [y,rd]=dae("root",initial,t0,t,res,ng,surface)
27
 
      [y ,rd [,hd]]=dae("root",initial,t0,t [,rtol, [atol]],res [,jac], ng, surface [,hd])
28
 
    </synopsis>
29
 
  </refsynopsisdiv>
30
 
  <refsection>
31
 
    <title>Аргументы</title>
32
 
    <variablelist>
33
 
      <varlistentry>
34
 
        <term>initial</term>
35
 
        <listitem>
36
 
          <para>
37
 
            вектор-столбец. Он может быть равен <literal>x0</literal> или
38
 
            <literal>[x0;xdot0]</literal>, где <literal>x0</literal> -- это
39
 
            значение состояния в начальный момент времени <literal>t0</literal>,
40
 
            а <literal>xdot0</literal> -- значение производной исходного
41
 
            состояния или его оценка (см. ниже).
42
 
          </para>
43
 
        </listitem>
44
 
      </varlistentry>
45
 
      <varlistentry>
46
 
        <term>t0</term>
47
 
        <listitem>
48
 
          <para>вещественное число, исходный момент времени.</para>
49
 
        </listitem>
50
 
      </varlistentry>
51
 
      <varlistentry>
52
 
        <term>t</term>
53
 
        <listitem>
54
 
          <para>Вещественный скаляр или вектор. Указывает моменты времени для
55
 
            которых нужно найти решение. Заметьте, что вы можете получить
56
 
            решение в каждой точке шага ДАУ с помощью установки 
57
 
            <literal>
58
 
              <link linkend="daeoptions">%DAEOPTIONS</link>(2)=1 
59
 
            </literal>
60
 
            .
61
 
          </para>
62
 
        </listitem>
63
 
      </varlistentry>
64
 
      <varlistentry>
65
 
        <term>rtol</term>
66
 
        <listitem>
67
 
          <para>вещественный скаляр или вектор-столбец того же размера, что и
68
 
            <literal>x0</literal>, допуск относительной ошибки. Если
69
 
            <literal>rtol</literal> является вектором, то допуски определяются
70
 
            для каждой составляющей состояния.
71
 
          </para>
72
 
        </listitem>
73
 
      </varlistentry>
74
 
      <varlistentry>
75
 
        <term>atol</term>
76
 
        <listitem>
77
 
          <para>вещественный скаляр или вектор-столбец того же размера, что и
78
 
            <literal>x0</literal>, допуск абсолютной ошибки. Если
79
 
            <literal>atol</literal> является вектором, то допуски определяются
80
 
            для каждой составляющей состояния.
81
 
          </para>
82
 
        </listitem>
83
 
      </varlistentry>
84
 
      <varlistentry>
85
 
        <term>res</term>
86
 
        <listitem>
87
 
          <para>
88
 
            <link linkend="external">внешняя</link> функция, которая
89
 
            вычисляет значение <literal>g(t,y,ydot)</literal>. Она может
90
 
            быть:
91
 
          </para>
92
 
          <variablelist>
93
 
            <varlistentry>
94
 
              <term>функцией Scilab'а</term>
95
 
              <listitem>
96
 
                <para>В этом случае последовательность вызова должна быть
97
 
                  <literal>[r,ires]=res(t,x,xdot)</literal>, а
98
 
                  <literal>res</literal> должна возвращать остаток
99
 
                  <literal>r=g(t,x,xdot)</literal> и флаг ошибки
100
 
                  <literal>ires</literal>.
101
 
                </para>
102
 
                <para>
103
 
                  <literal>ires = 0</literal>, если <literal>res</literal>
104
 
                  смогла вычислить <literal>r</literal>;
105
 
                </para>
106
 
                <para>
107
 
                  <literal>ires = -1</literal>, если остаток для
108
 
                  <literal>g(t,x,xdot)</literal> локально не определён;
109
 
                </para>
110
 
                <para>
111
 
                  <literal>ires =-2</literal>, если параметры находятся
112
 
                  вне допустимого диапазона.
113
 
                </para>
114
 
              </listitem>
115
 
            </varlistentry>
116
 
            <varlistentry>
117
 
              <term>списком</term>
118
 
              <listitem>
119
 
                <para>Эта форма внешней функции используется для передачи
120
 
                  параметров в функцию. Она может иметь следующий вид:
121
 
                </para>
122
 
                <programlisting role="no-scilab-exec"> 
123
 
                  list(res,p1,p2,...)
124
 
                </programlisting>
125
 
                <para>где последовательность вызова функции
126
 
                  <literal>res</literal> теперь
127
 
                </para>
128
 
                <programlisting role="no-scilab-exec"> 
129
 
                  r=res(t,y,ydot,p1,p2,...)
130
 
                </programlisting>
131
 
                <para>
132
 
                  Функция <literal>res</literal> по-прежнему возвращает
133
 
                  значение остатка в виде функции от
134
 
                  <literal>(t,x,xdot,x1,x2,...)</literal>, а <literal>p1,
135
 
                    p2,...
136
 
                  </literal>
137
 
                  являются параметрами функции.
138
 
                </para>
139
 
              </listitem>
140
 
            </varlistentry>
141
 
            <varlistentry>
142
 
              <term>символьной строкой</term>
143
 
              <listitem>
144
 
                <para>она должна ссылаться на имя подпрограммы на языке C или
145
 
                  fortran, в предположении, что
146
 
                  &lt;<literal>r_name</literal>&gt; является заданным
147
 
                  именем.
148
 
                </para>
149
 
                <itemizedlist>
150
 
                  <listitem>
151
 
                    <para>Последовательность вызова Fortran должна быть</para>
152
 
                    <para>
153
 
                      <literal>&lt;r_name&gt;(t, x, xdot, res, ires, rpar,
154
 
                        ipar)
155
 
                      </literal>
156
 
                    </para>
157
 
                    <para>
158
 
                      <literal>t, x(*), xdot(*), res(*), rpar(*)</literal>
159
 
                      имеют удвоенную точность;
160
 
                    </para>
161
 
                    <para>
162
 
                      <literal>ires, ipar(*)</literal> являются
163
 
                      целочисленными.
164
 
                    </para>
165
 
                  </listitem>
166
 
                  <listitem>
167
 
                    <para>Последовательность вызова C должна быть</para>
168
 
                    <para>
169
 
                      <literal>C2F(&lt;r_name&gt;)(double *t, double *x,
170
 
                        double *xdot, double *res, integer *ires, double *rpar,
171
 
                        integer *ipar)
172
 
                      </literal>
173
 
                      ,
174
 
                    </para>
175
 
                  </listitem>
176
 
                </itemizedlist>
177
 
                <para>где</para>
178
 
                <itemizedlist>
179
 
                  <listitem>
180
 
                    <para>
181
 
                      <literal>t</literal> -- текущее значение
182
 
                      времени;
183
 
                    </para>
184
 
                  </listitem>
185
 
                  <listitem>
186
 
                    <para>
187
 
                      <literal>x</literal> -- массив состояния;
188
 
                    </para>
189
 
                  </listitem>
190
 
                  <listitem>
191
 
                    <para>
192
 
                      <literal>xdot</literal> -- массив производных
193
 
                      состояния;
194
 
                    </para>
195
 
                  </listitem>
196
 
                  <listitem>
197
 
                    <para>
198
 
                      <literal>res</literal> -- массив остатков;
199
 
                    </para>
200
 
                  </listitem>
201
 
                  <listitem>
202
 
                    <para>
203
 
                      <literal>ires</literal> -- индикатор
204
 
                      выполнения;
205
 
                    </para>
206
 
                  </listitem>
207
 
                  <listitem>
208
 
                    <para>
209
 
                      <literal>rpar</literal> -- массив целочисленных
210
 
                      значений параметров с плавающей запятой, которые нужны, но
211
 
                      не могут быть установлены с помощью функции
212
 
                      <literal>dae</literal>.
213
 
                    </para>
214
 
                  </listitem>
215
 
                  <listitem>
216
 
                    <para>
217
 
                      <literal>ipar</literal> -- массив целочисленных
218
 
                      значений параметров с плавающей запятой, которые нужны, но
219
 
                      не могут быть установлены с помощью функции
220
 
                      <literal>dae</literal>.
221
 
                    </para>
222
 
                  </listitem>
223
 
                </itemizedlist>
224
 
              </listitem>
225
 
            </varlistentry>
226
 
          </variablelist>
227
 
        </listitem>
228
 
      </varlistentry>
229
 
      <varlistentry>
230
 
        <term>jac</term>
231
 
        <listitem>
232
 
          <para>
233
 
            <link linkend="external">Внешняя</link> функция вычисляет
234
 
            значение <literal>dg/dx+cj*dg/dxdot</literal> для заданного значения
235
 
            параметра <literal>cj</literal>. Она может быть
236
 
          </para>
237
 
          <variablelist>
238
 
            <varlistentry>
239
 
              <term>функцией Scilab'а</term>
240
 
              <listitem>
241
 
                <para>В этом случае последовательность вызова должна быть
242
 
                  <literal>r=jac(t,x,xdot,cj)</literal>, а
243
 
                  <literal>jac</literal> должна возвращать
244
 
                  <literal>r=dg(t,x,xdot)/dy+cj*dg(t,x,xdot)/dxdot</literal>,
245
 
                  где <literal>cj</literal> -- вещественный скаляр.
246
 
                </para>
247
 
              </listitem>
248
 
            </varlistentry>
249
 
            <varlistentry>
250
 
              <term>списком</term>
251
 
              <listitem>
252
 
                <para>Эта форма внешней функции используется для передачи
253
 
                  параметров в функцию. Она может иметь следующий вид:
254
 
                </para>
255
 
                <programlisting role="no-scilab-exec">  
256
 
                  list(jac,p1,p2,...)               
257
 
                </programlisting>
258
 
                <para>где последовательность вызова функции
259
 
                  <literal>jac</literal> теперь
260
 
                </para>
261
 
                <programlisting role="no-scilab-exec"> 
262
 
                  r=jac(t,x,xdot,p1,p2,...)      
263
 
                </programlisting>
264
 
                <para>
265
 
                  Функция <literal>jac</literal> по-прежнему возвращает
266
 
                  <literal>dg/dx+cj*dg/dxdot</literal> как функцию от
267
 
                  <literal>(t, x, xdot, cj, p1, p2,...)</literal>.
268
 
                </para>
269
 
              </listitem>
270
 
            </varlistentry>
271
 
            <varlistentry>
272
 
              <term>символьной строкой</term>
273
 
              <listitem>
274
 
                <para>она должна ссылаться на имя подпрограммы на языке C или
275
 
                  fortran, в предположении, что
276
 
                  &lt;<literal>j_name</literal>&gt; является заданным
277
 
                  именем.
278
 
                </para>
279
 
                <itemizedlist>
280
 
                  <listitem>
281
 
                    <para>Последовательность вызова Fortran должна быть</para>
282
 
                    <para>
283
 
                      <literal>&lt;j_name&gt;(t, x, xdot, r, cj, ires,
284
 
                        rpar, ipar) 
285
 
                      </literal>
286
 
                    </para>
287
 
                    <para>
288
 
                      <literal>t, x(*), xdot(*), r(*), ci,
289
 
                        rpar(*)
290
 
                      </literal>
291
 
                      имеют удвоенную точность;
292
 
                    </para>
293
 
                    <para>
294
 
                      <literal>ires, ipar(*)</literal> являются
295
 
                      целочисленными.
296
 
                    </para>
297
 
                  </listitem>
298
 
                  <listitem>
299
 
                    <para>Последовательность вызова C должна быть</para>
300
 
                    <para>
301
 
                      <literal>C2F(&lt;j_name&gt;)(double *t, double *x,
302
 
                        double *xdot, double *r, double *cj, integer *ires, double
303
 
                        *rpar, integer *ipar)
304
 
                      </literal>
305
 
                      ,
306
 
                    </para>
307
 
                  </listitem>
308
 
                </itemizedlist>
309
 
                <para>
310
 
                  где <literal>t, x, xdot, ires, rpar, ipar</literal>
311
 
                  имеют аналогичное определение, что и выше,
312
 
                  <literal>r</literal> -- массив результатов
313
 
                </para>
314
 
              </listitem>
315
 
            </varlistentry>
316
 
          </variablelist>
317
 
        </listitem>
318
 
      </varlistentry>
319
 
      <varlistentry>
320
 
        <term>surface</term>
321
 
        <listitem>
322
 
          <para>
323
 
            <link linkend="external">Внешняя</link> функция вычисляет
324
 
            значение вектор-столбца <literal>surface(t,x)</literal> с
325
 
            количеством элементов <literal>ng</literal>. Каждый элемент
326
 
            определяет поверхность.
327
 
          </para>
328
 
          <variablelist>
329
 
            <varlistentry>
330
 
              <term>функцией Scilab'а</term>
331
 
              <listitem>
332
 
                <para>В этом случае последовательность вызова должна быть
333
 
                  <literal>r=surface(t,x)</literal>. Эта функция должна вернуть
334
 
                  вектор с <literal>ng</literal> элементами.
335
 
                </para>
336
 
              </listitem>
337
 
            </varlistentry>
338
 
            <varlistentry>
339
 
              <term>списком</term>
340
 
              <listitem>
341
 
                <para>Эта форма внешней функции используется для передачи
342
 
                  параметров в функцию. Она может иметь следующий вид:
343
 
                </para>
344
 
                <programlisting role="no-scilab-exec">  
345
 
                  list(surface,p1,p2,...)
346
 
                </programlisting>
347
 
                <para>где последовательность вызова функции
348
 
                  <literal>surface</literal> теперь имеет вид:
349
 
                </para>
350
 
                <programlisting role="no-scilab-exec"> 
351
 
                  r=surface(t,x,p1,p2,...)
352
 
                </programlisting>
353
 
              </listitem>
354
 
            </varlistentry>
355
 
            <varlistentry>
356
 
              <term>символьной строкой</term>
357
 
              <listitem>
358
 
                <para>она должна ссылаться на имя подпрограммы на языке C или
359
 
                  fortran, в предположении, что
360
 
                  &lt;<literal>s_name</literal>&gt; является заданным
361
 
                  именем.
362
 
                </para>
363
 
                <itemizedlist>
364
 
                  <listitem>
365
 
                    <para>Последовательность вызова Fortran должна быть</para>
366
 
                    <para>
367
 
                      <literal>&lt;j_name&gt;(t, x, xdot, r, cj, ires,
368
 
                        rpar, ipar) 
369
 
                      </literal>
370
 
                    </para>
371
 
                    <para>
372
 
                      <literal>t, x(*), xdot(*), r(*), ci,
373
 
                        rpar(*)
374
 
                      </literal>
375
 
                      имеют удвоенную точность;
376
 
                    </para>
377
 
                    <para>
378
 
                      <literal>ires, ipar(*)</literal> являются
379
 
                      целочисленными.
380
 
                    </para>
381
 
                  </listitem>
382
 
                  <listitem>
383
 
                    <para>Последовательность вызова C должна быть</para>
384
 
                    <para>
385
 
                      <literal>C2F(&lt;j_name&gt;)(double *t, double *x,
386
 
                        double *xdot, double *r, double *cj, integer *ires, double
387
 
                        *rpar, integer *ipar)
388
 
                      </literal>
389
 
                      ,
390
 
                    </para>
391
 
                  </listitem>
392
 
                </itemizedlist>
393
 
                <para>
394
 
                  где <literal>t, x, xdot, ires, rpar, ipar</literal>
395
 
                  имеют аналогичное определение, что и выше,
396
 
                  <literal>ng</literal> -- количество поверхностей,
397
 
                  <literal>nx</literal> -- размерность состояния и
398
 
                  <literal>r</literal> -- массив результатов.
399
 
                </para>
400
 
              </listitem>
401
 
            </varlistentry>
402
 
          </variablelist>
403
 
        </listitem>
404
 
      </varlistentry>
405
 
      <varlistentry>
406
 
        <term>rd</term>
407
 
        <listitem>
408
 
          <para>
409
 
            вектор с двумя элементами <literal>[times num]</literal>, где
410
 
            <literal>times</literal> -- значение момента времени пересечения
411
 
            поверхности, <literal>num</literal> -- число пересечённых
412
 
            поверхностей
413
 
          </para>
414
 
        </listitem>
415
 
      </varlistentry>
416
 
      <varlistentry>
417
 
        <term>hd</term>
418
 
        <listitem>
419
 
          <para>вещественный вектор, в качестве аргумента на выходе он хранит
420
 
            контекст <literal>dae</literal>. Он может быть использован в
421
 
            качестве входного аргумента для возобновления интегрирования
422
 
            (горячий перезапуск).
423
 
          </para>
424
 
        </listitem>
425
 
      </varlistentry>
426
 
      <varlistentry>
427
 
        <term>y</term>
428
 
        <listitem>
429
 
          <para>
430
 
            вещественная матрица. Если 
431
 
            <literal>
432
 
              <link linkend="daeoptions">%DAEOPTIONS</link>(2)=1
433
 
            </literal>
434
 
            ,то каждый
435
 
            столбец является вектором вида <literal>[t;x(t);xdot(t)]</literal>,
436
 
            где <literal>t</literal> -- индекс времени для которого вычислено
437
 
            решение. В противном случае <literal>y</literal> -- вектор вида
438
 
            <literal>[x(t);xdot(t)]</literal>.
439
 
          </para>
440
 
        </listitem>
441
 
      </varlistentry>
442
 
    </variablelist>
443
 
  </refsection>
444
 
  <refsection>
445
 
    <title>Описание</title>
446
 
    <para>
447
 
      Функция <literal>dae</literal> является шлюзом, построенным над
448
 
      функциями <link linkend="dassl">dassl</link> и <link linkend="dasrt">dasrt</link>, разработанными для явного интегрирования
449
 
      дифференциальных уравнений.
450
 
    </para>
451
 
    <programlisting role="no-scilab-exec"> 
452
 
      g(t,x,xdot)=0
453
 
      x(t0)=x0  and   xdot(t0)=xdot0
454
 
    </programlisting>
455
 
    <para>
456
 
      Если <literal>xdot0</literal> не указан в
457
 
      <emphasis>исходном</emphasis> аргументе, то функция <literal>dae</literal>
458
 
      пытается вычислить его решая уравнение
459
 
      <literal>g(t,x0,xdot0)=0</literal>/
460
 
    </para>
461
 
    <para>
462
 
      Если <literal>xdot0</literal> указан в <emphasis>исходном</emphasis>
463
 
      аргументе, то он может быть либо совместимой производной (compatible
464
 
      derivative), удовлетворяющей условию <literal>g(t,x0,xdot0)=0</literal>,
465
 
      либо приближённым значением. В последнем случае <link linkend="daeoptions">%DAEOPTIONS</link>(7) должен быть установлен в
466
 
      1.
467
 
    </para>
468
 
    <para>Конкретные примеры использования внешних функций, написанных на
469
 
      языке Scilab и C, представлены в
470
 
      <literal>modules/differential_equations/tests/unit_tests/dassldasrt.tst</literal>
471
 
    </para>
472
 
  </refsection>
473
 
  <refsection>
474
 
    <title>Примеры</title>
475
 
    <programlisting role="example"> 
476
 
      //Пример с кодом Scilab
477
 
      function [r,ires]=chemres(t,y,yd)
478
 
      r(1) = -0.04*y(1) + 1d4*y(2)*y(3) - yd(1);
479
 
      r(2) =  0.04*y(1) - 1d4*y(2)*y(3) - 3d7*y(2)*y(2) - yd(2);
480
 
      r(3) =       y(1) +     y(2)      + y(3)-1;
481
 
      ires =  0;
482
 
      endfunction
483
 
      function pd=chemjac(x,y,yd,cj)
484
 
      pd=[-0.04-cj , 1d4*y(3)               , 1d4*y(2);
485
 
      0.04    ,-1d4*y(3)-2*3d7*y(2)-cj ,-1d4*y(2);
486
 
      1       , 1                      , 1       ]
487
 
      endfunction
488
 
      
489
 
      x0=[1; 0; 0];
490
 
      xd0=[-0.04; 0.04; 0];
491
 
      t=[1.d-5:0.02:.4, 0.41:.1:4, 40, 400, 4000, 40000, 4d5, 4d6, 4d7, 4d8, 4d9, 4d10];
492
 
      
493
 
      y=dae([x0,xd0],0,t,chemres);// возвращает запрошенные моменты времени наблюдения
494
 
      
495
 
      %DAEOPTIONS=list([],1,[],[],[],0,0); // просит вернуть сетку точек dae
496
 
      y=dae([x0,xd0],0,4d10,chemres); // без якобиана
497
 
      y=dae([x0,xd0],0,4d10,chemres,chemjac); // с якобианом
498
 
      
499
 
      //пример с кодом C (необходим C-компилятор) --------------------------------------------------
500
 
      //-1- создать C-код в TMPDIR - Уравнение Вандерпола, неявная форма
501
 
      code=['#include &lt;math.h&gt;'
502
 
      'void res22(double *t,double *y,double *yd,double *res,int *ires,double *rpar,int *ipar)'
503
 
      '{res[0] = yd[0] - y[1];'
504
 
      ' res[1] = yd[1] - (100.0*(1.0 - y[0]*y[0])*y[1] - y[0]);}'
505
 
      ' '
506
 
      'void jac22(double *t,double *y,double *yd,double *pd,double *cj,double *rpar,int *ipar)'
507
 
      '{pd[0]=*cj - 0.0;'
508
 
      ' pd[1]=    - (-200.0*y[0]*y[1] - 1.0);'
509
 
      ' pd[2]=    - 1.0;'
510
 
      ' pd[3]=*cj - (100.0*(1.0 - y[0]*y[0]));}'
511
 
      ' '
512
 
      'void gr22(int *neq, double *t, double *y, int *ng, double *groot, double *rpar, int *ipar)'
513
 
      '{ groot[0] = y[0];}']
514
 
      mputl(code,TMPDIR+'/t22.c') 
515
 
      
516
 
      //-2- скомпилировать и загрузить его
517
 
      ilib_for_link(['res22' 'jac22' 'gr22'],'t22.c',[],'c',TMPDIR+'/Makefile',TMPDIR+'/t22loader.sce');
518
 
      exec(TMPDIR+'/t22loader.sce')
519
 
      
520
 
      //-3- запустить
521
 
      rtol=[1.d-6;1.d-6];atol=[1.d-6;1.d-4];
522
 
      t0=0;y0=[2;0];y0d=[0;-2];t=[20:20:200];ng=1;
523
 
      
524
 
      //простое моделирование
525
 
      t=0:0.003:300;
526
 
      yy=dae([y0,y0d],t0,t,atol,rtol,'res22','jac22');
527
 
      clf();plot(yy(1,:),yy(2,:))
528
 
      
529
 
      // найти первую точку, где yy(1)=0
530
 
      [yy,nn,hotd]=dae("root",[y0,y0d],t0,300,atol,rtol,'res22','jac22',ng,'gr22');
531
 
      plot(yy(1,1),yy(2,1),'r+')
532
 
      xstring(yy(1,1)+0.1,yy(2,1),string(nn(1)))
533
 
      
534
 
      // горячий перезапуск для следующей точки
535
 
      t01=nn(1);[pp,qq]=size(yy);y01=yy(2:3,qq);y0d1=yy(3:4,qq);
536
 
      [yy,nn,hotd]=dae("root",[y01,y0d1],t01,300,atol,rtol,'res22','jac22',ng,'gr22',hotd);
537
 
      plot(yy(1,1),yy(2,1),'r+')
538
 
      xstring(yy(1,1)+0.1,yy(2,1),string(nn(1)))
539
 
    </programlisting>
540
 
  </refsection>
541
 
  <refsection role="see also">
542
 
    <title>Смотрите также</title>
543
 
    <simplelist type="inline">
544
 
      <member>
545
 
        <link linkend="ode">ode</link>
546
 
      </member>
547
 
      <member>
548
 
        <link linkend="daeoptions">daeoptions</link>
549
 
      </member>
550
 
      <member>
551
 
        <link linkend="dassl">dassl</link>
552
 
      </member>
553
 
      <member>
554
 
        <link linkend="impl">impl</link>
555
 
      </member>
556
 
      <member>
557
 
        <link linkend="fort">fort</link>
558
 
      </member>
559
 
      <member>
560
 
        <link linkend="link">link</link>
561
 
      </member>
562
 
      <member>
563
 
        <link linkend="external">external</link>
564
 
      </member>
565
 
    </simplelist>
566
 
  </refsection>
 
15
    <refnamediv>
 
16
        <refname>dae</refname>
 
17
        <refpurpose>программа решения дифференциальных алгебраических уравнений
 
18
            (ДАУ)
 
19
        </refpurpose>
 
20
    </refnamediv>
 
21
    <refsynopsisdiv>
 
22
        <title>Последовательность вызова</title>
 
23
        <synopsis> 
 
24
            y=dae(initial,t0,t,res) 
 
25
            [y [,hd]]=dae(initial,t0,t [,rtol, [atol]],res [,jac] [,hd])
 
26
            [y,rd]=dae("root",initial,t0,t,res,ng,surface)
 
27
            [y ,rd [,hd]]=dae("root",initial,t0,t [,rtol, [atol]],res [,jac], ng, surface [,hd])
 
28
        </synopsis>
 
29
    </refsynopsisdiv>
 
30
    <refsection>
 
31
        <title>Аргументы</title>
 
32
        <variablelist>
 
33
            <varlistentry>
 
34
                <term>initial</term>
 
35
                <listitem>
 
36
                    <para>
 
37
                        вектор-столбец. Он может быть равен <literal>x0</literal> или
 
38
                        <literal>[x0;xdot0]</literal>, где <literal>x0</literal> -- это
 
39
                        значение состояния в начальный момент времени <literal>t0</literal>,
 
40
                        а <literal>xdot0</literal> -- значение производной исходного
 
41
                        состояния или его оценка (см. ниже).
 
42
                    </para>
 
43
                </listitem>
 
44
            </varlistentry>
 
45
            <varlistentry>
 
46
                <term>t0</term>
 
47
                <listitem>
 
48
                    <para>вещественное число, исходный момент времени.</para>
 
49
                </listitem>
 
50
            </varlistentry>
 
51
            <varlistentry>
 
52
                <term>t</term>
 
53
                <listitem>
 
54
                    <para>Вещественный скаляр или вектор. Указывает моменты времени для
 
55
                        которых нужно найти решение. Заметьте, что вы можете получить
 
56
                        решение в каждой точке шага ДАУ с помощью установки 
 
57
                        <literal>
 
58
                            <link linkend="daeoptions">%DAEOPTIONS</link>(2)=1 
 
59
                        </literal>
 
60
                        .
 
61
                    </para>
 
62
                </listitem>
 
63
            </varlistentry>
 
64
            <varlistentry>
 
65
                <term>rtol</term>
 
66
                <listitem>
 
67
                    <para>вещественный скаляр или вектор-столбец того же размера, что и
 
68
                        <literal>x0</literal>, допуск относительной ошибки. Если
 
69
                        <literal>rtol</literal> является вектором, то допуски определяются
 
70
                        для каждой составляющей состояния.
 
71
                    </para>
 
72
                </listitem>
 
73
            </varlistentry>
 
74
            <varlistentry>
 
75
                <term>atol</term>
 
76
                <listitem>
 
77
                    <para>вещественный скаляр или вектор-столбец того же размера, что и
 
78
                        <literal>x0</literal>, допуск абсолютной ошибки. Если
 
79
                        <literal>atol</literal> является вектором, то допуски определяются
 
80
                        для каждой составляющей состояния.
 
81
                    </para>
 
82
                </listitem>
 
83
            </varlistentry>
 
84
            <varlistentry>
 
85
                <term>res</term>
 
86
                <listitem>
 
87
                    <para>
 
88
                        <link linkend="external">внешняя</link> функция, которая
 
89
                        вычисляет значение <literal>g(t,y,ydot)</literal>. Она может
 
90
                        быть:
 
91
                    </para>
 
92
                    <variablelist>
 
93
                        <varlistentry>
 
94
                            <term>функцией Scilab'а</term>
 
95
                            <listitem>
 
96
                                <para>В этом случае последовательность вызова должна быть
 
97
                                    <literal>[r,ires]=res(t,x,xdot)</literal>, а
 
98
                                    <literal>res</literal> должна возвращать остаток
 
99
                                    <literal>r=g(t,x,xdot)</literal> и флаг ошибки
 
100
                                    <literal>ires</literal>.
 
101
                                </para>
 
102
                                <para>
 
103
                                    <literal>ires = 0</literal>, если <literal>res</literal>
 
104
                                    смогла вычислить <literal>r</literal>;
 
105
                                </para>
 
106
                                <para>
 
107
                                    <literal>ires = -1</literal>, если остаток для
 
108
                                    <literal>g(t,x,xdot)</literal> локально не определён;
 
109
                                </para>
 
110
                                <para>
 
111
                                    <literal>ires =-2</literal>, если параметры находятся
 
112
                                    вне допустимого диапазона.
 
113
                                </para>
 
114
                            </listitem>
 
115
                        </varlistentry>
 
116
                        <varlistentry>
 
117
                            <term>списком</term>
 
118
                            <listitem>
 
119
                                <para>Эта форма внешней функции используется для передачи
 
120
                                    параметров в функцию. Она может иметь следующий вид:
 
121
                                </para>
 
122
                                <programlisting role="no-scilab-exec"> 
 
123
                                    list(res,p1,p2,...)
 
124
                                </programlisting>
 
125
                                <para>где последовательность вызова функции
 
126
                                    <literal>res</literal> теперь
 
127
                                </para>
 
128
                                <programlisting role="no-scilab-exec"> 
 
129
                                    r=res(t,y,ydot,p1,p2,...)
 
130
                                </programlisting>
 
131
                                <para>
 
132
                                    Функция <literal>res</literal> по-прежнему возвращает
 
133
                                    значение остатка в виде функции от
 
134
                                    <literal>(t,x,xdot,x1,x2,...)</literal>, а <literal>p1,
 
135
                                        p2,...
 
136
                                    </literal>
 
137
                                    являются параметрами функции.
 
138
                                </para>
 
139
                            </listitem>
 
140
                        </varlistentry>
 
141
                        <varlistentry>
 
142
                            <term>символьной строкой</term>
 
143
                            <listitem>
 
144
                                <para>она должна ссылаться на имя подпрограммы на языке C или
 
145
                                    fortran, в предположении, что
 
146
                                    &lt;<literal>r_name</literal>&gt; является заданным
 
147
                                    именем.
 
148
                                </para>
 
149
                                <itemizedlist>
 
150
                                    <listitem>
 
151
                                        <para>Последовательность вызова Fortran должна быть</para>
 
152
                                        <para>
 
153
                                            <literal>&lt;r_name&gt;(t, x, xdot, res, ires, rpar,
 
154
                                                ipar)
 
155
                                            </literal>
 
156
                                        </para>
 
157
                                        <para>
 
158
                                            <literal>t, x(*), xdot(*), res(*), rpar(*)</literal>
 
159
                                            имеют удвоенную точность;
 
160
                                        </para>
 
161
                                        <para>
 
162
                                            <literal>ires, ipar(*)</literal> являются
 
163
                                            целочисленными.
 
164
                                        </para>
 
165
                                    </listitem>
 
166
                                    <listitem>
 
167
                                        <para>Последовательность вызова C должна быть</para>
 
168
                                        <para>
 
169
                                            <literal>C2F(&lt;r_name&gt;)(double *t, double *x,
 
170
                                                double *xdot, double *res, integer *ires, double *rpar,
 
171
                                                integer *ipar)
 
172
                                            </literal>
 
173
                                            ,
 
174
                                        </para>
 
175
                                    </listitem>
 
176
                                </itemizedlist>
 
177
                                <para>где</para>
 
178
                                <itemizedlist>
 
179
                                    <listitem>
 
180
                                        <para>
 
181
                                            <literal>t</literal> -- текущее значение
 
182
                                            времени;
 
183
                                        </para>
 
184
                                    </listitem>
 
185
                                    <listitem>
 
186
                                        <para>
 
187
                                            <literal>x</literal> -- массив состояния;
 
188
                                        </para>
 
189
                                    </listitem>
 
190
                                    <listitem>
 
191
                                        <para>
 
192
                                            <literal>xdot</literal> -- массив производных
 
193
                                            состояния;
 
194
                                        </para>
 
195
                                    </listitem>
 
196
                                    <listitem>
 
197
                                        <para>
 
198
                                            <literal>res</literal> -- массив остатков;
 
199
                                        </para>
 
200
                                    </listitem>
 
201
                                    <listitem>
 
202
                                        <para>
 
203
                                            <literal>ires</literal> -- индикатор
 
204
                                            выполнения;
 
205
                                        </para>
 
206
                                    </listitem>
 
207
                                    <listitem>
 
208
                                        <para>
 
209
                                            <literal>rpar</literal> -- массив целочисленных
 
210
                                            значений параметров с плавающей запятой, которые нужны, но
 
211
                                            не могут быть установлены с помощью функции
 
212
                                            <literal>dae</literal>.
 
213
                                        </para>
 
214
                                    </listitem>
 
215
                                    <listitem>
 
216
                                        <para>
 
217
                                            <literal>ipar</literal> -- массив целочисленных
 
218
                                            значений параметров с плавающей запятой, которые нужны, но
 
219
                                            не могут быть установлены с помощью функции
 
220
                                            <literal>dae</literal>.
 
221
                                        </para>
 
222
                                    </listitem>
 
223
                                </itemizedlist>
 
224
                            </listitem>
 
225
                        </varlistentry>
 
226
                    </variablelist>
 
227
                </listitem>
 
228
            </varlistentry>
 
229
            <varlistentry>
 
230
                <term>jac</term>
 
231
                <listitem>
 
232
                    <para>
 
233
                        <link linkend="external">Внешняя</link> функция вычисляет
 
234
                        значение <literal>dg/dx+cj*dg/dxdot</literal> для заданного значения
 
235
                        параметра <literal>cj</literal>. Она может быть
 
236
                    </para>
 
237
                    <variablelist>
 
238
                        <varlistentry>
 
239
                            <term>функцией Scilab'а</term>
 
240
                            <listitem>
 
241
                                <para>В этом случае последовательность вызова должна быть
 
242
                                    <literal>r=jac(t,x,xdot,cj)</literal>, а
 
243
                                    <literal>jac</literal> должна возвращать
 
244
                                    <literal>r=dg(t,x,xdot)/dy+cj*dg(t,x,xdot)/dxdot</literal>,
 
245
                                    где <literal>cj</literal> -- вещественный скаляр.
 
246
                                </para>
 
247
                            </listitem>
 
248
                        </varlistentry>
 
249
                        <varlistentry>
 
250
                            <term>списком</term>
 
251
                            <listitem>
 
252
                                <para>Эта форма внешней функции используется для передачи
 
253
                                    параметров в функцию. Она может иметь следующий вид:
 
254
                                </para>
 
255
                                <programlisting role="no-scilab-exec">  
 
256
                                    list(jac,p1,p2,...)               
 
257
                                </programlisting>
 
258
                                <para>где последовательность вызова функции
 
259
                                    <literal>jac</literal> теперь
 
260
                                </para>
 
261
                                <programlisting role="no-scilab-exec"> 
 
262
                                    r=jac(t,x,xdot,p1,p2,...)      
 
263
                                </programlisting>
 
264
                                <para>
 
265
                                    Функция <literal>jac</literal> по-прежнему возвращает
 
266
                                    <literal>dg/dx+cj*dg/dxdot</literal> как функцию от
 
267
                                    <literal>(t, x, xdot, cj, p1, p2,...)</literal>.
 
268
                                </para>
 
269
                            </listitem>
 
270
                        </varlistentry>
 
271
                        <varlistentry>
 
272
                            <term>символьной строкой</term>
 
273
                            <listitem>
 
274
                                <para>она должна ссылаться на имя подпрограммы на языке C или
 
275
                                    fortran, в предположении, что
 
276
                                    &lt;<literal>j_name</literal>&gt; является заданным
 
277
                                    именем.
 
278
                                </para>
 
279
                                <itemizedlist>
 
280
                                    <listitem>
 
281
                                        <para>Последовательность вызова Fortran должна быть</para>
 
282
                                        <para>
 
283
                                            <literal>&lt;j_name&gt;(t, x, xdot, r, cj, ires,
 
284
                                                rpar, ipar) 
 
285
                                            </literal>
 
286
                                        </para>
 
287
                                        <para>
 
288
                                            <literal>t, x(*), xdot(*), r(*), ci,
 
289
                                                rpar(*)
 
290
                                            </literal>
 
291
                                            имеют удвоенную точность;
 
292
                                        </para>
 
293
                                        <para>
 
294
                                            <literal>ires, ipar(*)</literal> являются
 
295
                                            целочисленными.
 
296
                                        </para>
 
297
                                    </listitem>
 
298
                                    <listitem>
 
299
                                        <para>Последовательность вызова C должна быть</para>
 
300
                                        <para>
 
301
                                            <literal>C2F(&lt;j_name&gt;)(double *t, double *x,
 
302
                                                double *xdot, double *r, double *cj, integer *ires, double
 
303
                                                *rpar, integer *ipar)
 
304
                                            </literal>
 
305
                                            ,
 
306
                                        </para>
 
307
                                    </listitem>
 
308
                                </itemizedlist>
 
309
                                <para>
 
310
                                    где <literal>t, x, xdot, ires, rpar, ipar</literal>
 
311
                                    имеют аналогичное определение, что и выше,
 
312
                                    <literal>r</literal> -- массив результатов
 
313
                                </para>
 
314
                            </listitem>
 
315
                        </varlistentry>
 
316
                    </variablelist>
 
317
                </listitem>
 
318
            </varlistentry>
 
319
            <varlistentry>
 
320
                <term>surface</term>
 
321
                <listitem>
 
322
                    <para>
 
323
                        <link linkend="external">Внешняя</link> функция вычисляет
 
324
                        значение вектор-столбца <literal>surface(t,x)</literal> с
 
325
                        количеством элементов <literal>ng</literal>. Каждый элемент
 
326
                        определяет поверхность.
 
327
                    </para>
 
328
                    <variablelist>
 
329
                        <varlistentry>
 
330
                            <term>функцией Scilab'а</term>
 
331
                            <listitem>
 
332
                                <para>В этом случае последовательность вызова должна быть
 
333
                                    <literal>r=surface(t,x)</literal>. Эта функция должна вернуть
 
334
                                    вектор с <literal>ng</literal> элементами.
 
335
                                </para>
 
336
                            </listitem>
 
337
                        </varlistentry>
 
338
                        <varlistentry>
 
339
                            <term>списком</term>
 
340
                            <listitem>
 
341
                                <para>Эта форма внешней функции используется для передачи
 
342
                                    параметров в функцию. Она может иметь следующий вид:
 
343
                                </para>
 
344
                                <programlisting role="no-scilab-exec">  
 
345
                                    list(surface,p1,p2,...)
 
346
                                </programlisting>
 
347
                                <para>где последовательность вызова функции
 
348
                                    <literal>surface</literal> теперь имеет вид:
 
349
                                </para>
 
350
                                <programlisting role="no-scilab-exec"> 
 
351
                                    r=surface(t,x,p1,p2,...)
 
352
                                </programlisting>
 
353
                            </listitem>
 
354
                        </varlistentry>
 
355
                        <varlistentry>
 
356
                            <term>символьной строкой</term>
 
357
                            <listitem>
 
358
                                <para>она должна ссылаться на имя подпрограммы на языке C или
 
359
                                    fortran, в предположении, что
 
360
                                    &lt;<literal>s_name</literal>&gt; является заданным
 
361
                                    именем.
 
362
                                </para>
 
363
                                <itemizedlist>
 
364
                                    <listitem>
 
365
                                        <para>Последовательность вызова Fortran должна быть</para>
 
366
                                        <para>
 
367
                                            <literal>&lt;j_name&gt;(t, x, xdot, r, cj, ires,
 
368
                                                rpar, ipar) 
 
369
                                            </literal>
 
370
                                        </para>
 
371
                                        <para>
 
372
                                            <literal>t, x(*), xdot(*), r(*), ci,
 
373
                                                rpar(*)
 
374
                                            </literal>
 
375
                                            имеют удвоенную точность;
 
376
                                        </para>
 
377
                                        <para>
 
378
                                            <literal>ires, ipar(*)</literal> являются
 
379
                                            целочисленными.
 
380
                                        </para>
 
381
                                    </listitem>
 
382
                                    <listitem>
 
383
                                        <para>Последовательность вызова C должна быть</para>
 
384
                                        <para>
 
385
                                            <literal>C2F(&lt;j_name&gt;)(double *t, double *x,
 
386
                                                double *xdot, double *r, double *cj, integer *ires, double
 
387
                                                *rpar, integer *ipar)
 
388
                                            </literal>
 
389
                                            ,
 
390
                                        </para>
 
391
                                    </listitem>
 
392
                                </itemizedlist>
 
393
                                <para>
 
394
                                    где <literal>t, x, xdot, ires, rpar, ipar</literal>
 
395
                                    имеют аналогичное определение, что и выше,
 
396
                                    <literal>ng</literal> -- количество поверхностей,
 
397
                                    <literal>nx</literal> -- размерность состояния и
 
398
                                    <literal>r</literal> -- массив результатов.
 
399
                                </para>
 
400
                            </listitem>
 
401
                        </varlistentry>
 
402
                    </variablelist>
 
403
                </listitem>
 
404
            </varlistentry>
 
405
            <varlistentry>
 
406
                <term>rd</term>
 
407
                <listitem>
 
408
                    <para>
 
409
                        вектор с двумя элементами <literal>[times num]</literal>, где
 
410
                        <literal>times</literal> -- значение момента времени пересечения
 
411
                        поверхности, <literal>num</literal> -- число пересечённых
 
412
                        поверхностей
 
413
                    </para>
 
414
                </listitem>
 
415
            </varlistentry>
 
416
            <varlistentry>
 
417
                <term>hd</term>
 
418
                <listitem>
 
419
                    <para>вещественный вектор, в качестве аргумента на выходе он хранит
 
420
                        контекст <literal>dae</literal>. Он может быть использован в
 
421
                        качестве входного аргумента для возобновления интегрирования
 
422
                        (горячий перезапуск).
 
423
                    </para>
 
424
                </listitem>
 
425
            </varlistentry>
 
426
            <varlistentry>
 
427
                <term>y</term>
 
428
                <listitem>
 
429
                    <para>
 
430
                        вещественная матрица. Если 
 
431
                        <literal>
 
432
                            <link linkend="daeoptions">%DAEOPTIONS</link>(2)=1
 
433
                        </literal>
 
434
                        ,то каждый
 
435
                        столбец является вектором вида <literal>[t;x(t);xdot(t)]</literal>,
 
436
                        где <literal>t</literal> -- индекс времени для которого вычислено
 
437
                        решение. В противном случае <literal>y</literal> -- вектор вида
 
438
                        <literal>[x(t);xdot(t)]</literal>.
 
439
                    </para>
 
440
                </listitem>
 
441
            </varlistentry>
 
442
        </variablelist>
 
443
    </refsection>
 
444
    <refsection>
 
445
        <title>Описание</title>
 
446
        <para>
 
447
            Функция <literal>dae</literal> является шлюзом, построенным над
 
448
            функциями <link linkend="dassl">dassl</link> и <link linkend="dasrt">dasrt</link>, разработанными для явного интегрирования
 
449
            дифференциальных уравнений.
 
450
        </para>
 
451
        <programlisting role="no-scilab-exec"> 
 
452
            g(t,x,xdot)=0
 
453
            x(t0)=x0  and   xdot(t0)=xdot0
 
454
        </programlisting>
 
455
        <para>
 
456
            Если <literal>xdot0</literal> не указан в
 
457
            <emphasis>исходном</emphasis> аргументе, то функция <literal>dae</literal>
 
458
            пытается вычислить его решая уравнение
 
459
            <literal>g(t,x0,xdot0)=0</literal>/
 
460
        </para>
 
461
        <para>
 
462
            Если <literal>xdot0</literal> указан в <emphasis>исходном</emphasis>
 
463
            аргументе, то он может быть либо совместимой производной (compatible
 
464
            derivative), удовлетворяющей условию <literal>g(t,x0,xdot0)=0</literal>,
 
465
            либо приближённым значением. В последнем случае <link linkend="daeoptions">%DAEOPTIONS</link>(7) должен быть установлен в
 
466
            1.
 
467
        </para>
 
468
        <para>Конкретные примеры использования внешних функций, написанных на
 
469
            языке Scilab и C, представлены в
 
470
            <literal>modules/differential_equations/tests/unit_tests/dassldasrt.tst</literal>
 
471
        </para>
 
472
    </refsection>
 
473
    <refsection>
 
474
        <title>Примеры</title>
 
475
        <programlisting role="example"> 
 
476
            //Пример с кодом Scilab
 
477
            function [r,ires]=chemres(t,y,yd)
 
478
            r(1) = -0.04*y(1) + 1d4*y(2)*y(3) - yd(1);
 
479
            r(2) =  0.04*y(1) - 1d4*y(2)*y(3) - 3d7*y(2)*y(2) - yd(2);
 
480
            r(3) =       y(1) +     y(2)      + y(3)-1;
 
481
            ires =  0;
 
482
            endfunction
 
483
            function pd=chemjac(x,y,yd,cj)
 
484
            pd=[-0.04-cj , 1d4*y(3)               , 1d4*y(2);
 
485
            0.04    ,-1d4*y(3)-2*3d7*y(2)-cj ,-1d4*y(2);
 
486
            1       , 1                      , 1       ]
 
487
            endfunction
 
488
            
 
489
            x0=[1; 0; 0];
 
490
            xd0=[-0.04; 0.04; 0];
 
491
            t=[1.d-5:0.02:.4, 0.41:.1:4, 40, 400, 4000, 40000, 4d5, 4d6, 4d7, 4d8, 4d9, 4d10];
 
492
            
 
493
            y=dae([x0,xd0],0,t,chemres);// возвращает запрошенные моменты времени наблюдения
 
494
            
 
495
            %DAEOPTIONS=list([],1,[],[],[],0,0); // просит вернуть сетку точек dae
 
496
            y=dae([x0,xd0],0,4d10,chemres); // без якобиана
 
497
            y=dae([x0,xd0],0,4d10,chemres,chemjac); // с якобианом
 
498
            
 
499
            //пример с кодом C (необходим C-компилятор) --------------------------------------------------
 
500
            //-1- создать C-код в TMPDIR - Уравнение Вандерпола, неявная форма
 
501
            code=['#include &lt;math.h&gt;'
 
502
            'void res22(double *t,double *y,double *yd,double *res,int *ires,double *rpar,int *ipar)'
 
503
            '{res[0] = yd[0] - y[1];'
 
504
            ' res[1] = yd[1] - (100.0*(1.0 - y[0]*y[0])*y[1] - y[0]);}'
 
505
            ' '
 
506
            'void jac22(double *t,double *y,double *yd,double *pd,double *cj,double *rpar,int *ipar)'
 
507
            '{pd[0]=*cj - 0.0;'
 
508
            ' pd[1]=    - (-200.0*y[0]*y[1] - 1.0);'
 
509
            ' pd[2]=    - 1.0;'
 
510
            ' pd[3]=*cj - (100.0*(1.0 - y[0]*y[0]));}'
 
511
            ' '
 
512
            'void gr22(int *neq, double *t, double *y, int *ng, double *groot, double *rpar, int *ipar)'
 
513
            '{ groot[0] = y[0];}']
 
514
            mputl(code,TMPDIR+'/t22.c') 
 
515
            
 
516
            //-2- скомпилировать и загрузить его
 
517
            ilib_for_link(['res22' 'jac22' 'gr22'],'t22.c',[],'c',TMPDIR+'/Makefile',TMPDIR+'/t22loader.sce');
 
518
            exec(TMPDIR+'/t22loader.sce')
 
519
            
 
520
            //-3- запустить
 
521
            rtol=[1.d-6;1.d-6];atol=[1.d-6;1.d-4];
 
522
            t0=0;y0=[2;0];y0d=[0;-2];t=[20:20:200];ng=1;
 
523
            
 
524
            //простое моделирование
 
525
            t=0:0.003:300;
 
526
            yy=dae([y0,y0d],t0,t,atol,rtol,'res22','jac22');
 
527
            clf();plot(yy(1,:),yy(2,:))
 
528
            
 
529
            // найти первую точку, где yy(1)=0
 
530
            [yy,nn,hotd]=dae("root",[y0,y0d],t0,300,atol,rtol,'res22','jac22',ng,'gr22');
 
531
            plot(yy(1,1),yy(2,1),'r+')
 
532
            xstring(yy(1,1)+0.1,yy(2,1),string(nn(1)))
 
533
            
 
534
            // горячий перезапуск для следующей точки
 
535
            t01=nn(1);[pp,qq]=size(yy);y01=yy(2:3,qq);y0d1=yy(3:4,qq);
 
536
            [yy,nn,hotd]=dae("root",[y01,y0d1],t01,300,atol,rtol,'res22','jac22',ng,'gr22',hotd);
 
537
            plot(yy(1,1),yy(2,1),'r+')
 
538
            xstring(yy(1,1)+0.1,yy(2,1),string(nn(1)))
 
539
        </programlisting>
 
540
    </refsection>
 
541
    <refsection role="see also">
 
542
        <title>Смотрите также</title>
 
543
        <simplelist type="inline">
 
544
            <member>
 
545
                <link linkend="ode">ode</link>
 
546
            </member>
 
547
            <member>
 
548
                <link linkend="daeoptions">daeoptions</link>
 
549
            </member>
 
550
            <member>
 
551
                <link linkend="dassl">dassl</link>
 
552
            </member>
 
553
            <member>
 
554
                <link linkend="impl">impl</link>
 
555
            </member>
 
556
            <member>
 
557
                <link linkend="fort">fort</link>
 
558
            </member>
 
559
            <member>
 
560
                <link linkend="link">link</link>
 
561
            </member>
 
562
            <member>
 
563
                <link linkend="external">external</link>
 
564
            </member>
 
565
        </simplelist>
 
566
    </refsection>
567
567
</refentry>