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

时间:2018-12-16 16:53:13

标签: python physics sympy

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

我的想法是使用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

2 个答案:

答案 0 :(得分:2)

编辑: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可以用来评估传递它的功能的模块列表(与下面的替代方法部分中的代码相同),并告诉它不要使用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

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