如何用symphy简化复常数的表达式?

2024-05-20 20:41:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我用symphy做了一些计算,结果是一组常数。其中一个直接插入到下面的代码片段中:

from sympy import *
expr = (18**(Rational(1, 3))/(6*(3 + sqrt(3)*I)**(Rational(1, 3)))
        + 12**(Rational(1, 3))*(3 + sqrt(3)*I)**(Rational(1, 3))/12)
print(expr.evalf())
print(expr.simplify())

这又回来了

0.56857902130163 + 0.e-22*I
18**(1/3)/(6*(3 + sqrt(3)*I)**(1/3)) + (36 + 12*sqrt(3)*I)**(1/3)/12

所以这个表达式看起来是一个实数,但是sympy不能进一步简化它。用笔和纸,我把它简化成

cos(pi/18) / sqrt(3)

evalf()返回的数值一致。

我尝试了许多不同的简化函数,但似乎没有一个能够进一步简化表达式。使用替换,如

expr.subs(3 + sqrt(3)*I, sqrt(12) * exp(I*pi/6))

改进了表达式,但仍然同情无法断定它是真实的。用欧拉公式代换

expr.subs(3 + sqrt(3)*I, sqrt(12) * (cos(pi/6) + I*sin(pi/6)))

sympy最终能够得出这样的结论:表达式是真实的,但是在打印时表达式本身的大小会爆炸(即使我在替换之后尝试simplify)。

有没有更好的方法来减少这种情况?我有很多类似的复杂常数表达式,我想知道它们是否真实。


Tags: 代码from表达式pi常数sqrtcossimplify