sympy:Lambdify不转换sqrt表达式

时间:2017-05-30 15:47:11

标签: python numpy sympy

我尝试对一些计算出的特征值进行lambdify,但是我得到了以下错误。

File "<string>", line 1, in <lambda>
AttributeError: 'Symbol' object has no attribute 'sqrt'

为了避免命名空间冲突(在本文What causes this error (AttributeError: 'Mul' object has no attribute 'cos') in Python?中解释),我使用了以下导入命令而不是from sympy import *

import sympy as sp
import numpy as np

def calculate_general_eigenvalues():
    Y, Z = sp.symbols("Y,Z")
    Rzy = sp.symbols("Rzy", positive=True)

    eigenvalues = [Y + Z,Rzy*Y + sp.sqrt(Rzy*Z)]

    print("eigenvalues of the system ")
    print(eigenvalues[0])
    print(eigenvalues[1])
    lam1 = sp.lambdify((Y,Z), eigenvalues[0] ,modules=['numpy'])
    lam2 = sp.lambdify((Y,Z), eigenvalues[1] ,modules=["numpy", {'sqrt': np.sqrt}])
    print(lam1(1,1))
    print(lam2(1,1))


    return (lam1,lam2)


l1,l2 = calculate_general_eigenvalues()

我还在这里找到了第二个提示(Python: SymPy lambdify abs for use with NumPy),如果它们包含命令lambdify(x, f(x), ["numpy", {'Abs': numpy.abs}]),但它在我的代码中不起作用,你可以看到

如何解决我的问题?

1 个答案:

答案 0 :(得分:1)

问题不在于sqrt。你的第二个特征值涉及Rzy,当你对它进行诽谤时你没有包含在变量中。修复此问题,它只适用于modules="numpy"。没有必要重新映射sqrt:NumPy知道sqrt,它只是不知道如何将它应用于像Rzy这样的符号。

lam1 = sp.lambdify((Y,Z), eigenvalues[0], modules='numpy')
lam2 = sp.lambdify((Y,Z,Rzy), eigenvalues[1], modules='numpy')
print(lam1(1,1))
print(lam2(1,1,1))