首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(某些函数)未使用SymPy Lambdify定义

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

Stack Overflow用户
提问于 2017-07-24 14:19:20
回答 2查看 3.9K关注 0票数 5

所以我正在写一个计算泰勒级数的脚本。但是,我希望它对所有类型的函数都进行计算。因此,例如,我尝试使用函数acot(x)

代码语言:javascript
复制
x = sy.Symbol('x')
f = acot(x)
...
func = taylor(f,0,3)
taylor_lambda = sy.lambdify(x, func, 'numpy')

上面的代码运行时没有异常(除非我使用的是acsch,例如,它没有运行)。

但是当它到达这条线时:

代码语言:javascript
复制
plt.plot(x1,taylor_lambda(x1),label='taylor approximation')

我得到了:

代码语言:javascript
复制
NameError: name 'acot' is not defined

我试图在lambdify调用中用sympy替换numpy,但这似乎是象征性的。这是发生在一些(更罕见的函数),但不是对其他人。谢谢!

我的导入如下:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-24 14:35:57

我以前确实遇到过类似的问题,并设法解决了them.Your行

代码语言:javascript
复制
plt.plot(x1,taylor_lambda(x1),label='taylor approximation')

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

代码语言:javascript
复制
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()
票数 3
EN

Stack Overflow用户

发布于 2017-07-24 14:36:48

这里的主要问题是lambdify函数使用modules参数为所提供的函数定义可用模块。在numpy命名空间中,acot似乎不可用。

让我们将其简化为简单的内容:

代码语言:javascript
复制
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

代码语言:javascript
复制
func_lambda = sy.lambdify(x, f, modules=['numpy', 'sympy'])
print(func_lambda(1))
# Prints pi/4

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

代码语言:javascript
复制
func_lambda = sy.lambdify(x, f, modules=['numpy', {'acot':acot}])
print(func_lambda(1))
# Prints pi/4

至于使用matplotlib进行绘图,对方程进行矢量化,然后进行绘图对我来说是可行的:

代码语言:javascript
复制
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()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45273827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档