У меня есть следующее выражение: Bg = (pi / H)**2 + (2.405 / R)**2
. В моих вычислениях я хотел бы оставить число с плавающей точкой 2.405
неоцененным, в противном случае я получаю длинные числа с плавающей точкой, разбросанные по всему выражению.
Я подумал, что мог бы использовать sympy UnevaluatedExpr
для представления этого числа с плавающей точкой , Это хорошо сработало для дальнейшего развития моих выражений. Проблема заключается в том, что выражения, содержащие UnevaluatedExpr
, не являются коммутативными, поэтому я не могу использовать такие методы, как solve()
, factor()
, collect()
, ... в противном случае они выдают ошибки с жалобами на некоммутативный характер выражения.
Следующий код показывает, что выражение некоммутативно, потому что я использовал UnevaluatedExpr
.
import sympy as sp
R, H = sp.symbols("R, H", real=True, positive=True)
Bg = (sp.pi / H)**2 + (sp.UnevaluatedExpr(2.405) / R)**2
print(Bg)
print(Bg.is_commutative)
>>> 2.405**2/R**2 + pi**2/H**2
>>> False
, тогда как следующий код показывает, что выражение коммутативно, хотя число с плавающей точкой было оценено :
Bg = (sp.pi / H)**2 + (2.405 / R)**2
print(Bg)
print(Bg.is_commutative)
>>> 5.784025/R**2 + pi**2/H**2
>>> True
Вопросы:
- Может ли
UnevaluatedExpr
и коммутативное поведение быть ошибкой? - Какой лучший способ справиться с числом с плавающей запятой и предотвратить их оценку? Я думал о замене числа символом: это хорошо для моего простого примера, но если я буду работать с большими выражениями, это может быстро превратиться в беспорядок.