Поиск рута через решени - PullRequest
0 голосов
/ 29 мая 2018

Мне нужно оценить максимумы функции с помощью 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 июня: в настоящее время я не могу воспроизвести проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...