尝试使用 Sympy 模块绘制氢波函数

Trying to plot hydrogen wave functions using Sympy module

我正在尝试绘制氢波函数的径向部分。

我的想法是使用 sympy.physics.hydrogen.R_nl 以及 matplotlib 和 numpy。

由于 hydrogen.R_nl 函数 returns 是一个符号字符串,我尝试使用 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 也不起作用。

在此先感谢您的帮助!

编辑:我使用的包版本是 sympy=1.1.1、numpy=1.14.3 和 matplotlib=2.2.2

根据您的代码,您想要实现的是在不同的 r 值下针对 Z=1、n=1、l=0 计算函数 R_nl。方法如下:

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))

编辑:Sympy 中存在错误

事实证明,Sympy 中存在一个导致 lambdify((n, l, r, Z), hydrogen.R_nl(n, l, r, Z)) 给出错误结果的错误。我已经提交了 bug report。基本上,它归结为 Scipy 和 Sympy 中 assoc_laguerre 的签名冲突。

在这个问题得到解决之前,您需要像这样对 R_nl 进行 lambdify:

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

这明确指定了模块列表,lambdify 可以使用这些模块来评估您传递给它的函数(与下面 workaround 部分中的代码相同),并告诉它不要使用 Scipy.

problem/solution

您的代码按原样工作。 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))

输出: