Проблема с симпатией lamdify с большими числами - PullRequest
0 голосов
/ 09 мая 2019

У меня есть проблема с использованием sympy.lambdify. У меня есть довольно простое символическое выражение, включающее только квадратный корень, синус и косинус и некоторые большие числа (которые генерируются другими частями программы, не показанными здесь). Lambdify работает для одиночных операций с плавающей запятой, но не для пустых массивов. Тем не менее, это было бы очень полезно для построения графика позже.

Я получаю ошибку

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

Вот мве. Обратите внимание, что 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

питон 3.7.3
numpy 1.16.3
Симпи 1.14

EDIT:
Я не могу напрямую изменить expr2. Это только появляется здесь в этой форме, чтобы предоставить mwe. Однако в реальном коде он генерируется как собственное значение матрицы и вычисляется довольно долго.

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

1 Ответ

1 голос
/ 10 мая 2019

Попробуйте применить nfloat к выражению перед передачей его lambdify: expr2 = sympy.nfloat(expr1).

...