def test__golden_sect_DataFrame_nans(): # nan in bounds params = {'c': np.array([1., 2., 1.]), 'n': np.array([1., 1., 1.])} lower = np.array([0., 0.001, np.nan]) upper = np.array([1.1, 1.2, 1.]) expected = np.array([0.5, 0.25, np.nan]) v, x = tools._golden_sect_DataFrame(params, lower, upper, _obj_test_golden_sect) assert np.allclose(x, expected, atol=1e-8, equal_nan=True) # nan in function values params = {'c': np.array([1., 2., np.nan]), 'n': np.array([1., 1., 1.])} lower = np.array([0., 0.001, 0.]) upper = np.array([1.1, 1.2, 1.]) expected = np.array([0.5, 0.25, np.nan]) v, x = tools._golden_sect_DataFrame(params, lower, upper, _obj_test_golden_sect) assert np.allclose(x, expected, atol=1e-8, equal_nan=True) # all nan in bounds params = {'c': np.array([1., 2., 1.]), 'n': np.array([1., 1., 1.])} lower = np.array([np.nan, np.nan, np.nan]) upper = np.array([1.1, 1.2, 1.]) expected = np.array([np.nan, np.nan, np.nan]) v, x = tools._golden_sect_DataFrame(params, lower, upper, _obj_test_golden_sect) assert np.allclose(x, expected, atol=1e-8, equal_nan=True)
def test__golden_sect_DataFrame_vector(): params = {'c': np.array([1., 2.]), 'n': np.array([1., 1.])} lower = np.array([0., 0.001]) upper = np.array([1.1, 1.2]) expected = np.array([0.5, 0.25]) v, x = tools._golden_sect_DataFrame(params, lower, upper, _obj_test_golden_sect) assert np.allclose(x, expected, atol=1e-8)
def test__golden_sect_DataFrame_atol(): params = {'c': 0.2, 'n': 0.3} expected = 89.14332727531685 v, x = tools._golden_sect_DataFrame(params, 0., 100., _obj_test_golden_sect, atol=1e-12) assert np.isclose(x, expected, atol=1e-12)
def _lambertw(photocurrent, saturation_current, resistance_series, resistance_shunt, nNsVth, ivcurve_pnts=None): # Compute short circuit current i_sc = _lambertw_i_from_v(resistance_shunt, resistance_series, nNsVth, 0., saturation_current, photocurrent) # Compute open circuit voltage v_oc = _lambertw_v_from_i(resistance_shunt, resistance_series, nNsVth, 0., saturation_current, photocurrent) params = { 'r_sh': resistance_shunt, 'r_s': resistance_series, 'nNsVth': nNsVth, 'i_0': saturation_current, 'i_l': photocurrent } # Find the voltage, v_mp, where the power is maximized. # Start the golden section search at v_oc * 1.14 p_mp, v_mp = _golden_sect_DataFrame(params, 0., v_oc * 1.14, _pwr_optfcn) # Find Imp using Lambert W i_mp = _lambertw_i_from_v(resistance_shunt, resistance_series, nNsVth, v_mp, saturation_current, photocurrent) # Find Ix and Ixx using Lambert W i_x = _lambertw_i_from_v(resistance_shunt, resistance_series, nNsVth, 0.5 * v_oc, saturation_current, photocurrent) i_xx = _lambertw_i_from_v(resistance_shunt, resistance_series, nNsVth, 0.5 * (v_oc + v_mp), saturation_current, photocurrent) out = (i_sc, v_oc, i_mp, v_mp, p_mp, i_x, i_xx) # create ivcurve if ivcurve_pnts: ivcurve_v = (np.asarray(v_oc)[..., np.newaxis] * np.linspace(0, 1, ivcurve_pnts)) ivcurve_i = _lambertw_i_from_v(resistance_shunt, resistance_series, nNsVth, ivcurve_v.T, saturation_current, photocurrent).T out += (ivcurve_i, ivcurve_v) return out
def test__golden_sect_DataFrame(params, lb, ub, expected, func): v, x = tools._golden_sect_DataFrame(params, lb, ub, func) assert np.isclose(x, expected, atol=1e-8)