首页 文章

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

提问于
浏览
3

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

2 回答

  • 2

    我之前确实遇到过类似的问题,并设法解决了这些问题 . 你的行

    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()
    
  • 1

    这里的主要问题是 lambdify 函数使用 modules 参数来定义所提供函数的可用模块 . 似乎 acotnumpy 名称空间内不可用 .

    让我们简化为简单的事情:

    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))
    

    由于 numpy 未在 numpy 命名空间中定义,因此会引发 NameError . 注意模块参数 . 如果我们将可用模块扩展到 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()
    

相关问题