@@ -120,107 +120,123 @@ def fit_cec_sam(celltype, v_mp, i_mp, v_oc, i_sc, alpha_sc, beta_voc,
120
120
121
121
def fit_desoto (v_mp , i_mp , v_oc , i_sc , alpha_sc , beta_voc , cells_in_series ,
122
122
EgRef = 1.121 , dEgdT = - 0.0002677 , temp_ref = 25 , irrad_ref = 1000 ,
123
- root_kwargs = {}):
123
+ init_guess = {}, root_kwargs = {}):
124
124
"""
125
125
Calculates the parameters for the De Soto single diode model.
126
126
127
- This procedure (described in [1]_) has the advantage of
128
- using common specifications given by manufacturers in the
127
+ This procedure (described in [1]_) fits the De Soto model [2]_ using
128
+ common specifications given by manufacturers in the
129
129
datasheets of PV modules.
130
130
131
- The solution is found using the scipy.optimize.root() function ,
132
- with the corresponding default solver method 'hybr'.
133
- No restriction is put on the fit variables, i.e . series
131
+ The solution is found using :py:func:` scipy.optimize.root` ,
132
+ with the default solver method 'hybr'.
133
+ No restriction is put on the fit variables, e.g . series
134
134
or shunt resistance could go negative. Nevertheless, if it happens,
135
- check carefully the inputs and their units; alpha_sc and beta_voc are
136
- often given in %/K in manufacturers datasheets and should be given
137
- in A/K and V/K here.
135
+ check carefully the inputs and their units. For example, ``alpha_sc`` and
136
+ ``beta_voc`` are often given in %/K in manufacturers datasheets but should
137
+ be given in A/K and V/K here.
138
138
139
139
The parameters returned by this function can be used by
140
- :py:func:`pvlib.pvsystem.calcparams_desoto` to calculate the values at
141
- different irradiance and cell temperature.
140
+ :py:func:`pvlib.pvsystem.calcparams_desoto` to calculate single diode
141
+ equation parameters at different irradiance and cell temperature.
142
142
143
143
Parameters
144
144
----------
145
145
v_mp: float
146
- Module voltage at the maximum-power point at reference conditions [V].
146
+ Module voltage at the maximum-power point at reference conditions. [V]
147
147
i_mp: float
148
- Module current at the maximum-power point at reference conditions [A].
148
+ Module current at the maximum-power point at reference conditions. [A]
149
149
v_oc: float
150
- Open-circuit voltage at reference conditions [V].
150
+ Open-circuit voltage at reference conditions. [V]
151
151
i_sc: float
152
- Short-circuit current at reference conditions [A].
152
+ Short-circuit current at reference conditions. [A]
153
153
alpha_sc: float
154
154
The short-circuit current (i_sc) temperature coefficient of the
155
- module [A/K].
155
+ module. [A/K]
156
156
beta_voc: float
157
157
The open-circuit voltage (v_oc) temperature coefficient of the
158
- module [V/K].
158
+ module. [V/K]
159
159
cells_in_series: integer
160
160
Number of cell in the module.
161
161
EgRef: float, default 1.121 eV - value for silicon
162
- Energy of bandgap of semi-conductor used [eV]
162
+ Energy of bandgap of semi-conductor used. [eV]
163
163
dEgdT: float, default -0.0002677 - value for silicon
164
- Variation of bandgap according to temperature [eV/K]
164
+ Variation of bandgap according to temperature. [eV/K]
165
165
temp_ref: float, default 25
166
- Reference temperature condition [C]
166
+ Reference temperature condition. [C]
167
167
irrad_ref: float, default 1000
168
- Reference irradiance condition [W/m2]
168
+ Reference irradiance condition. [Wm⁻²]
169
+ init_guess: dict, optional
170
+ Initial values for optimization. Keys can be `'Rsh_0'`, `'a_0'`,
171
+ `'IL_0'`, `'Io_0'`, `'Rs_0'`.
169
172
root_kwargs : dictionary, optional
170
173
Dictionary of arguments to pass onto scipy.optimize.root()
171
174
172
175
Returns
173
176
-------
174
177
dict with the following elements:
175
178
I_L_ref: float
176
- Light-generated current at reference conditions [A]
179
+ Light-generated current at reference conditions. [A]
177
180
I_o_ref: float
178
- Diode saturation current at reference conditions [A]
181
+ Diode saturation current at reference conditions. [A]
179
182
R_s: float
180
- Series resistance [ohm]
183
+ Series resistance. [ohm]
181
184
R_sh_ref: float
182
- Shunt resistance at reference conditions [ohm].
185
+ Shunt resistance at reference conditions. [ohm].
183
186
a_ref: float
184
187
Modified ideality factor at reference conditions.
185
188
The product of the usual diode ideality factor (n, unitless),
186
189
number of cells in series (Ns), and cell thermal voltage at
187
190
specified effective irradiance and cell temperature.
188
191
alpha_sc: float
189
192
The short-circuit current (i_sc) temperature coefficient of the
190
- module [A/K].
193
+ module. [A/K]
191
194
EgRef: float
192
- Energy of bandgap of semi-conductor used [eV]
195
+ Energy of bandgap of semi-conductor used. [eV]
193
196
dEgdT: float
194
- Variation of bandgap according to temperature [eV/K]
197
+ Variation of bandgap according to temperature. [eV/K]
195
198
irrad_ref: float
196
- Reference irradiance condition [W/m2 ]
199
+ Reference irradiance condition. [Wm⁻² ]
197
200
temp_ref: float
198
- Reference temperature condition [C]
201
+ Reference temperature condition. [C]
199
202
200
203
scipy.optimize.OptimizeResult
201
204
Optimization result of scipy.optimize.root().
202
205
See scipy.optimize.OptimizeResult for more details.
203
206
204
207
References
205
208
----------
206
- .. [1] W. De Soto et al., "Improvement and validation of a model for
209
+ .. [1] J. A Duffie, W. A Beckman, "Solar Engineering of Thermal Processes",
210
+ 4th ed., Wiley, 2013. :doi:`10.1002/9781118671603`
211
+ .. [2] W. De Soto et al., "Improvement and validation of a model for
207
212
photovoltaic array performance", Solar Energy, vol 80, pp. 78-88,
208
213
2006. :doi:`10.1016/j.solener.2005.06.010`
214
+
209
215
"""
210
216
211
217
# Constants
212
218
k = constants .value ('Boltzmann constant in eV/K' ) # in eV/K
213
219
Tref = temp_ref + 273.15 # [K]
214
220
215
221
# initial guesses of variables for computing convergence:
216
- # Values are taken from [2], p753
217
- Rsh_0 = 100.0
218
- a_0 = 1.5 * k * Tref * cells_in_series
219
- IL_0 = i_sc
220
- Io_0 = i_sc * np .exp (- v_oc / a_0 )
221
- Rs_0 = (a_0 * np .log1p ((IL_0 - i_mp )/ Io_0 ) - v_mp )/ i_mp
222
+ # Default values are taken from [1], p753
223
+ init_guess_keys = ['IL_0' , 'Io_0' , 'Rs_0' , 'Rsh_0' , 'a_0' ] # order matters
224
+ init = {key : None for key in init_guess_keys }
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 key in init_guess :
233
+ if key in init_guess_keys :
234
+ init [key ] = init_guess [key ]
235
+ else :
236
+ raise ValueError (f"'{ key } ' is not a valid name;"
237
+ f" allowed values are { init_guess_keys } " )
222
238
# params_i : initial values vector
223
- params_i = np .array ([IL_0 , Io_0 , Rs_0 , Rsh_0 , a_0 ])
239
+ params_i = np .array ([init [ k ] for k in init_guess_keys ])
224
240
225
241
# specs of module
226
242
specs = (i_sc , v_oc , i_mp , v_mp , beta_voc , alpha_sc , EgRef , dEgdT ,
0 commit comments