0

我在使用sympy.lambdify. 我有一个相当简单的符号表达式,仅涉及平方根、正弦和余弦以及一些大数(由此处未显示的程序的其他部分生成)。Lambdify 确实适用于单个浮点数,但不适用于 numpy 数组。但是,这些对于以后的绘图非常有帮助。

我得到的错误是

AttributeError: 'float' object has no attribute 'sqrt'

这是一个mwe。请注意,它expr1可以正常工作,而expr2不能。任何解决此问题的帮助将不胜感激。

import sympy
import numpy

x = sympy.symbols('x', real=True)

expr1 = -sympy.sqrt(4*sympy.sin(3*x/4)**2 - 2*sympy.cos(3*x/83) + 5*sympy.cos(2*x/3)**2 + 2)
expr2 = -sympy.sqrt(2.14881349445107e+30*sympy.sin(209178661335919*x/10000000000000)**2 + 13456000000000000000000000000*sympy.cos(209178661335919*x/10000000000000)**2 - 1.40793126300373e+29*sympy.cos(209178661335919*x/10000000000000) + 4.73607234789273e+30)

func1 = sympy.lambdify(x, expr1, modules='numpy')
func2 = sympy.lambdify(x, expr2, modules='numpy')

array = numpy.arange(2)
print(func1(array))
print(func2(array[0]))
print(func2(array[1]))  #works fine until here
print(func2(array))     #fails

python 3.7.3
numpy
1.16.3 sympy 1.14

编辑:
我不能直接修改expr2. 它只是以这种形式出现在此处以提供 mwe。然而,在实际代码中,它被生成为矩阵的特征值,并且需要相当长的时间来计算。

eigenvalues = Matrix.eigenvals()
expr2 = list(eigenvalues.keys())[0]
4

1 回答 1

1

nfloat在将表达式传递给lambdify:之前尝试应用到表达式expr2 = sympy.nfloat(expr1)

于 2019-05-10T06:18:01.047 回答