我正在尝试使用python v2.45
函数求解微分方程,并将其与mathcad解决方案进行比较。
所以我的条件是scipy.integrate.odeint
,我遇到的问题是u'' + 0.106u'+ 0.006u = 0,
的初始条件。我不知道如何设置u(0)=0 and u'(1)=1
。
u'(1)=1
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import numpy as np
def eq(u,t):
return [u[1], -0.106*u[1]-0.006*u[0]] #return u' and u''
time = np.linspace(0, 10)
u0 = [0,1] # initial conditions
Z = odeint(eq,u0,time) </code>
plt.plot(time, Z)
plt.xticks(range(0,10))
plt.grid(True)
plt.xlabel('time')
plt.ylabel('u(t)')
plt.show()
https://pp.userapi.com/c850032/v850032634/108079/He1JsQonhpk.jpg
是标准具。
https://pp.userapi.com/c850032/v850032634/10809c/KB_HDekc8Fk.jpg
看起来确实相似,但显然u(t)是错误的。
答案 0 :(得分:0)
这是一个边值问题,您需要使用solve_bvp
from scipy.integrate import solve_bvp, solve_ivp
import matplotlib.pyplot as plt
import numpy as np
def eq(t,u): return [u[1], -0.106*u[1]-0.006*u[0]] #return u' and u''
def bc(u0,u1): return [u0[0], u1[1]-1 ]
res = solve_bvp(eq, bc, [0,1], [[0,1],[1,1]], tol=1e-3)
print res.message
# plot the piecewise polynomial interpolation,
# using the last segment for extrapolation
time = np.linspace(0, 10, 501)
plt.plot(time, res.sol(time)[0], '-', lw=2, label="BVP extrapolated")
# solve the extended solution as IVP solution on [1,10]
ivp = solve_ivp(eq, time[[0,-1]], res.y[:,0], t_eval=time)
plt.plot(time, ivp.y[0], '-', lw=2, label="IVP from BVP IC")
# plot decorations
plt.xticks(range(0,11))
plt.grid(True)
plt.legend()
plt.xlabel('time')
plt.ylabel('u(t)')
plt.show()
请注意,连续是通过从给定间隔[0,1]到[0,10]进行外推而得出的,值为1的值的容差为1e-3。因此,通过使用solve_ivp
将t = 1时的计算值作为初始值,可以在较大的间隔内获得更好的结果。本例中的差异约为0.01。