# 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

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

w, iw

  векторы вещественных значений (ВХОДНЫЕ/ВЫХОДНЫЕ).

ng

  целое число.

g

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

y

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

rd

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

## Описание

С таким синтаксисом (первый аргумент равен `"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("roots",y0,0,2,f,ng,g)

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

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

- dasrt
- ode