微分方程在特定点上的解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
我有一个微分方程:
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