尝试使用 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))
输出:
我正在尝试绘制氢波函数的径向部分。
我的想法是使用 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))
输出: