Избыточная работа, выполненная по вызову (возможно, неправильный тип dfun) с scipy.integrate.odeintPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Избыточная работа, выполненная по вызову (возможно, неправильный тип dfun) с scipy.integrate.odeint

Сообщение Anonymous »

Я пишу код в Python, который предсказывает уровень энергии водорода, который я буду использовать в качестве шаблона для исследования уровней энергии Quarkonium. Я использую функцию scipy.integrate.odeint () для решения уравнения Shroedinger, и она работает нормально для более низких уровней энергии до n = 6 . Я не ожидаю, что мне нужно будет выйти за рамки этого, но Odeint возвращает избыточную работу, выполненную по этому вызову (возможно, неправильный тип DFUN). < /Code>, которая только побуждает меня расширить то, что я могу предсказать.u'' - (l*(l+1)/r**2 - 2mu_e(E-V_emag(r))) * u = 0
=>
u' = v
v' = ((l*(l+1))/(r**2) - 2.0*mu_e*(E - V_emag(r)))*u
< /code>

Я затем использую scipy.integrate.odeint () < /code> на нем и итерации через энергии и используя другие функции, которые я определил, что оценки точек поворота и узлов в результате. То, как я нахожу уровни энергии, - это найти самое низкое значение E, где количество поворотных точек и узлов соответствует тому, что должно быть; Затем увеличение l на 1 и поиск новой энергии земли, например, Если l = 0 я найду n = 1 энергию и если l = 3 , я найду n = 2 энергия.

, как только код увеличивает до L = 7 , он ничего не возвращает. Диапазон r был расширен, но я пытался сохранить его таким же, чтобы уменьшить количество шагов, но безрезультатно. Код самоучка, поэтому в своем исследовании я читал о якобианских. Боюсь, я еще не выработал, что они есть или если мне это нужно. Есть идеи? < /P>

def v_emag(r):
v = -alpha/r
return v

def s_e(y,r,l,E): #Shroedinger equation for electromagntism
x = numpy.zeros_like(y)
x[0] = y[1]
x[1] = ((l*(l+1))/(r**2) - 2.0*mu_e*(E - V_emag(r)))*y[0]
return x

def i_s_e(l,E,start=0.001,stop=None,step=(0.005*bohr)):
if stop is None:
stop = ((l+1)*30-10)*bohr
r = numpy.arange(start,stop,step)
y = odeint(s_e,y0,r,args=(l,E))
return y

def inormalise_e(l,E,start=0.001,stop=None,step=(0.005*bohr)):
if stop is None:
stop = ((l+1)*30-10)*bohr
r = numpy.arange(start,stop,step)
f = i_s_e(l,E,start,stop,step)[:,0]
f2 = f**2
area = numpy.trapz(f2,x=r)
return f/(numpy.sqrt(area))

def inodes_e(l,E,start=0.001,stop=None,step=(0.005*bohr)):
if stop is None:
stop = ((l+1)*30-10)*bohr
x = i_s_e(l,E,start,stop,step)
r = numpy.arange(start,stop,step)
k=0
for i in range(len(r)-1):
if x[i,0]*x[i+1,0] < 0: #If u value times next u value

Подробнее здесь: https://stackoverflow.com/questions/275 ... ate-odeint
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»