Мне нужно оценить максимумы функции с помощью convertset (или другого альтернативного инструмента).
В настоящее время мой код:
import numpy as np
from scipy.optimize import curve_fit as cf
from sympy import symbols, Interval, S, Float, Rational
from sympy.logic.boolalg import Or
from sympy import solveset
x = symbols('x', real=True)
"""
Fitting raw data via:
1. np.genfromtxt(...)
2. fitParams, fitCovariances = cf(fitFunc, x_values, y_values)
gives the foolowing parameters:
"""
p1 = -0.351519665611521
p2 = -0.025153022792473
p3 = 0.005404053033914
p4 = -0.000875763032580
p5 = 0.000070700828439
p6 = -0.000002224914318
p7 = 0.871513745522901
fitParams = np.array([p1, p2, p3, p4, p5, p6, p7])
def function(x, p1, p2, p3, p4, p5, p6, p7):
return p7*x**(S(2)/3) + p6*x**6 + p5*x**5 + p4*x**4 + p3*x**3 + p2*x**2 + p1*x
, откуда берутся параметры 'p *'предыдущая подгонка необработанных данных.
Мне нужно извлечь максимумы:
energy = function(x, *fitParams) + var1*x
как функцию переменной 'var1'.
Так что я пытаюсьчтобы получить корни его производной:
energy_dx = energy.diff(x)
через "solveset":
solutions = solveset(energy_dx, x, domain=S.Reals)
Бывает, что для некоторых значений "var1" solveset может оценить решение, но не можетдля других значений.В этих последних случаях код дает:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/sympy/polys/polytools.py", line 3544, in nroots
cleanup=cleanup, error=False, extraprec=f.degree()*10)
File "/usr/lib/python3/dist-packages/mpmath/calculus/polynomials.py", line 196, in polyroots
% maxsteps)
mpmath.libmp.libhyper.NoConvergence: Didn't converge in maxsteps=50 steps.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./myscript.py", line 146, in <module>
solutions = solveset(energy_dx, x, S.Reals)
File "/usr/lib/python3/dist-packages/sympy/solvers/solveset.py", line 921, in solveset
return _solveset(f, symbol, domain, _check=True)
File "/usr/lib/python3/dist-packages/sympy/solvers/solveset.py", line 734, in _solveset
solver)
File "/usr/lib/python3/dist-packages/sympy/solvers/solveset.py", line 535, in _solve_radical
f_y_sols = solveset_solver(eq, y)
File "/usr/lib/python3/dist-packages/sympy/solvers/solveset.py", line 674, in <lambda>
solver = lambda f, x, domain=domain: _solveset(f, x, domain)
File "/usr/lib/python3/dist-packages/sympy/solvers/solveset.py", line 738, in _solveset
result += _solve_as_rational(equation, symbol, domain)
File "/usr/lib/python3/dist-packages/sympy/solvers/solveset.py", line 385, in _solve_as_rational
return _solve_as_poly(g, symbol, domain)
File "/usr/lib/python3/dist-packages/sympy/solvers/solveset.py", line 430, in _solve_as_poly
quintics=True, domain='EX')
File "/usr/lib/python3/dist-packages/sympy/polys/polyroots.py", line 989, in roots
for r in f.nroots():
File "/usr/lib/python3/dist-packages/sympy/polys/polytools.py", line 3553, in nroots
n, maxsteps))
mpmath.libmp.libhyper.NoConvergence: convergence to root failed; try n < 15 or maxsteps > 50
Здесь я не могу понять, как изменить значения 'n' или 'maxsteps'.
Я новичок вкодирование через Python, поэтому я буду очень признателен за любые ваши предложения.Python находится в версии 3.6.5, и все модули обновлены.
02 июня: в настоящее время я не могу воспроизвести проблему