Где настоящая ошибка в моем алогорифме Новерова уравнение Шредингера?[Физика]

#python #physics

#python #физика

Вопрос:

Я решаю уравнение Шредингера с помощью теоремы Новерова. Итак, мой первоначальный вопрос проекта: решите уравнение Шредингера s-образной волны для основного состояния и первого возбужденного состояния атома водорода:

D ^ 2y 2(E-V (r))y = 0, D = d / dr

а потенциал равен V (r) = -1 / r

Но я хочу сделать программу программой, которая автоматически вычисляет собственные энергии и использует единицы hatree и пересматривает ее: вот мой код :

 import numpy as np
import matplotlib.pyplot as plt
dom=[0.001,5]
n=10
r,dr=np.linspace(dom[0],dom[1],n,retstep=True)
def Potential(x,E):
    energy=2*(E (1/x))
    return energy
i=0
E=-2
s0i=0.0
s1i=0.0001
si=np.zeros(n)
indi=0
while i==0:
    si[0]=s0i
    si[1]=s1i
    for j in range(0,n-2,1):
        f0c=((dr**2)*Potential(x=r[j],E=E))/12.0
        f1c=((dr**2)*Potential(x=r[j 1],E=E))/12.0
        f2c=((dr**2)*Potential(x=r[j 2],E=E))/12.0

        s2i=((2*(1-5*f1c)*s1i)-((1 f0c)*s0i))/(1 f2c)
        s1i=s2i
        s0i=s1i
        si[j 2]=s2i
    if abs(s2i)<=1e-18:
        i=1
    elif s2i>1e-18:
        E=E-0.1
    elif s2i<-1e-18:
        E=E 0.1
    elif(indi==500):
        i=1

    print('loop Count : ',indi,'Energy : ',E,'last Pshi',si[-1])
    indi =1
    
print(len(r),len(si))
plt.plot(r,si)
plt.show()
 

Я не понял, в чем проблема, и я получил какой-то веселый результат. Поэтому, пожалуйста, помогите мне сделать это.

Ответ №1:

Я вижу, вы говорите по-голландски. Поэтому я надеюсь, что хорошо, что я отвечаю на своем родном языке.

Je weet dat er een sympy module is waarmee je het ook kan oplossen? Het is al geschreven code die het voor je oplost.

 from sympy.physics.hydrogen import E_nl
from sympy.abc import n, Z

E_nl(n, Z)    # output: -Z**2/(2*n**2)
              # Z = atoomnummer       n = het quantum getal
              # Z=1 (hydrogen) bij default kan je veranderen trouwens
E_nl(1)       # output: -1/2

E_nl(2)       # output: -1/8

E_nl(3)       # output: -1/18

E_nl(3, 47)   # output: -2209/18

 

Maar uiteraard is het ook interessant om je eigen code te schrijven.
In je code ontstaat er een overflow
aangezien het deze errror geeft:

 RuntimeWarning: overflow encountered in double_scalars
 

en als je kijkt naar de antwoorden is dat niet heel raar.

 loop Count :  78 Energy :  -2.1 last Pshi 1.9967193884115876e 306
loop Count :  79 Energy :  -2.1 last Pshi NaN
 

dat betekent dus een 1 met 306 nullen er achter…. erg groot getal, en het wijkt steeds verder van van de verwachte -1/2. Dus ergens loopt ie verkeerd door jouw berekening heen. Zou je de berekening duidelijker kunnen uitschrijven?