我能找到的唯一示例/文档在Scipy docs page上。
为了测试,我正在研究一维无限势阱中与时间无关的Schrod方程。通过求解DE并插入ψ(0)= 0,ψ(L)= 0的边界条件可以找到一个整洁的解析解,并且函子soln等于1,但是此问题适用于求解任何BC处的DE我们知道不是初始值。
您可以使用Scipy的solve_ivp进行数值求解,方法是从ψ(0)= 0开始,然后使用解析解决方案作弊以适当放置ψ'(0)。可以使用拍摄方法找到合适的E值,例如上面的归一化条件。
这是两组BC:两者的ψ(0)= 0,两者均归一化,解析方法的第二个ψ值,ivp方法的初始ψ'。 Scipy的resolve_bvp似乎提供了使用数字形式的第一组BC的解决方案(因为我们通过插入ψ'作弊),但我无法使其正常工作。此伪代码描述了问题,也是我期望API表现的方式:
bcs = {0: (0, None), L: (0, None)} # Two BCs on ψ; no BCs on derivative
x_span = (0, L)
sol = solve_bvp(rhs, bcs, x_span)
实际上,代码看起来像这样,但我无法使其正常工作:
def bc(ψ_a, ψ_b):
return np.array([ψ_a[0], ψ_b[0]])
x_span = (0, L)
x_eval = np.linspace(x_span[0], x_span[1], int(1e5))
x_guess = np.array([0, L])
ψ_guess = np.array([[0, 1], [0, -1]])
res = solve_bvp(rhs_1d, bc, x_guess, ψ_guess)
我不知道如何构建bc函数,也不知道为什么以这种方式设置猜测。而且不确定我如何能猜出ψ的值而又不插入ψ'的猜测。 (文档暗示您可以。)另外值得注意的是,文档还显示了一个示例,暗示您也可以将solve_bvp用于规范化BC,但不确定如何处理。 (例子太稀疏了)
等效且有效的ivp代码,供参考:(与我的resolve_bvp伪代码相比)
Python代码:
ψ_0 = (0, sqrt(2/L) * n*π/L)
x_span = (0, L)
sol = solve_ivp(rhs_1d, x_span, ψ_0)
答案 0 :(得分:2)
对于特征值问题
$array1 =array(10,15,20);
$array2 =array(14,13,22);
$array3 =array(12,18,26);
有边界条件
-u''+V(x)u = c*u
和规范化
u(0)=0=u(L)
将积分设置为第三部分。以特征值为参数,这是4维,允许4个边界条件,另外2个是0处的积分为零,L处的积分值为1。
int(u(x)^2, x=0 to L)=1
通过最初的猜测,您大概选择要获得的本征函数/本征值或多或少。
# some length
L = 10;
# some potential function
def V(x): return 1+(2*x-L)**2;
# the ODE function
def odesys(x,y,p):
u,v,S = y; c=p[0]
return [v, (V(x)-c)*u , u**2 ]
# the boundary conditions
def boundary(y0, yL, c):
return [ y0[0], yL[0], y0[2], yL[2]-1 ]
没有必要在猜测中投入太多点,仅需忠实地表示第一个组件的结构即可。
然后使用准备好的数据调用求解器,请注意默认容差为1e-3,如果需要更好的容差,则必须允许进行更精细的细分。如果一切正常,请绘制解决方案。
n=11;
w = (np.pi*n)/L
x_init = np.linspace(0,L,4*n+1);
u_init = np.sin(w*x_init);
v_init = np.cos(w*x_init)*w;
y_init = [ u_init, v_init, x_init/L ]