回答

3

更新:下面给出的解决方案是现在可通过使用具有根或解决这样的方程时roots_cubic关键字trig=True

这种形式是不是与我所知道的任何关键字给出的,但它并不难写一个程序来做到这一点:

>>> def cutrig(a,b,c,d): 
...  a,b,c,d = [S(i) for i in (a,b,c,d)] 
...  # x = t - b/3/a 
...  p = (3*a*c-b**2)/3/a**2 
...  q = (2*b**3-9*a*b*c+27*a**2*d)/(27*a**3) 
...  D = 18*a*b*c*d-4*b**3*d+b**2*c**2-4*a*c**3-27*a**2*d**2 
...  assert D > 0 
...  rv = [] 
...  for k in range(3): 
...   rv.append(2*sqrt(-p/3)*cos(acos(3*q/2/p*sqrt(-3/p))/3-k*2*pi/3)) 
...  return list(sorted([i - b/3/a for i in rv])) 
... 
>>> print filldedent(cutrig(-1,2,3,-2)) 

[-2*sqrt(13)*cos(-acos(8*sqrt(13)/169)/3 + pi/3)/3 + 2/3, 
-2*sqrt(13)*sin(-acos(8*sqrt(13)/169)/3 + pi/6)/3 + 2/3, 2/3 + 
2*sqrt(13)*cos(acos(8*sqrt(13)/169)/3)/3] 
>>> 

相比默认的解决方案:

>>> print filldedent(solve(-x**3+2*x**2+3*x-2)) 

[2/3 + (-1/2 - sqrt(3)*I/2)*(8/27 + sqrt(237)*I/9)**(1/3) + 
13/(9*(-1/2 - sqrt(3)*I/2)*(8/27 + sqrt(237)*I/9)**(1/3)), 2/3 + 
13/(9*(-1/2 + sqrt(3)*I/2)*(8/27 + sqrt(237)*I/9)**(1/3)) + (-1/2 + 
sqrt(3)*I/2)*(8/27 + sqrt(237)*I/9)**(1/3), 2/3 + 13/(9*(8/27 + 
sqrt(237)*I/9)**(1/3)) + (8/27 + sqrt(237)*I/9)**(1/3)] 

每个值是相同的:

>>> sorted([w.n(2,chop=True) for w in solve(-x**3+2*x**2+3*x-2)]) 
[-1.3, 0.53, 2.8] 
>>> sorted([w.n(2,chop=True) for w in cutrig(-1,2,3,-2)]) 
[-1.3, 0.53, 2.8] 
+0

是否可以使用简化和求解的组合来精确计算真正的根三次方程?基本上复杂的部分应该抵消自己。 – denfromufa

+1

请参阅“https://en.wikipedia.org/wiki/Cubic_function”:当三次方程有三个实根时,以自由基形式表达这些根的公式涉及复数。事实证明,如果三个真正的根都不是合理的,那么不能根据真正的自由基来表达根。尽管如此,可以使用超几何函数[29]获得纯粹真实的解的表达式,或者根据三角函数,特别是在余弦函数和反余弦函数方面获得纯粹的实数表达式。 – smichr