ode_root программа решения обыкновенных дифференциальных уравнений с поиском корней

## Синтаксис

    [y, rd, w, iw] = ode("root", y0, t0, t [,rtol [,atol]], f [,jac], ng, g [,w, iw])

## Аргументы

y0

  вектор или матрица вещественных значений (начальные условия).

t0

  вещественный скаляр (начальное время).

t

  вектор вещественных значений (моменты времени, для которых вычисляется решение).

f

  внешняя функция, символьная строка или список.

rtol, atol

  вещественные константы или векторы того же размера, что и `y`.

jac

  внешняя функция, символьная строка или список.

ng

  целое число.

g

  внешняя функция, символьная строка или список.

y

  вещественный вектор или матрица (ВЫХОДНАЯ).

rd

  вещественный вектор (ВЫХОДНОЙ).

w, iw

  векторы вещественных значений. See ode() optional output

## Описание

С таким синтаксисом (первый аргумент равен `"root"`) `ode` вычисляет решение дифференциального уравнения `dy/dt=f(t,y)` до тех пор, пока состояние `y(t)` не пересечёт поверхность `g(t,y)=0`.

`g` должно задавать уравнение поверхности. Это внешняя функция, то есть функция с определённым синтаксисом или имя процедуры Fortran или функции C (символьная строка) с определённой последовательностью вызова или список.

Если `g` является функцией, то её синтаксис должен быть следующим:

    z = g(t,y)

где `t` -- вещественный скаляр (время) и `y` -- вещественный вектор (состояние). Она возвращает вектор размером `ng`, который соответствует `ng` ограничениям. Если `g` -- символьная строка, то она ссылается на имя процедуры Fortran или функции C со следующей последовательностью вызова: `g(n,t,y,ng,gout)`, где `ng` -- количество ограничений, а `gout` -- значение `g` (на выходе программы). Если `g` является списком, то применяются те же договорённости, что и для `f` (см. справку ode).

Выходное значение `rd` -- это вектор размером `1 x k`. Первый элемент хранит время остановки. Остальные элементы указывают какие элементы `g` сменили знак. `k` больше 2 указывает, что одновременно было пересечено более одной поверхности (`(k-1)` поверхностей).

Другие аргументы и другие опции те же самые, что и для `ode`, см. справку по ode.

## Примеры

    // Интегрирование дифференциального уравнения
    // dy/dt=y , y(0)=1, и поиск такого минимального времени t, что y(t)=2
    deff("ydot = f(t,y)", "ydot = y")
    deff("z = g(t,y)", "z = y-2")
    y0 = 1;  ng = 1;
    [y, rd] = ode("root", y0, 0, 2, f, ng, g)

    deff("z = g(t,y)", "z = y-[2;2;33]")
    [y, rd] = ode("root", 1, 0, 2, f, 3, g)

## Смотрите также

- ode
- ode_optional_output
- ode_discrete
- dasrt
- daskr