微分方程在特定点上的解python

Solution of differential equation on specific point python

我有一个微分方程:

from scipy.integrate import odeint
import matplotlib.pyplot as plt

# function that returns dy/dt
def model(y,t):
   k = 0.3
   dydt = -k * y
   return dydt

# initial condition
y0 = 5

# time points
t = np.linspace(0,10)
t1=2
# solve ODE
y = odeint(model,y0,t)

我想在两个不同的点上评估这个微分方程的解。例如我想要 y(t=2) 和 y(t=3).

我可以通过以下方式解决问题:

假设您需要 y(2)。那你,定义

t = np.linspace(0,2)

然后打印

print y[-1]

为了得到y(2)的值。但是我认为这个过程很慢,因为我需要再次做同样的事情来计算 y(3),如果我想要另一个点我需要再次做同样的事情。那么有没有更快的方法来做到这一点?

这不就是:

y = odeint(model, y0, [0, 2, 3])[1:]

third parameter 只是指定了您想要返回的 t 的值。

作为打印结果的示例,我们只需按照上面的内容进行操作:

print(f'y(2) = {y[0,0]}')
print(f'y(3) = {y[1,0]}')

这给了我:

y(2) = 2.7440582441900494
y(3) = 2.032848408317066

这似乎与任意解决方案相同:

5 * np.exp(-0.3 * np.array([2,3]))

如果您将 solve_ivp 与 dense-output 选项一起使用,您可以获得您想要的结果

from scipy.integrate import solve_ivp

# function that returns dy/dt
def model(t,y):
   k = 0.3
   dydt = -k * y
   return dydt

# initial condition
y0 = [5]

# solve ODE
res = solve_ivp(model,[0,10],y0,dense_output=True)
y = lambda t: res.sol(t)[0]

for t in [2,3,3.4]:
    print(f'y({t}) = {y(t)}')

与输出

y(2) = 2.743316182689662
y(3) = 2.0315223673200338
y(3.4) = 1.802238620366918