Смущен по поводу отрицательного числа в симпы - PullRequest
0 голосов
/ 14 января 2020

Я пишу сценарий, в котором я пытаюсь обработать разные числа, появляющиеся в выражении «симпй». Чтобы извлечь то, что мне нужно, я использую что-то похожее на это: isinstance(expr, sympy.numbers.Float), который проверяет, является ли число, появившееся в моем выражении, плавающим. Это работает довольно хорошо для большинства чисел (с плавающей точкой, целых и рациональных чисел). Однако у меня есть некоторые проблемы с отрицательными числами. Например, если я сделаю это:

eq = parse_expr("cos(2*a)+cos(0.5*b)")
srepr(eq)

я получу такой вывод:

Add(cos(Mul(Integer(2), Symbol('a'))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))

, который говорит, что у меня есть целое число, 2 и число с плавающей запятой 0,5, что мне и нужно. Однако, если я сделаю это:

eq = parse_expr("cos(-2*a)+cos(0.5*b)")
srepr(eq)

, я получу этот вывод:

Add(cos(Mul(Integer(2), Symbol('a'))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))

, поэтому в основном знак минус игнорируется. Почему это так, и как я могу заставить его оставить знак минуса и вывести что-то вроде Integer(-2) вместо Integer(2)?

Спасибо!

1 Ответ

6 голосов
/ 14 января 2020

Это не игнорируется, оно было упрощено. Напомним, что функция косинуса является четной функцией, то есть f (-x) = f (x).

Позвольте мне проиллюстрировать, что происходит, если вместо этого она является нечетной функцией.

>>> from sympy import *
>>> eq = parse_expr("cos(-2*a)+cos(0.5*b)")
>>> srepr(eq)
"Add(cos(Mul(Integer(2), Symbol('a'))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))"
>>> eq = parse_expr("sin(-2*a)+cos(0.5*b)")
>>> srepr(eq)
"Add(Mul(Integer(-1), sin(Mul(Integer(2), Symbol('a')))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))"

В последней строке, когда это синус, а не косинус, мы получаем -1.

Примечание: Это результат, если мы установим параметр оценки равным Неверно.

>>> eq = parse_expr("sin(-2*a)+cos(0.5*b)", evaluate = False)
>>> srepr(eq)
"Add(Mul(Integer(-1), sin(Mul(Integer(-2), Integer(-1), Symbol('a')))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...