OdeSolver#
- класс scipy.integrate.OdeSolver(fun, t0, y0, t_bound, векторизованный, support_complex=False)[источник]#
Базовый класс для решателей ОДУ.
Для реализации нового решателя необходимо следовать руководствам:
Конструктор должен принимать параметры, представленные в базовом классе (перечисленные ниже), вместе с любыми другими параметрами, специфичными для решателя.
Конструктор должен принимать произвольные дополнительные аргументы
**extraneous, но предупреждать, что эти аргументы не имеют значения, используя common.warn_extraneous функции. Не передавайте эти аргументы базовому классу.Решатель должен реализовать приватный метод _step_impl(self) который продвигает решатель на один шаг дальше. Он должен возвращать кортеж
(success, message), гдеsuccessявляется логическим значением, указывающим был ли шаг успешным, иmessageявляется строкой, содержащей описание ошибки, если шаг завершился неудачно, или None в противном случае.Решатель должен реализовать приватный метод _dense_output_impl(self), который возвращает
DenseOutputобъект, охватывающий последний успешный шаг.Решатель должен иметь атрибуты, перечисленные ниже в разделе Атрибуты. Обратите внимание, что
t_oldиstep_sizeобновляются автоматически.Используйте fun(self, t, y) метод для оценки правой части системы, таким образом количество вычислений функции (nfev) будет отслеживаться автоматически.
Для удобства базовый класс предоставляет fun_single(self, t, y) и fun_vectorized(self, t, y) для вычисления правой части в невекторизованном и векторизованном режимах соответственно (независимо от того, как fun из конструктора реализовано). Эти вызовы не увеличивают nfev.
Если решатель использует матрицу Якоби и LU-разложения, он должен отслеживать количество вычислений Якоби (njev) и количество LU-разложений (nlu).
По соглашению, вычисления функций, используемые для аппроксимации конечных разностей Якобиана, не должны учитываться в 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-разложений.
Методы
Вычислить локальный интерполянт на последнем успешном шаге.
step()Выполнить один шаг интегрирования.