所以我正在写一个评估泰勒系列的脚本。但是,我希望它能够评估所有类型的功能。所以我尝试使用函数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调用中用numpy
替换sympy
,但这似乎是象征性的评估。这种情况发生在一些(更罕见的功能)但不适用于其他功能。谢谢!
我的导入如下:
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
答案 0 :(得分:2)
这里的主要问题是lambdify
函数使用modules
参数来定义所提供函数的可用模块。似乎acot
命名空间中没有numpy
。
让我们把它简化为简单的事情:
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
,因为acot
名称空间中未定义numpy
。注意模块参数。如果我们将可用模块扩展到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()
答案 1 :(得分:1)
之前我确实遇到过类似的问题,并设法解决了这些问题。你的行
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()