scipy.integrate.

ode#

класс scipy.integrate.ode(f, jac=None)[источник]#

Универсальный интерфейсный класс для численных интеграторов.

Решить систему уравнений \(y'(t) = f(t,y)\) с (необязательно) jac = df/dy.

Примечание: Первые два аргумента f(t, y, ...) находятся в противоположном порядке аргументов в функции определения системы, используемой scipy.integrate.odeint.

Параметры:
fcallable f(t, y, *f_args)

Правая часть дифференциального уравнения. t — скаляр, y.shape == (n,). f_args устанавливается вызовом set_f_params(*args). f должен возвращать скаляр, массив или список (не кортеж).

jaccallable jac(t, y, *jac_args), опционально

Якобиан правой части, jac[i,j] = d f[i] / d y[j]. jac_args устанавливается вызовом set_jac_params(*args).

Атрибуты:
tfloat

Текущее время.

yndarray

Текущие значения переменных.

Методы

get_return_code()

Извлекает код возврата для интегрирования, чтобы обеспечить лучший контроль при сбое интегрирования.

integrate(t[, step, relax])

Найти y=y(t), установить y как начальное условие и вернуть y.

set_f_params(*args)

Установить дополнительные параметры для пользовательской функции f.

set_initial_value(y[, t])

Установить начальные условия y(t) = y.

set_integrator(name, **integrator_params)

Установить интегратор по имени.

set_jac_params(*args)

Установить дополнительные параметры для пользовательской функции jac.

set_solout(solout)

Установить вызываемый объект для вызова на каждом успешном шаге интегрирования.

successful()

Проверить, успешна ли интеграция.

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

odeint

интегратор с более простым интерфейсом на основе lsoda из ODEPACK

quad

для нахождения площади под кривой

Примечания

Доступные интеграторы перечислены ниже. Их можно выбрать с помощью set_integrator метод.

“vode”

Решатель обыкновенных дифференциальных уравнений с вещественными коэффициентами, с реализацией фиксированного ведущего коэффициента. Он предоставляет неявный метод Адамса (для нежестких задач) и метод, основанный на формулах обратного дифференцирования (BDF) (для жестких задач).

Источник: http://www.netlib.org/ode/vode.f

Предупреждение

Этот интегратор не является реентерабельным. Вы не можете иметь два ode экземпляры, использующие интегратор "vode" одновременно.

Этот интегратор принимает следующие параметры в set_integrator метод ode класс:

  • atol : float или последовательность абсолютный допуск для решения

  • rtol : float или последовательность относительный допуск для решения

  • lband : None или int

  • uband : None или int Ширина полосы матрицы Якоби, jac[i,j] != 0 для i-lband <= j <= i+uband. Установка этих параметров требует, чтобы ваша функция jac возвращала матрицу Якоби в упакованном формате, jac_packed[i-j+uband, j] = jac[i,j]. Размерность матрицы должна быть (lband+uband+1, len(y)).

  • method: 'adams' или 'bdf' Какой решатель использовать, Адамс (нежесткий) или BDF (жесткий)

  • with_jacobian : bool Эта опция рассматривается только тогда, когда пользователь не предоставил функцию Якобиана и не указал (установкой band), что Якобиан является ленточным. В этом случае, with_jacobian определяет, является ли метод итерации шага коррекции решателя ОДУ хордовой итерацией с внутренне сгенерированной полной матрицей Якоби или функциональной итерацией без матрицы Якоби.

  • nsteps : int Максимальное количество (внутренне определённых) шагов, разрешённых за один вызов решателя.

  • first_step : float

  • min_step : float

  • max_step : float Ограничения для размеров шага, используемых интегратором.

  • order : int Максимальный порядок, используемый интегратором, order <= 12 для Адамса, <= 5 для BDF.

“zvode”

Решатель комплекснозначных обыкновенных дифференциальных уравнений с переменными коэффициентами, с реализацией фиксированного ведущего коэффициента. Предоставляет неявный метод Адамса (для нежестких задач) и метод, основанный на формулах обратного дифференцирования (BDF) (для жестких задач).

Источник: http://www.netlib.org/ode/zvode.f

Предупреждение

Этот интегратор не является реентерабельным. Вы не можете иметь два ode экземпляров, использующих интегратор «zvode» одновременно.

Этот интегратор принимает те же параметры в set_integrator в качестве решателя "vode".

Примечание

При использовании ZVODE для жёсткой системы, его следует применять только в случае, когда функция f аналитическая, то есть когда каждая f(i) является аналитической функцией от каждого y(j). Аналитичность означает, что частная производная df(i)/dy(j) — это уникальное комплексное число, и этот факт критически важен для того, как ZVODE решает плотные или ленточные линейные системы, возникающие в жёстком случае. Для комплексной жёсткой системы ОДУ, в которой f не аналитическая, ZVODE, вероятно, будет иметь сбои сходимости, и для такой задачи следует использовать DVODE на эквивалентной вещественной системе (в вещественных и мнимых частях y).

“lsoda”

Решатель обыкновенных дифференциальных уравнений с вещественными коэффициентами, с реализацией фиксированного ведущего коэффициента. Обеспечивает автоматическое переключение методов между неявным методом Адамса (для нежестких задач) и методом на основе формул обратного дифференцирования (BDF) (для жестких задач).

Источник: http://www.netlib.org/odepack

Предупреждение

Этот интегратор не является реентерабельным. Вы не можете иметь два ode экземпляры, используя интегратор "lsoda" одновременно.

Этот интегратор принимает следующие параметры в set_integrator метод ode класс:

  • atol : float или последовательность абсолютный допуск для решения

  • rtol : float или последовательность относительный допуск для решения

  • lband : None или int

  • uband : None или int Ширина полосы Якобиана, jac[i,j] != 0 для i-lband <= j <= i+uband. Установка этих значений требует, чтобы ваша функция jac возвращала якобиан в упакованном формате, jac_packed[i-j+uband, j] = jac[i,j].

  • with_jacobian : bool Не используется.

  • nsteps : int Максимальное количество (внутренне определённых) шагов, разрешённых за один вызов решателя.

  • first_step : float

  • min_step : float

  • max_step : float Ограничения для размеров шага, используемых интегратором.

  • max_order_ns : int Максимальный порядок, используемый в нежёстком случае (по умолчанию 12).

  • max_order_s : int Максимальный порядок, используемый в жестком случае (по умолчанию 5).

  • max_hnil : int Максимальное количество сообщений о слишком малом размере шага (t + h = t) (по умолчанию 0)

  • ixpr : int Определяет, нужно ли генерировать дополнительную печать при переключении методов (по умолчанию False).

"dopri5"

Это явный метод Рунге-Кутты порядка (4)5, предложенный Дорманом и Принсом (с контролем шага и плотным выводом).

Авторы:

E. Hairer и G. Wanner Университет Женевы, Департамент математики CH-1211 Женева 24, Швейцария e-mail: ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch

Этот код описан в [HNW93].

Этот интегратор принимает следующие параметры в методе set_integrator() класса ode:

  • atol : float или последовательность абсолютный допуск для решения

  • rtol : float или последовательность относительный допуск для решения

  • nsteps : int Максимальное количество (внутренне определённых) шагов, разрешённых за один вызов решателя.

  • first_step : float

  • max_step : float

  • safety : float Коэффициент безопасности при выборе нового шага (по умолчанию 0.9)

  • ifactor : float

  • dfactor : float Максимальный коэффициент увеличения/уменьшения размера шага за один шаг

  • beta : float Бета-параметр для стабилизированного контроля размера шага.

  • verbosity : int Переключатель для вывода сообщений (< 0 для отключения сообщений).

“dop853”

Это явный метод Рунге-Кутты порядка 8(5,3), предложенный Дорманом и Принсом (с контролем шага и плотным выводом).

Опции и ссылки те же, что и для “dopri5”.

Ссылки

[HNW93]

Э. Хайрер, С.П. Норсетт и Г. Ваннер, Решение обыкновенных дифференциальных уравнений I. Нежесткие задачи. 2-е издание. Серия вычислительной математики Springer, Springer-Verlag (1993)

Примеры

Задача для интегрирования и соответствующая якобиан:

>>> from scipy.integrate import ode
>>>
>>> y0, t0 = [1.0j, 2.0], 0
>>>
>>> def f(t, y, arg1):
...     return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
>>> def jac(t, y, arg1):
...     return [[1j*arg1, 1], [0, -arg1*2*y[1]]]

Интегрирование:

>>> r = ode(f, jac).set_integrator('zvode', method='bdf')
>>> r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
>>> t1 = 10
>>> dt = 1
>>> while r.successful() and r.t < t1:
...     print(r.t+dt, r.integrate(r.t+dt))
1 [-0.71038232+0.23749653j  0.40000271+0.j        ]
2.0 [0.19098503-0.52359246j 0.22222356+0.j        ]
3.0 [0.47153208+0.52701229j 0.15384681+0.j        ]
4.0 [-0.61905937+0.30726255j  0.11764744+0.j        ]
5.0 [0.02340997-0.61418799j 0.09523835+0.j        ]
6.0 [0.58643071+0.339819j 0.08000018+0.j      ]
7.0 [-0.52070105+0.44525141j  0.06896565+0.j        ]
8.0 [-0.15986733-0.61234476j  0.06060616+0.j        ]
9.0 [0.64850462+0.15048982j 0.05405414+0.j        ]
10.0 [-0.38404699+0.56382299j  0.04878055+0.j        ]