# impl

дифференциальное алгебраическое уравнение

## Последовательность вызова

    y=impl([type],y0,ydot0,t0,t [,atol, [rtol]],res,adda [,jac])

## Аргументы

y0, ydot0

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

t0

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

t

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

res, adda

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

type

  строка `'adams'` или `'stiff'`

atol, rtol

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

jac

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

## Описание

Решение линейного неявного дифференциального уравнения

A(t,y) dy/dt=g(t,y), y(t0)=y0

`t0` -- начальный момент времени, `y0` -- вектор исходных условий. Должен быть задан вектор `ydot0` -- производная `y` по времени в момент времени `t0`. Входное значение `res` является внешним, т.е. функцией с особым синтаксисом или именем процедуры Fortran или функцией C (символьная строка) с определённой последовательностью вызова или списком.

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

    r = res(t,y,ydot)

где `t` -- вещественный скаляр (время), а `y` и `ydot` являются вещественными векторами (состояние и производная состояния). Эта функция должна возвращать `r=g(t,y)-A(t,y)*ydot`.

Если `res` -- символьная строка, то она ссылается на имя процедуры Fortran или функции C. В качестве примера как это сделать смотрите `SCI/modules/differential_equations/sci_gateway/fortran/Ex-impl.f`.

`res` может быть также списком: см. помощь по ode.

Входное значение `adda` также является внешним.

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

    r = adda(t,y,p)

и она должна возвращать `r=A(t,y)+p`, где `p` -- матрица, которую прибавляют к `A(t,y)`.

Если `adda` является символьной строкой, то она ссылается на имя процедуры Fortran или функции C. В качестве примера как это сделать смотрите `SCI/modules/differential_equations/sci_gateway/fortran/Ex-impl.f`.

`adda` может также быть списком: см. помощь по ode.

Входное значение `jac` также является внешним.

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

    j = jac(t,y,ydot)

и она должна возвращать якобиан `r=g(t,y)-A(t,y)*ydot` относительно `y`.

Если `jac` -- символьная строка, то она ссылается на процедуру Fortran или функцию C. В качестве примера как это сделать смотрите `SCI/modules/differential_equations/sci_gateway/fortran/Ex-impl.f`.

`jac` может быть также списком: см. помощь по ode.

## Примеры

    y=impl([1;0;0],[-0.04;0.04;0],0,0.4,'resid','aplusp');
    // Используем перезапуск налету
    //[x1,w,iw]=impl([1;0;0],[-0.04;0.04;0],0,0.2,'resid','aplusp');
    // запуск налету из предыдущего вызова
    //[x1]=impl([1;0;0],[-0.04;0.04;0],0.2,0.4,'resid','aplusp',w,iw);
    //max(abs(x1-x))

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

- dassl
- ode
- внешняя функция