我正在用Python编写程序,使用自由ICI方法(目前是SICI方法...但最终将变成自由ICI)来解决薛定谔方程。如果您对此不熟悉,那是因为这个主题几乎没有信息可供参考,并且完全没有可用的样本代码。
这个过程涉及到迭代地得出偏微分方程的解。在这个过程中,需要执行许多符号求导操作。问题在于,随着程序运行,需要进行求导的函数不断变得越来越大,以至于到第五次迭代时,计算符号导数需要耗费大量时间。
我需要加快速度,因为我希望能够完成至少30次迭代,并且在退休之前实现这一点。
我已经删除了不必要的重复计算(或者至少我所知道的那些),这有很大帮助。除此之外,我完全不知道如何加速。
下面是包含正在计算导数的函数的代码(inf_integrate
函数只是复合Simpson方法,因为它比使用SymPy的integrate
方法更快,并且不会由于振荡函数而引发错误):
from sympy import *
def inf_integrate(fun, n, a, b):
f = lambdify(r, fun)
h = (b-a)/n
XI0 = f(a) + f(b)
XI1 = 0
XI2 = 0
for i in range(1, n):
X = a + i*h
if i % 2 == 0:
XI2 = XI2 + f(X)
else:
XI1 = XI1 + f(X)
XI = h*(XI0 + 2*XI2 + 4*XI1)/3
return XI
r = symbols('r')
def H(fun):
return (-1/2)*diff(fun, r, 2) - (1/r)*diff(fun, r) - (1/r)*fun
E1 = symbols('E1')
low = 10**(-5)
high = 40
n = 5000
g = Lambda(r, r)
psi0 = Lambda(r, exp(-1.5*r))
I1 = inf_integrate(4*pi*(r**2)*psi0(r)*H(psi0(r)), n, low, high)
I2 = inf_integrate(4*pi*(r**2)*psi0(r)*psi0(r), n, low, high)
E0 = I1/I2
print(E0)
for x in range(10):
f1 = Lambda(r, psi0(r))
f2 = Lambda(r, g(r)*(H(psi0(r)) - E0*psi0(r)))
Hf1 = Lambda(r, H(f1(r)))
Hf2 = Lambda(r, H(f2(r)))
H11 = inf_integrate(4*pi*(r**2)*f1(r)*Hf1(r), n, low, high)
H12 = inf_integrate(4*pi*(r**2)*f1(r)*Hf2(r), n, low, high)
H21 = inf_integrate(4*pi*(r**2)*f2(r)*Hf1(r), n, low, high)
H22 = inf_integrate(4*pi*(r**2)*f2(r)*Hf2(r), n, low, high)
S11 = inf_integrate(4*pi*(r**2)*f1(r)*f1(r), n, low, high)
S12 = inf_integrate(4*pi*(r**2)*f1(r)*f2(r), n, low, high)
S21 = S12
S22 = inf_integrate(4*pi*(r**2)*f2(r)*f2(r), n, low, high)
eqn = Lambda(E1, (H11 - E1*S11)*(H22 - E1*S22) - (H12 - E1*S12)*(H21 - E1*S21))
roots = solve(eqn(E1), E1)
E0 = roots[0]
C = -(H11 - E0*S11)/(H12 - E0*S12)
psi0 = Lambda(r, f1(r) + C*f2(r))
print(E0)
程序可以正常工作并收敛到预期的结果,但速度太慢。非常感谢任何有助于加快速度的帮助。