program explicit_model_IV
implicit none
! --- Variables originales ---
integer :: ii, max_iter
double precision :: q, k_boltz, beta, alpha ! Renombro k a k_boltz para evitar conflicto con iterador k
double precision :: G, G_ref, CR_PTC, T, T_cell, T_ref
double precision :: Voc_ref, Isc_ref, Jsc_ref, APV
double precision :: Vt, n_min, n_max, coef, n
double precision :: Voc, Isc, I0, IL
double precision :: Vmp, Imp, Pmp, MPPT
double precision :: Rpv
double precision :: dI, f, df, tol
double precision :: Vm, Im, C1, C2
double precision, dimension(501) :: Vdata, Idata
! --- Nuevas variables para la Tabla y MPP ---
double precision :: V, I, P_act
double precision :: paso_v
integer :: k, num_puntos
! --- Parámetros Físicos ---
q = 1.602e-19
k_boltz = 1.381e-23
beta = -0.0023
alpha = 0.0006
G = 960.0 !* 0.86 ! Ojo a las perdidas opticas del colector
G_ref = 1353.0
CR_PTC = 30!16.92
T_cell = 59.4
T = T_cell + 273.15
T_ref = 25.0 + 273.15
Jsc_ref = 10.8e-3
APV = 12.0
Voc_ref = 3.075!2.63
Isc_ref = Jsc_ref * APV
Vt = (k_boltz*T)/q
n_max = 2.0
n_min = 1.0
coef = 0.0015
n = n_max + (n_min - n_max)*exp(-coef*G)
! --- Cálculo de parámetros del modelo ---
Voc = Voc_ref + ((n*k_boltz*T)/q)*log(G/G_ref) + beta*(T - T_ref)
Isc = Isc_ref * (G/G_ref) * (1.0 + alpha*(T - T_ref)) * CR_PTC
I0 = Isc / (exp(Voc/(n*Vt)) - 1.0)
IL = Isc * (G/G_ref) * (1.0 + (alpha * (T - T_ref)))
! Estimación analítica inicial para obtener C1 y C2
Vm = ((n * k_boltz * T)/q) * log( ((n * k_boltz * T)/(q * I0)) * (Isc/Voc) )
Im = IL + I0 - ((n * 1.0 * k_boltz * T)/q) * (Isc/Voc)
! Cálculo de Constantes del Modelo Explícito
C2 = ((Vm / Voc) - 1.0) / log(1.0 - (Im / Isc))
C1 = (1.0 - (Im / Isc)) * EXP(-Vm / (C2 * Voc))
! ============================================================
! SECCIÓN INTEGRADA: GENERACIÓN DE TABLA Y BÚSQUEDA DE MPP
! ============================================================
! Configuración del barrido
num_puntos = 20
paso_v = Voc / dble(num_puntos)
! Inicializar variables de búsqueda de MPP
Pmp = 0.0d0
Vmp = 0.0d0
Imp = 0.0d0
print *, "--------------------------------------------------------"
print *, " TABLA DE RESULTADOS (Modelo Explicito) & BUSQUEDA MPP"
print *, "--------------------------------------------------------"
print *, " Voltaje (V) Corriente (I) Potencia (W)"
print *, " ----------- ------------- ------------"
DO k = 0, num_puntos
! 1. Calcular Voltaje para este paso
V = dble(k) * paso_v
! 2. Ecuación del Modelo Explícito
! Se añade protección IF para evitar errores numéricos si V > Voc por redondeo
IF (V > Voc) THEN
I = 0.0d0
ELSE
I = Isc * (1.0d0 - C1 * (EXP(V / (C2 * Voc)) - 1.0d0))
END IF
! 3. Corrección física (I no puede ser negativa)
IF (I < 0.0d0) I = 0.0d0
! 4. Calcular Potencia Instantánea
P_act = V * I
! 5. Buscar el Máximo (MPP Tracking en la tabla)
IF (P_act > Pmp) THEN
Pmp = P_act
Vmp = V
Imp = I
END IF
! 6. Guardar en arrays (opcional, si se usan después)
if (k+1 <= 501) then
Vdata(k+1) = V
Idata(k+1) = I
endif
! 7. Imprimir fila de la tabla
WRITE(*, '(F10.4, T20, F10.4, T40, F10.4)') V, I, P_act
END DO
print *, "--------------------------------------------------------"
print *, ""
! ============================================================
! FIN DE SECCIÓN INTEGRADA
! ============================================================
! Calculo final de MPPT del sistema (según lógica original)
! Nota: Pmp ahora contiene el valor máximo real encontrado en el bucle anterior
MPPT = Pmp * 40.0d0
print *, " RESUMEN DE PARAMETROS CALCULADOS:"
print *, " Voc_ref = ", Voc_ref
print *, " Isc_ref = ", Isc_ref
print *, " "
print *, " Voc (calc) = ", Voc
print *, " Isc (calc) = ", Isc
print *, " "
print *, " PUNTO DE MAXIMA POTENCIA (Extraido de la Tabla):"
print *, " Vmp = ", Vmp, " V"
print *, " Imp = ", Imp, " A"
print *, " Pmp = ", Pmp, " W"
print *, " "
print *, " Potencia Total Estimada (Pmp * 40):"
print *, " MPPT = ", MPPT, " W"
print *, " "
! call plot_IV_ascii(Vdata, Idata, num_puntos+1)
end program explicit_model_IV
To embed this program on your website, copy the following code and paste it into your website's HTML: