我有一个非常简单的ODE系统,无法准确地进行数值积分。这是原始的ODE:
a*y"(x) - b*y'(x) + c = 0 with (x=0, y=500) and (x=L, dy/dx = 0)
起初,我没有意识到这不是IVP问题,而是BVP问题。因此,当我将其放入要解决的ODE系统中时,它使程序在解决之前最多运行了50分钟。但是由于使用拍摄方法,它仍然可以正确运行(我假设)。因此,现在我一直在尝试使用scipysolve_bvp方法,但不幸的是,有关该文档对我来说用途有限。
def temprhs(x,T,a1,b1,c1,U_coeff):
return [T[1],(-1.0*(b1/a1)*T[0]) + (c1/a1) - ((4.0*U_coeff)/(a1*5.375)*(T[0]-773.15)) ]
def bc(T0, T1):
return np.array([T0[0]-500, T1[1]])
T0 = [500,0]
c1 = abs(710*0.003)
b1 = 2.5 #m/s
a1 = 0.006
U_coeff = 900
x = np.linspace(0, 1, 5)
y_a = np.zeros((2, x.size))
rest = solve_ivp(lambda x, T: temprhs(x,T,a1,b1,c1,U_coeff),[0,1],T0,method = 'BDF', rtol=1e-10,atol=1e-10)
res_a = solve_bvp(lambda x, T: temprhs(x, T,a1=a1, b1=b1, c1=c1,U_coeff=U_coeff),lambda y0, y1: bc(y0, y1), x, y_a)
dtans = res_a.y[1]
y_a = np.zeros((2, x.size))
x_plot = np.linspace(0, 1, 100)
x_plotb = rest.t
y_plot_a = res_a.sol(x_plot)[1]
y_plot_b = rest.y[0]
#plt.plot(x_plot, y_plot_a, label='y_a')
plt.plot(rest.t, rest.y[1],label="Solve_Ivp")
plt.legend()
plt.xlabel("x")
plt.ylabel("y")
plt.show()
`
我在程序中遍历了这些方法,无论我尝试以何种方式使用Solve_bvp,我似乎都无法像我对solve_ivp方法那样紧密地工作。 resolve_ivp方法始终返回合理的值,而bvp方法返回的值是初始值的百万倍。 ** 我的问题是,我如何正确设置Solve_bvp方法以 与我的系统和B.C.s一起使用,最好坚持使用 resolve_ivp方法在计算上似乎非常昂贵且缓慢?
**