Sympy 根函数创建巨大的三角表达式

问题描述 投票:0回答:1

我试图在 python sympy 中找到这个方程的根:

roots(-64*x**7 + 112*x**5 - 56*x**3 + 7*x)
我为这个结果的答案设置了一个域,只得到一个答案

代数上对应于大约。

 0.433883739117558
,

等于

sqrt(7/12 - (7^(2/3) (1 + i sqrt(3)))/(12 2^(2/3) (-1 + 3 i sqrt(3))^(1/3)) - 1/24 (1 - i sqrt(3)) (7/2 (-1 + 3 i sqrt(3)))^(1/3))

但是 sympy 向我抛出了这个表情:

sqrt(6)*(-56*sqrt(7)*cos(atan(3*sqrt(3))/3)**3 - 56*sqrt(7)*cos(atan(3*sqrt(3))/3)**3*cos(2*atan(3*sqrt(3))/3) - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3)*cos(atan(3*sqrt(3))/3)**2 - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3) - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)**3*sin(2*atan(3*sqrt(3))/3) + 28*sin(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3)**2 + 28*sin(atan(3*sqrt(3))/3)**2*sin(2*atan(3*sqrt(3))/3)**2 + 28*sin(atan(3*sqrt(3))/3)**2 + 56*sin(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3) + 196*sin(atan(3*sqrt(3))/3)**4 + 28*cos(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3)**2 + 28*sin(2*atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3)**2 + 28*cos(atan(3*sqrt(3))/3)**2 + 56*cos(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3) + 392*sin(atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3)**2 + 196*cos(atan(3*sqrt(3))/3)**4)**(1/4)*cos(atan(-2*sqrt(7)*sin(2*atan(3*sqrt(3))/3)*cos(atan(3*sqrt(3))/3)/(-2*sqrt(7)*cos(atan(3*sqrt(3))/3) - 2*sqrt(7)*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3) + 14*sin(atan(3*sqrt(3))/3)**2 + 14*cos(atan(3*sqrt(3))/3)**2) + 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3)/(-2*sqrt(7)*cos(atan(3*sqrt(3))/3) - 2*sqrt(7)*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3) + 14*sin(atan(3*sqrt(3))/3)**2 + 14*cos(atan(3*sqrt(3))/3)**2) + 2*sqrt(7)*sin(atan(3*sqrt(3))/3)/(-2*sqrt(7)*cos(atan(3*sqrt(3))/3) - 2*sqrt(7)*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3) + 14*sin(atan(3*sqrt(3))/3)**2 + 14*cos(atan(3*sqrt(3))/3)**2))/2)/12 + sqrt(6)*I*(-56*sqrt(7)*cos(atan(3*sqrt(3))/3)**3 - 56*sqrt(7)*cos(atan(3*sqrt(3))/3)**3*cos(2*atan(3*sqrt(3))/3) - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3)*cos(atan(3*sqrt(3))/3)**2 - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3) - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 56*sqrt(7)*sin(atan(3*sqrt(3))/3)**3*sin(2*atan(3*sqrt(3))/3) + 28*sin(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3)**2 + 28*sin(atan(3*sqrt(3))/3)**2*sin(2*atan(3*sqrt(3))/3)**2 + 28*sin(atan(3*sqrt(3))/3)**2 + 56*sin(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3) + 196*sin(atan(3*sqrt(3))/3)**4 + 28*cos(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3)**2 + 28*sin(2*atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3)**2 + 28*cos(atan(3*sqrt(3))/3)**2 + 56*cos(atan(3*sqrt(3))/3)**2*cos(2*atan(3*sqrt(3))/3) + 392*sin(atan(3*sqrt(3))/3)**2*cos(atan(3*sqrt(3))/3)**2 + 196*cos(atan(3*sqrt(3))/3)**4)**(1/4)*sin(atan(-2*sqrt(7)*sin(2*atan(3*sqrt(3))/3)*cos(atan(3*sqrt(3))/3)/(-2*sqrt(7)*cos(atan(3*sqrt(3))/3) - 2*sqrt(7)*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3) + 14*sin(atan(3*sqrt(3))/3)**2 + 14*cos(atan(3*sqrt(3))/3)**2) + 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3)/(-2*sqrt(7)*cos(atan(3*sqrt(3))/3) - 2*sqrt(7)*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3) + 14*sin(atan(3*sqrt(3))/3)**2 + 14*cos(atan(3*sqrt(3))/3)**2) + 2*sqrt(7)*sin(atan(3*sqrt(3))/3)/(-2*sqrt(7)*cos(atan(3*sqrt(3))/3) - 2*sqrt(7)*cos(atan(3*sqrt(3))/3)*cos(2*atan(3*sqrt(3))/3) - 2*sqrt(7)*sin(atan(3*sqrt(3))/3)*sin(2*atan(3*sqrt(3))/3) + 14*sin(atan(3*sqrt(3))/3)**2 + 14*cos(atan(3*sqrt(3))/3)**2))/2)/12

