(某些功能)未使用SymPy Lambdify定义

时间:2017-07-24 06:19:20

标签: python numpy sympy

所以我正在写一个评估泰勒系列的脚本。但是,我希望它能够评估所有类型的功能。所以我尝试使用函数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

2 个答案:

答案 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_namefunction对的字典添加到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()