对于 scipy 中的所有其他求解器,参数顺序x,y
,甚至在odeint
可以通过给出选项来使用此命令tfirst=True
。从而更改为
def eqn(x, y, energy): #array of first order ODE's
y0, y1 = y
y2 = -2*m_el*energy*y0/hbar**2
return [y1,y2]
对于 BVP 求解器,您必须将能量参数视为
具有零导数的额外状态分量,从而添加第三个槽
在边界条件中。西皮的solve_bvp
允许将其保留为参数,
这样你就可以在边界条件中得到 3 个槽,从而可以将一阶导数固定在x=0
从特征空间中选择一个非平凡的解决方案。
def bc(y0, yL, E):
return [ y0[0], y0[1]-1, yL[0] ]
接下来构造一个接近疑似基态的初始状态并调用求解器
x0 = np.linspace(0,L_bohr,6);
y0 = [ x0*(1-x0/L_bohr), 1-2*x0/L_bohr ]
E0 = 134*e_el
sol = solve_bvp(eqn, bc, x0, y0, p=[E0])
print(sol.message, " E=", sol.p[0]/e_el," eV")
然后产生情节
x = np.linspace(0,L_bohr,1000)
plt.plot(x/L_bohr, sol.sol(x)[0]/L_bohr,'-+', ms=1)
plt.grid()
The algorithm converged to the desired accuracy. E= 134.29310361903723 eV