您如何只为Scipy的bvp提供BC?

时间:2018-10-29 21:09:24

标签: python scipy numerical-methods differential-equations

我能找到的唯一示例/文档在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)

1 个答案:

答案 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 ]

enter image description here