Интеграция ODE с дискретизированными значениями

Я хочу использовать scipy.integrate.ode решатель. Я могу определить вызываемую функцию f только как массив дискретных точек (потому что это зависит от результатов интегрирования из предыдущих итераций). Но из документации кажется, что интегратор ожидает, что вызываемая функция будет непрерывной. Я полагаю, что какая-то интерполяция должна быть сделана. Может ли решатель справиться с этим самостоятельно или мне нужно написать некоторую процедуру интерполяции? Есть какая-нибудь скучная документация / учебник, объясняющий это?

1 ответ

Решение

Да, вызываемый объект должен быть функцией, которая возвращает производную для любого значения, предоставленного функции. Если у вас есть функция interp который выполняет интерполяцию, вы можете определить вызываемый объект следующим образом:

f = lambda t,y: interp(y, yvalues, fvalues)

Если ваша система скалярная, вы можете использовать numpy.interp функционировать как в следующем примере:

import numpy
from scipy import integrate
yvalues = numpy.arange(-2,3,0.1)
fvalues = - numpy.sin(yvalues)
f = lambda t,y: numpy.interp(y, yvalues, fvalues)
r = integrate.ode(f)
r.set_initial_value(1)
t1 = 10
dt = 0.1
while r.successful() and r.t < t1:
    r.integrate(r.t+dt)
    print r.t, r.y

Для многомерной системы интерполяция очень сложна. Если есть какой-либо способ вычислить производную на лету в данной точке, это, вероятно, проще реализовать, чем с помощью интерполяции.

Как указывает unutbu в комментарии, вы получите неправильное решение в течение достаточно большого времени с хаотической системой, если будете интерполировать. Однако, поскольку то же самое верно для любого алгоритма численного решения, с этим трудно что-либо сделать.

Другие вопросы по тегам