Ограничивающие переменные на нелинейном уравнении
Я пытаюсь решить 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:\Users\Davis_2\Documents\RCL\MAPVsim\pvcalc.py", line 50, in get_pvparms
print fsolve(func1,guess)
File "C:\Anaconda2\lib\site-packages\scipy\optimize\minpack.py", line 146, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "C:\Anaconda2\lib\site-packages\scipy\optimize\minpack.py", line 224, in _root_hybr
ml, mu, epsfcn, factor, diag)
File "C:\Users\Davis_2\Documents\RCL\MAPVsim\pvcalc.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
и вынуть здесь guess = sqrt((iSC,5e-8,300,0.5))
это сходится к ответу.