|
| 1 | +#! /usr/bin/env python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | + |
1 | 4 | """ |
2 | 5 | Generate coefficients example. |
3 | 6 | """ |
4 | 7 |
|
| 8 | +from __future__ import ( |
| 9 | + absolute_import, division, print_function, unicode_literals) |
| 10 | +import os |
| 11 | +import sys |
5 | 12 | from pvmismatch.contrib import gen_coeffs |
6 | 13 | from pvmismatch import * |
7 | 14 | from matplotlib import pyplot as plt |
|
22 | 29 |
|
23 | 30 | iec61853 = gen_coeffs.gen_iec_61853_from_sapm(gen_coeffs.PVMODULES[PROD_NAME]) |
24 | 31 | iec61853['i_mp'] = iec61853['p_mp'] / iec61853['v_mp'] |
25 | | -#isc0, alpha_isc = gen_coeffs.gen_sapm(iec61853) |
26 | | -#x, sol = gen_coeffs.gen_two_diode(ISC0, VOC0, IMP0, VMP0, NS, NP, T0) |
27 | | -x, sol = gen_coeffs.gen_two_diode( |
28 | | - iec61853['i_sc'], iec61853['v_oc'], iec61853['i_mp'], |
29 | | - iec61853['v_mp'], NS, NP, tc=TC, method='lm', |
30 | | - x0=(2.25e-11, 1.5e-6, 0.004, 10.0) |
31 | | -) |
32 | | -isat1, isat2, rs, rsh = x |
33 | | - |
34 | | -pvc = pvcell.PVcell( |
35 | | - Rs=rs, Rsh=rsh, Isat1_T0=isat1, Isat2_T0=isat2, |
36 | | - Isc0_T0=ISC0/NP, alpha_Isc=AISC |
37 | | -) |
38 | | -f1 = plt.figure() |
| 32 | +isc0, alpha_isc = gen_coeffs.gen_sapm(iec61853) |
| 33 | +assert np.isclose(isc0, ISC0) |
| 34 | +assert np.isclose(alpha_isc, AISC) |
39 | 35 |
|
40 | | -for m, _tc in enumerate(gen_coeffs.TC_C): |
41 | | - pvc.Tcell = _tc + 273.15 |
42 | | - plt.subplot(2, 2, m+1) |
43 | | - plt.xlim([0, 0.8]) |
44 | | - plt.ylim([0, 8]) |
45 | | - res_norm = 0 |
46 | | - for n, _irr in enumerate(gen_coeffs.IRR_W_M2): |
47 | | - pvc.Ee = _irr / 1000.0 |
48 | | - plt.plot(pvc.Vcell, pvc.Icell, '-', pvc.Vcell, pvc.Pcell, ':') |
49 | | - plt.plot( |
50 | | - iec61853['v_mp'][n][m]/NS, iec61853['i_mp'][n][m]/NP, 'x', |
51 | | - iec61853['v_oc'][n][m]/NS, 0.0, 'x', |
52 | | - 0.0, iec61853['i_sc'][n][m]/NP, 'x', |
53 | | - iec61853['v_mp'][n][m]/NS, iec61853['p_mp'][n][m]/NS/NP, 'o', |
| 36 | +if __name__ == '__main__': |
| 37 | + test_cond = 'STC' |
| 38 | + if len(sys.argv) > 1: |
| 39 | + test_cond = sys.argv[1] |
| 40 | + if test_cond.upper() == 'STC': |
| 41 | + x, sol = gen_coeffs.gen_two_diode(ISC0, VOC0, IMP0, VMP0, NS, NP, T0) |
| 42 | + else: |
| 43 | + x, sol = gen_coeffs.gen_two_diode( |
| 44 | + iec61853['i_sc'], iec61853['v_oc'], iec61853['i_mp'], |
| 45 | + iec61853['v_mp'], NS, NP, tc=TC, method='lm', |
| 46 | + x0=(2.25e-11, 1.5e-6, 0.004, 10.0) |
54 | 47 | ) |
55 | | - res_norm += ( |
56 | | - pvc.calcIcell(iec61853['v_mp'][n][m]/NS) |
57 | | - - iec61853['i_mp'][n][m]/NP |
58 | | - )**2 / (iec61853['i_mp'][n][m]/NP)**2 |
59 | | - res_norm += ( |
60 | | - pvc.calcVcell(iec61853['i_mp'][n][m]/NP) |
61 | | - - iec61853['v_mp'][n][m]/NS |
62 | | - )**2 / (iec61853['v_mp'][n][m]/NS)**2 |
63 | | - res_norm += ( |
64 | | - pvc.calcVcell(0.0) - iec61853['v_oc'][n][m]/NS |
65 | | - )**2 / (iec61853['v_oc'][n][m]/NS)**2 |
66 | | - res_norm += ( |
67 | | - pvc.calcIcell(0.0) - iec61853['i_sc'][n][m]/NP |
68 | | - )**2 / (iec61853['i_sc'][n][m]/NP)**2 |
69 | | - rel_diff = (pvc.Pcell.max()*NS*NP - iec61853['p_mp'][n][m]) / PMP0 |
70 | | - plt.annotate('$\Delta_{rel}$ = %.2g%%' % (rel_diff*100), |
71 | | - (0.65, iec61853['p_mp'][n][m]/NS/NP)) |
72 | | - plt.annotate('norm of residuals = %g' % np.sqrt(res_norm / (7*4)), |
73 | | - (0.5, 7.5)) |
74 | | - plt.grid(True) |
75 | | - plt.title( |
76 | | - 'PVMismatch Generated Coefficients for %s at Tc = %g' % (PROD_NAME, _tc) |
| 48 | + isat1, isat2, rs, rsh = x |
| 49 | + |
| 50 | + pvc = pvcell.PVcell( |
| 51 | + Rs=rs, Rsh=rsh, Isat1_T0=isat1, Isat2_T0=isat2, |
| 52 | + Isc0_T0=ISC0/NP, alpha_Isc=AISC, |
| 53 | + pvconst=pvconstants.PVconstants(npts=1001) |
77 | 54 | ) |
78 | | - plt.xlabel('voltage') |
79 | | - plt.ylabel('current [A]') |
80 | | - plt.xlabel('voltage [V]') |
81 | | -f1.show() |
| 55 | + f1 = plt.figure(figsize=(16, 10)) |
| 56 | + |
| 57 | + for m, _tc in enumerate(gen_coeffs.TC_C): |
| 58 | + pvc.Tcell = _tc + 273.15 |
| 59 | + plt.subplot(2, 2, m+1) |
| 60 | + plt.xlim([0, 0.8]) |
| 61 | + plt.ylim([0, 8]) |
| 62 | + res_norm = 0 |
| 63 | + for n, _irr in enumerate(gen_coeffs.IRR_W_M2): |
| 64 | + pvc.Ee = _irr / 1000.0 |
| 65 | + plt.plot(pvc.Vcell, pvc.Icell, '-', pvc.Vcell, pvc.Pcell, ':') |
| 66 | + plt.plot( |
| 67 | + iec61853['v_mp'][n][m]/NS, iec61853['i_mp'][n][m]/NP, 'x', |
| 68 | + iec61853['v_oc'][n][m]/NS, 0.0, 'x', |
| 69 | + 0.0, iec61853['i_sc'][n][m]/NP, 'x', |
| 70 | + iec61853['v_mp'][n][m]/NS, iec61853['p_mp'][n][m]/NS/NP, 'o', |
| 71 | + ) |
| 72 | + mpp = np.argmax(pvc.Pcell) |
| 73 | + res_norm += ( |
| 74 | + pvc.Icell[mpp] - iec61853['i_mp'][n][m]/NP |
| 75 | + )**2 / (IMP0/NP)**2 |
| 76 | + res_norm += ( |
| 77 | + pvc.Vcell[mpp] - iec61853['v_mp'][n][m]/NS |
| 78 | + )**2 / (VMP0/NS)**2 |
| 79 | + voc = pvc.calcVcell(0.0) |
| 80 | + res_norm += ( |
| 81 | + voc - iec61853['v_oc'][n][m]/NS |
| 82 | + )**2 / (VOC0/NS)**2 |
| 83 | + isc = pvc.calcIcell(0.0) |
| 84 | + res_norm += ( |
| 85 | + isc - iec61853['i_sc'][n][m]/NP |
| 86 | + )**2 / (ISC0/NP)**2 |
| 87 | + rel_diff = (pvc.Pcell[mpp]*NS*NP - iec61853['p_mp'][n][m]) / PMP0 |
| 88 | + plt.annotate('$\Delta_{STC}$ = %.2g%%' % (rel_diff*100), |
| 89 | + (0.65, iec61853['p_mp'][n][m]/NS/NP)) |
| 90 | + plt.annotate( |
| 91 | + '$E_e$ = %.2g[suns], $V_{oc}$ = %.2g[V}, $I_{sc}$ = %.g[A]' % (_irr/1000, voc, isc), |
| 92 | + (0.05, 0.05+iec61853['i_sc'][n][m]/NP)) |
| 93 | + plt.annotate('STC RMSE = %.2g%%' % (np.sqrt(res_norm / (7*4))*100), |
| 94 | + (0.65, 7.5)) |
| 95 | + plt.annotate('$I_{sat,1}$ = %.4g' % isat1, |
| 96 | + (0.65, 7.2)) |
| 97 | + plt.annotate('$I_{sat,2}$ = %.4g' % isat2, |
| 98 | + (0.65, 6.9)) |
| 99 | + plt.annotate('$R_s$ = %.4g' % rs, |
| 100 | + (0.65, 6.6)) |
| 101 | + plt.annotate('$R_{sh}$ = %.4g' % rsh, |
| 102 | + (0.65, 6.3)) |
| 103 | + |
| 104 | + plt.grid(True) |
| 105 | + plt.title( |
| 106 | + 'PVMismatch Generated Coefficients for %s at Tc = %g' % (PROD_NAME, _tc) |
| 107 | + ) |
| 108 | + plt.xlabel('voltage') |
| 109 | + plt.ylabel('current [A], power [W]') |
| 110 | + plt.xlabel('voltage [V]') |
| 111 | + plt.tight_layout() |
| 112 | + if len(sys.argv) > 2: |
| 113 | + test_save_dir = sys.argv[2] |
| 114 | + os.makedirs(test_save_dir, exist_ok=True) |
| 115 | + f1.savefig(os.path.join(test_save_dir, sys.argv[1])) |
| 116 | + else: |
| 117 | + f1.show() |
0 commit comments