Я пишу программу на Python для решения уравнения Шредингера с использованием метода Free ICI (хорошо, метод SICI прямо сейчас ... но во что это превратится Free ICI). Если это не звучит знакомо, то это потому, что по этому вопросу очень мало информации и абсолютно нет примеров кода для работы.
Этот процесс включает в себя итеративное достижение решения уравнения в частных производных. При этом существует много символических производных, которые необходимо выполнить. Проблема заключается в том, что при запуске программы функции, которые необходимо дифференцировать, продолжают увеличиваться и увеличиваться, так что на пятой итерации для вычисления символьных производных требуется очень много времени.
Мне нужно ускорить это, потому что я хотел бы достичь как минимум 30 итераций, и я бы хотел, чтобы это было сделано до выхода на пенсию.
Я прошел и удалил ненужные повторы вычислений (или, по крайней мере, те, которые мне известны), что очень помогло. Кроме того, я абсолютно не знаю, как ускорить процесс.
Вот код, в котором содержится функция, которая вычисляет производные (функция inf_integrate
- это просто метод составного Симпсона, поскольку он намного быстрее, чем использование integrate
в SymPy, и не вызывает ошибок из-за колебаний функции):
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)
Программа работает и точно соответствует ожидаемому результату, но это слишком медленный 1015 *. Любая помощь в ускорении этого процесса очень ценится.