这是正确的,但极其复杂。我尝试使用 symplify() 和其他函数,但我无法想出任何方法来解决这个问题我该如何解决这个问题?

我还发现 sympy 使用三角函数求解表达式是很常见的,也与

-1024*x11 + 2816*x9 - 2816*x7 + 1232*x5 - 220*x**3 + 11*x

一起出现
python math sympy
1个回答
0
投票

您可以使用

trig=False
关闭三角函数以仅获取根式表达式。我倾向于认为,如果涉及卡尔达诺公式,则激进(或激进三角)表达式没有用。通常最好避免使用
roots
,因为它的目的是返回此类表达式(尽管可以改进以返回更简单的表达式)。相反,通常最好使用因式分解和 RootOf 来表示根。

表示像这样的多项式的根的最佳方法就是使用 RootOf:

In [23]: p = -64*x**7 + 112*x**5 - 56*x**3 + 7*x

In [24]: for r in real_roots(p): print(r)
CRootOf(64*x**6 - 112*x**4 + 56*x**2 - 7, 0)
CRootOf(64*x**6 - 112*x**4 + 56*x**2 - 7, 1)
CRootOf(64*x**6 - 112*x**4 + 56*x**2 - 7, 2)
0
CRootOf(64*x**6 - 112*x**4 + 56*x**2 - 7, 3)
CRootOf(64*x**6 - 112*x**4 + 56*x**2 - 7, 4)
CRootOf(64*x**6 - 112*x**4 + 56*x**2 - 7, 5)

In [25]: [r.n(3) for r in real_roots(p)]
Out[25]: [-0.975, -0.782, -0.434, 0, 0.434, 0.782, 0.975]

您可以将其包裹在数字符号中以获得更好的显示效果,例如:

In [34]: a = real_roots(p)[4]

In [35]: a.n()
Out[35]: 0.433883739117558

In [36]: alpha = AlgebraicNumber(a, alias="alpha")

In [37]: alpha
Out[37]: α

In [38]: alpha.n()
Out[38]: 0.433883739117558

对于这个特定的多项式

Q(alpha)
是分裂场,因此所有根都可以根据 alpha 找到:

In [40]: print(p.factor(extension=alpha))
-64*x*(x - alpha)*(x + alpha)*(x - 3*alpha + 4*alpha**3)*(x - 4*alpha**3 + 3*alpha)*(x - 5*alpha - 16*alpha**5 + 20*alpha**3)*(x - 20*alpha**3 + 16*alpha**5 + 5*alpha)

In [45]: print(p.factor(extension=alpha).n(3))
-64.0*x*(x - 0.975)*(x - 0.782)*(x - 0.434)*(x + 0.434)*(x + 0.782)*(x + 0.975)

In [50]: print(ground_roots(p, domain=QQ.algebraic_field(alpha)))
{0: 1, -20*alpha**3 + 16*alpha**5 + 5*alpha: 1, -3*alpha + 4*alpha**3: 1, alpha: 1, -alpha: 1, -4*alpha**3 + 3*alpha: 1, -5*alpha - 16*alpha**5 + 20*alpha**3: 1}
© www.soinside.com 2019 - 2024. All rights reserved.