Попытка построить волновые функции водорода с помощью модуля Sympy - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь построить радиальную часть волновой функции водорода.

Моя идея состояла в том, чтобы использовать sympy.physics.hydrogen.R_nl, а также matplotlib и numpy.

Так какфункция водород.R_nl возвращает строку символов, я пытался использовать метод lambdify для преобразования в функцию, которую я смог бы построить:

import matplotlib.pyplot as plt
import numpy as np
from sympy.abc import n, l, r, Z
from sympy.physics import hydrogen
from sympy.utilities.lambdify import lambdify

R_nl = lambdify((n, l, r, Z), hydrogen.R_nl(n, l, r, Z))

Z = 1
n, l = 1, 0
r = np.linspace(0, 10, 1000)

plt.plot(r, R_nl(n, l, r, Z))

При выполнении я получаю следующую ошибку:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 <ipython-input-4-886beb2c570c> in <module>()
 ---> 13 plot(r, R_nl(n, l, r, Z))

 /anaconda3/lib/python3.6/site-packages/numpy/__init__.py in <lambda>(_Dummy_148, _Dummy_149, _Dummy_150, _Dummy_151)

NameError: name 'factorial' is not defined

Использование sympy.plotting.plot вместо matplotlib.pyplot.plot также не работает.

Заранее благодарен за помощь!

РЕДАКТИРОВАТЬ: Версии пакета I 'm используют sympy = 1.1.1, numpy = 1.14.3 и matplotlib = 2.2.2

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Редактировать: в Sympy есть ошибка

Оказывается, в Sympy есть ошибка, из-за которой lambdify((n, l, r, Z), hydrogen.R_nl(n, l, r, Z)) дает неправильный результат.Я отправил отчет об ошибке .По сути, это приводит к конфликту в подписях assoc_laguerre в Scipy и Sympy.

Пока это не будет исправлено, вам нужно будет lambdify R_nl следующим образом:

lambdify((n, l, r, Z), hydrogen.R_nl(n, l, r, Z), ('numpy', 'math', 'sympy'))

Это явно указывает список модулей, которые lambdify может использовать для оценки функции, которую вы передаете (аналогично коду в разделе обходной путь ниже), и говорит, что не следует использовать Scipy.

Проблема / решение

Ваш код работает как есть.Люди Sympy какое-то время активно исправляли lambdify, поэтому у вас, вероятно, просто старая версия.Вам следует обновить версию Sympy.

Обходной путь

Если вы не можете выполнить обновление, вот обходной путь, который явно скажет lambdify, где найти определение factorial:

import matplotlib.pyplot as plt
import numpy as np
from sympy.abc import n, l, r, Z
from sympy.physics import hydrogen
from sympy.utilities.lambdify import lambdify

R_nl = lambdify((n, l, r, Z), hydrogen.R_nl(n, l, r, Z), ('numpy', 'math', 'sympy'))

Z = 1
n, l = 1, 0
r = np.linspace(0, 10, 1000)

plt.plot(r, R_nl(n, l, r, Z))

Вывод:

enter image description here

0 голосов
/ 16 декабря 2018

Из вашего кода вы хотите добиться оценки функции R_nl для Z = 1, n = 1, l = 0 при различных значениях r.Вот как:

import matplotlib.pyplot as plt
import numpy as np
from sympy.abc import n, l, r, Z
from sympy.physics import hydrogen
from sympy.utilities.lambdify import lambdify

R_nl = lambdify(r, hydrogen.R_nl(1, 0, r, 1))
r = np.linspace(0, 10, 1000)

plt.plot(r, R_nl(r))
...