@@ -120,7 +120,7 @@ def fit_cec_sam(celltype, v_mp, i_mp, v_oc, i_sc, alpha_sc, beta_voc,
120120
121121def fit_desoto (v_mp , i_mp , v_oc , i_sc , alpha_sc , beta_voc , cells_in_series ,
122122 EgRef = 1.121 , dEgdT = - 0.0002677 , temp_ref = 25 , irrad_ref = 1000 ,
123- init_guess = None , root_kwargs = {}):
123+ init_guess = {} , root_kwargs = {}):
124124 """
125125 Calculates the parameters for the De Soto single diode model.
126126
@@ -167,7 +167,7 @@ def fit_desoto(v_mp, i_mp, v_oc, i_sc, alpha_sc, beta_voc, cells_in_series,
167167 irrad_ref: float, default 1000
168168 Reference irradiance condition [Wm⁻²]
169169 init_guess: dict, optional
170- Initial values for optimization, must have keys `'Rsh_0'`, `'a_0'`,
170+ Initial values for optimization. Keys can be `'Rsh_0'`, `'a_0'`,
171171 `'IL_0'`, `'Io_0'`, `'Rs_0'`.
172172 root_kwargs : dictionary, optional
173173 Dictionary of arguments to pass onto scipy.optimize.root()
@@ -218,23 +218,23 @@ def fit_desoto(v_mp, i_mp, v_oc, i_sc, alpha_sc, beta_voc, cells_in_series,
218218 k = constants .value ('Boltzmann constant in eV/K' ) # in eV/K
219219 Tref = temp_ref + 273.15 # [K]
220220
221- if init_guess is None :
222- # initial guesses of variables for computing convergence:
223- # Values are taken from [2], p753
224- IL_0 = i_sc
225- a_0 = 1.5 * k * Tref * cells_in_series
226- Io_0 = i_sc * np . exp ( - v_oc / a_0 )
227- Rs_0 = ( a_0 * np .log1p (( IL_0 - i_mp ) / Io_0 ) - v_mp ) / i_mp
228- Rsh_0 = 100.0
229- else :
230- IL_0 = init_guess [ 'IL_0' ]
231- Io_0 = init_guess [ 'Io_0' ]
232- Rs_0 = init_guess [ 'Rs_0' ]
233- Rsh_0 = init_guess [ 'Rsh_0' ]
234- a_0 = init_guess ['a_0' ]
221+ # initial guesses of variables for computing convergence :
222+ # Default values are taken from [2], p753
223+ init = {}
224+ init_guess_keys = [ 'IL_0' , 'Io_0' , 'Rs_0' , 'Rsh_0' , 'a_0' ]
225+ init [ 'IL_0' ] = i_sc
226+ init [ 'a_0' ] = 1.5 * k * Tref * cells_in_series
227+ init [ 'Io_0' ] = i_sc * np .exp ( - v_oc / init [ 'a_0' ])
228+ init [ 'Rs_0' ] = ( init [ 'a_0' ] * np . log1p (( init [ 'IL_0' ] - i_mp ) / init [ 'Io_0' ]) \
229+ - v_mp ) / i_mp
230+ init [ 'Rsh_0' ] = 100.0
231+ # overwrite if optional init_guess is provided
232+ for k in init_guess :
233+ if k in init_guess_keys :
234+ init [ k ] = init_guess [k ]
235235
236236 # params_i : initial values vector
237- params_i = np .array ([IL_0 , Io_0 , Rs_0 , Rsh_0 , a_0 ])
237+ params_i = np .array ([init_guess [ k ] for k in init_guess_keys ])
238238
239239 # specs of module
240240 specs = (i_sc , v_oc , i_mp , v_mp , beta_voc , alpha_sc , EgRef , dEgdT ,
0 commit comments