scipy.integrate.

OdeSolver#

класс scipy.integrate.OdeSolver(fun, t0, y0, t_bound, векторизованный, support_complex=False)[источник]#

Базовый класс для решателей ОДУ.

Для реализации нового решателя необходимо следовать руководствам:

  1. Конструктор должен принимать параметры, представленные в базовом классе (перечисленные ниже), вместе с любыми другими параметрами, специфичными для решателя.

  2. Конструктор должен принимать произвольные дополнительные аргументы **extraneous, но предупреждать, что эти аргументы не имеют значения, используя common.warn_extraneous функции. Не передавайте эти аргументы базовому классу.

  3. Решатель должен реализовать приватный метод _step_impl(self) который продвигает решатель на один шаг дальше. Он должен возвращать кортеж (success, message), где success является логическим значением, указывающим был ли шаг успешным, и message является строкой, содержащей описание ошибки, если шаг завершился неудачно, или None в противном случае.

  4. Решатель должен реализовать приватный метод _dense_output_impl(self), который возвращает DenseOutput объект, охватывающий последний успешный шаг.

  5. Решатель должен иметь атрибуты, перечисленные ниже в разделе Атрибуты. Обратите внимание, что t_old и step_size обновляются автоматически.

  6. Используйте fun(self, t, y) метод для оценки правой части системы, таким образом количество вычислений функции (nfev) будет отслеживаться автоматически.

  7. Для удобства базовый класс предоставляет fun_single(self, t, y) и fun_vectorized(self, t, y) для вычисления правой части в невекторизованном и векторизованном режимах соответственно (независимо от того, как fun из конструктора реализовано). Эти вызовы не увеличивают nfev.

  8. Если решатель использует матрицу Якоби и LU-разложения, он должен отслеживать количество вычислений Якоби (njev) и количество LU-разложений (nlu).

  9. По соглашению, вычисления функций, используемые для аппроксимации конечных разностей Якобиана, не должны учитываться в nfev, таким образом использовать fun_single(self, t, y) или fun_vectorized(self, t, y) при вычислении конечной разности аппроксимации якобиана.

Параметры:
funcallable

Правая часть системы: производная состояния по времени y в момент t. Сигнатура вызова: fun(t, y), где t является скаляром и y является ndarray с len(y) = len(y0). fun должен возвращать массив той же формы, что и y. См. векторизованный для получения дополнительной информации.

t0float

Начальное время.

y0array_like, форма (n,)

Начальное состояние.

t_boundfloat

Граничное время — интегрирование не продолжится за его пределы. Оно также определяет направление интегрирования.

векторизованныйbool

Определяет ли fun может вызываться векторизованно. По умолчанию False.

Если vectorized равно False, fun всегда будет вызываться с y формы (n,), где n = len(y0).

Если vectorized равно True, fun может вызываться с y формы (n, k), где k является целым числом. В этом случае, fun должен вести себя таким образом, что fun(t, y)[:, i] == fun(t, y[:, i]) (т.е. каждый столбец возвращаемого массива является производной по времени состояния, соответствующего столбцу y).

Установка vectorized=True позволяет ускорить аппроксимацию конечными разностями якобиана методами 'Radau' и 'BDF', но приведет к более медленному выполнению для других методов. Также может привести к более медленному общему выполнению для 'Radau' и 'BDF' в некоторых обстоятельствах (например, малых len(y0)).

support_complexbool, необязательно

Следует ли поддерживать интегрирование в комплексной области. Обычно определяется возможностями производного класса решателя. По умолчанию False.

Атрибуты:
nint

Количество уравнений.

statusstring

Текущий статус решателя: ‘running’, ‘finished’ или ‘failed’.

t_boundfloat

Граничное время.

направлениеfloat

Направление интегрирования: +1 или -1.

tfloat

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

yndarray

Текущее состояние.

t_oldfloat

Предыдущее время. None, если шаги ещё не были сделаны.

шаг_размераfloat

Размер последнего успешного шага. None, если шаги ещё не выполнялись.

nfevint

Количество вычислений правых частей системы.

njevint

Количество вычислений Якобиана.

nluint

Количество LU-разложений.

Методы

dense_output()

Вычислить локальный интерполянт на последнем успешном шаге.

step()

Выполнить один шаг интегрирования.