(某些函数)未用 SymPy Lambdify 定义

rb6*_*612 5 python numpy sympy

所以我正在写一个评估泰勒级数的脚本。但是,我希望它评估所有类型的功能。因此,例如,我尝试使用函数acot(x).

x = sy.Symbol('x')
f = acot(x)
...
func = taylor(f,0,3)
taylor_lambda = sy.lambdify(x, func, 'numpy')
Run Code Online (Sandbox Code Playgroud)

以上运行无一例外(除非我使用acsch,例如,它不运行)。

但是当它到达这一行时:

plt.plot(x1,taylor_lambda(x1),label='taylor approximation')
Run Code Online (Sandbox Code Playgroud)

我得到:

NameError: name 'acot' is not defined
Run Code Online (Sandbox Code Playgroud)

我试图在 Lambdify 调用中替换为numpywith 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
Run Code Online (Sandbox Code Playgroud)

And*_*Guy 5

这里的主要问题是该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))
Run Code Online (Sandbox Code Playgroud)

这会引发NameErrorasacot未在numpy命名空间中定义。注意模块参数。如果我们将可用模块扩展到sympy,我们将不再得到NameError

func_lambda = sy.lambdify(x, f, modules=['numpy', 'sympy'])
print(func_lambda(1))
# Prints pi/4
Run Code Online (Sandbox Code Playgroud)

func_name如果您在使用奇怪的函数时遇到问题,您还可以将单个函数作为:对的字典添加到lambdaify模块参数中function

func_lambda = sy.lambdify(x, f, modules=['numpy', {'acot':acot}])
print(func_lambda(1))
# Prints pi/4
Run Code Online (Sandbox Code Playgroud)

就使用 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()
Run Code Online (Sandbox Code Playgroud)


Mis*_*cic 3

我以前确实遇到过类似的问题并已设法解决它们。您的线路

plt.plot(x1,taylor_lambda(x1),label='taylor approximation')
Run Code Online (Sandbox Code Playgroud)

看起来不错。我给了一个我的旧代码,它工作得很好,你可以比较一下。

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()
Run Code Online (Sandbox Code Playgroud)