我正在尝试绘制氢波函数的径向部分。
我的想法是使用sympy.physics.hydrogen.R_nl以及matplotlib和numpy。
由于hydrogen.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也不起作用。
在此先感谢您的帮助!
编辑:我正在使用的软件包版本是sympy = 1.1.1,numpy = 1.14.3和matplotlib = 2.2.2
答案 0 :(得分:2)
结果发现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
可以用来评估传递它的功能的模块列表(与下面的替代方法部分中的代码相同),并告诉它不要使用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))
输出:
答案 1 :(得分:1)
根据您的代码,要实现的是在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))