ограничивающие переменные в scipy решают нелинейный одновременный эквалайзер

#python #scipy #constraints #nonlinear-optimization

#python #scipy #ограничения #нелинейная оптимизация

Вопрос:

Я пытаюсь решить 4 одновременных нелинейных уравнения с 4 неизвестными iL,isat,Rshunt,Rseries сначала функция передает известные переменные iSC,vOC,imax,vmax,Nseries , а затем я определяю свой набор функций, используя def func1(vars): мои догадки 9,1e-12,300,0.5 основаны на физических свойствах

 def get_pvparms(iSC,vOC,imax,vmax,Nseries):
    import math as m
    from scipy.optimize import fsolve
    from numpy import sqrt

    n = 1
    boltzmann = 1.3806e-23
    q = 1.60218e-19
    refTemp = 25   273.15
    pmax = vmax/imax
    a = n * boltzmann * refTemp * Nseries / q

    def func1(vars):
        iL,isat,Rshunt,Rseries = vars

        iL = iL**2
        isat = isat**2
        Rshunt = Rshunt**2
        Rseries = Rseries**2

        return isat * (m.exp(vOC / a) - 1)   vOC / Rshunt - iL   0*Rseries,
               iSC   iSC*Rseries/Rshunt   isat * m.exp(iSC*Rseries/a - 1) - iL,
               iL - isat*(m.exp((vmax   imax*Rseries)/a)-1) - (vmax   imax*Rseries)/Rshunt - imax,
               (isat*m.exp((vmax imax*Rseries)/a)/a   1/Rshunt)/(1 (isat*Rseries*m.exp((vmax imax*Rseries)/a)/a) Rseries/Rshunt) - pmax   0*iL

    guess = sqrt((iSC,5e-8,300,0.5))

    print fsolve(func1,guess)
  

Я получаю этот результат

  File "C:UsersDavis_2DocumentsRCLMAPVsimpvcalc.py", line 50, in get_pvparms
    print fsolve(func1,guess)
  File "C:Anaconda2libsite-packagesscipyoptimizeminpack.py", line 146, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)
  File "C:Anaconda2libsite-packagesscipyoptimizeminpack.py", line 224, in _root_hybr
    ml, mu, epsfcn, factor, diag)
  File "C:UsersDavis_2DocumentsRCLMAPVsimpvcalc.py", line 44, in func1
    iSC   iSC*Rseries/Rshunt   isat * m.exp(iSC*Rseries/a - 1) - iL,
OverflowError: math range error
  

Как я могу передать ограничения моим предположениям? например, значения не могут быть negative ?

Я попытался использовать метод возведения в квадрат для переменных, но я получаю переполнение. Вероятно, это неправильная реализация. Буду признателен за любую помощь

Примечание: Если вы удалите этот фрагмент кода:

     iL = iL**2
    isat = isat**2
    Rshunt = Rshunt**2
    Rseries = Rseries**2
  

и уберите sqrt здесь guess = sqrt((iSC,5e-8,300,0.5)) , он сходится к ответу.

Комментарии:

1. Это нетривиальный код, и его трудно читать из-за некоторых ненаблюдаемых импортов и соавторов (например: sqrt((iSC,5e-8,300,0.5)) np.sqrt vs. ?). Возможно, создайте более простой пример с фактическими данными. Поскольку некоторые из ваших внутренних решений определены только для некоторого подмножества входных данных, вам, похоже, нужно каким-то образом запретить это неправильное использование. A: используйте оптимизатор, который поддерживает ограничения (и создает только допустимые итерации) B: ввести большие штрафы за неопределенные диапазоны (требуется больше логики). Но я был бы также напуган этими, возможно, огромными диапазонами переменных, которые могут стать проблемой.