所以我正在写一个计算泰勒级数的脚本。但是,我希望它对所有类型的函数都进行计算。因此,例如,我尝试使用函数acot(x)。
x = sy.Symbol('x')
f = acot(x)
...
func = taylor(f,0,3)
taylor_lambda = sy.lambdify(x, func, 'numpy')上面的代码运行时没有异常(除非我使用的是acsch,例如,它没有运行)。
但是当它到达这条线时:
plt.plot(x1,taylor_lambda(x1),label='taylor approximation')我得到了:
NameError: name 'acot' is not defined我试图在lambdify调用中用sympy替换numpy,但这似乎是象征性的。这是发生在一些(更罕见的函数),但不是对其他人。谢谢!
我的导入如下:
import sympy as sy
import numpy as np
from sympy.functions import *
from sympy import pi, E,acot
import matplotlib.pyplot as plt
import math发布于 2017-07-24 14:35:57
我以前确实遇到过类似的问题,并设法解决了them.Your行
plt.plot(x1,taylor_lambda(x1),label='taylor approximation')看起来不错。我给了一个我的旧代码,它工作得很好,你可以比较一下。
from sympy.abc import x
from sympy import sin, series
from sympy.utilities.lambdify import lambdify
import numpy as np
import matplotlib.pyplot as plt
func = sin(x)/x
taylor = series(func, n=6).removeO()
evalfunc = lambdify(x, func, modules=['numpy'])
evaltaylor = lambdify(x, taylor, modules=['numpy'])
t = np.linspace(-7.5, 7.5 , 100)
plt.plot(t, evalfunc(t), 'b', label='sin(x)/x')
plt.plot(t, evaltaylor(t), 'r', label='Taylor')
plt.legend(loc='best')
plt.show()发布于 2017-07-24 14:36:48
这里的主要问题是lambdify函数使用modules参数为所提供的函数定义可用模块。在numpy命名空间中,acot似乎不可用。
让我们将其简化为简单的内容:
import sympy as sy
import numpy as np
from sympy.functions import *
x = sy.Symbol('x')
f = acot(x)
func_lambda = sy.lambdify(x, f, modules='numpy')
print(func_lambda(1))这会引发NameError,因为numpy命名空间中未定义acot。请注意模块参数。如果我们将可用的模块扩展到sympy,我们将不再获得NameError
func_lambda = sy.lambdify(x, f, modules=['numpy', 'sympy'])
print(func_lambda(1))
# Prints pi/4如果您在使用奇怪的函数时遇到问题,还可以将单个函数作为func_name:function对的字典添加到lambdify模块参数中:
func_lambda = sy.lambdify(x, f, modules=['numpy', {'acot':acot}])
print(func_lambda(1))
# Prints pi/4至于使用matplotlib进行绘图,对方程进行矢量化,然后进行绘图对我来说是可行的:
import matplotlib.pyplot as plt
vfunc = np.vectorize(func_lambda)
x1 = np.linspace(-10, 10 , 1000)
plt.plot(x1, vfunc(x1),label='acot')
plt.show()https://stackoverflow.com/questions/45273827
复制相似问题