Оценка прогресса функций SymPy - PullRequest
0 голосов
/ 08 октября 2018

Я ввел команду 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 голосов
/ 09 октября 2018

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))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...