估算SymPy函数的进度

时间:2018-10-08 16:42:43

标签: python sympy

我已经发布了sympy命令来求解某些方程式。已经过了几天,我不知道什么时候可以完成它。

我可以让sympy记录对.solvers.solve的呼叫进度吗?如果不是,我该如何估计sympy解决某些方程组所需的最坏情况时间?

例如

import sympy, sympy.solvers
from sympy import sqrt

a,c,d,e,f,x = tuple(map(sympy.Symbol, 'acdefx'))

# when will this finish?
print(sympy.solvers.solve(
    3*sqrt((16*a**2*c**2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2 + (-8*a**2*c*x - 2*a*e + 2*a*x + 2*a*sqrt(16*a**2*c**2*
x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2) + d)**2)**3/(16*a**2*c**2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2)**3)*(a*(2*c
*(8*a**2*c*x + 2*a*e - 2*a*x - d) - (4*a*c - 1)*sqrt(16*a**2*c**2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2))*(-8*a**2*c*x - 2*a*e + 2*a
*x + 2*a*sqrt(16*a**2*c**2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2) + d) + c*(8*a**2*c*x + 2*a*e - 2*a*x - d)*sqrt(16*a**2*c**2*x**2 +
 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2))*(16*a**2*c**2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2)/((a*(4*a*c - 1)*(16*a**2*c**
2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2) - c*(8*a**2*c*x + 2*a*e - 2*a*x - d)**2)*(16*a**2*c**2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*
d*x - 4*c*f + e**2 + (-8*a**2*c*x - 2*a*e + 2*a*x + 2*a*sqrt(16*a**2*c**2*x**2 + 8*a*c*e*x - 4*a*c*x**2 - 4*c*d*x - 4*c*f + e**2) + d)**2))
,x))

1 个答案:

答案 0 :(得分:1)

SymPy不提供任何完成时间的估计。它的某些算法依赖于以各种方式重写表达式。如果结果表达式变得更复杂而不是更复杂,则此过程可能永远不会终止。

在特定示例中,将表达式分解为因子并解决单个因子会有所帮助。

factors = expr.factor().args
solve(factors[4], x)   # "4" by trial and error

返回

[(c*(-2*a*e + d) - sqrt(c*(16*a**2*c**2*f - 4*a*c*d*e - 4*a*c*f + a*e**2 + c*d**2)))/(2*a*c*(4*a*c - 1)),
 (c*(-2*a*e + d) + sqrt(c*(16*a**2*c**2*f - 4*a*c*d*e - 4*a*c*f + a*e**2 + c*d**2)))/(2*a*c*(4*a*c - 1))]