program iv_curve_azur_mpp
    implicit none
    
    ! Declaracion de variables
    real(8) :: Isc, Voc, Vmp, Imp
    real(8) :: IL, I0, Rs, a
    real(8) :: V, I, I_next, f, df, tol
    real(8) :: P, P_max, V_mpp_calc, I_mpp_calc
    integer :: step, iter, max_iter, num_steps
    
    ! Valores extraidos de la hoja de datos AZUR SPACE 3C44A
    ! Version MC/Air a X 500 concentracion
    Isc = 7.66d0
    Voc = 3.11d0
    Vmp = 2.81d0
    Imp = 7.54d0
    
    ! ---------------------------------------------------------
    ! Aproximacion inicial de los 4 parametros
    ! ---------------------------------------------------------
    IL = Isc
    a  = 0.042 !0.15d0  ! Voltaje termico modificado aproximado
    I0 = IL * exp(-Voc / a)
    Rs = 0.016 !0.005d0 ! Resistencia en serie representativa (Ohms)
    
    ! Parametros del metodo numerico (Newton-Raphson)
    tol = 1.0d-7
    max_iter = 100
    num_steps = 300 ! Resolucion de la curva a 100 steps
    
    ! Inicializar variables para almacenar el MPP
    P_max = 0.0d0
    V_mpp_calc = 0.0d0
    I_mpp_calc = 0.0d0
    
    ! Imprimir encabezado en consola
    print *, 'Voltaje(V)    Corriente(A)    Potencia(W)'
    print *, '-----------------------------------------'
    
    ! Barrido de Voltaje de 0 a Voc
    do step = 0, num_steps
        V = (dble(step) / dble(num_steps)) * Voc
        
        ! Suposicion inicial para la corriente
        I = IL
        
        ! Bucle iterativo de Newton-Raphson
        do iter = 1, max_iter
            f = I - IL + I0 * (exp((V + I * Rs) / a) - 1.0d0)
            df = 1.0d0 + I0 * (Rs / a) * exp((V + I * Rs) / a)
            
            I_next = I - f / df
            
            ! Comprobar convergencia
            if (abs(I_next - I) < tol) exit
            I = I_next
        end do
        
        ! Evitar corrientes negativas
        if (I < 0.0d0) I = 0.0d0
        
        ! Calcular potencia en este punto
        P = V * I
        
        ! Evaluar si es el Punto de Maxima Potencia (MPP)
        if (P > P_max) then
            P_max = P
            V_mpp_calc = V
            I_mpp_calc = I
        end if
        
        ! Imprimir los resultados en consola paso a paso
        print '(F8.4, 4X, F8.4, 4X, F8.4)', V, I, P
    end do
    
    print *, '-----------------------------------------'
    print *, 'Simulacion completada.'
    print *, ' '
    
    ! Imprimir el resultado final del MPP en el monitor
    print *, '--- Punto de Maxima Potencia (MPP) Calculado ---'
    
    print '(A, F8.4, A)', 'IL   : ', IL, ' V'
    print '(A, F8.4, A)', 'I0   : ', I0, ' V'
    print '(A, F8.4, A)', 'Rs   : ', Rs, ' V'
    
    print '(A, F8.4, A)', 'Voltaje (V_mpp)   : ', V_mpp_calc, ' V'
    print '(A, F8.4, A)', 'Corriente (I_mpp) : ', I_mpp_calc, ' A'
    print '(A, F8.4, A)', 'Potencia (P_max)  : ', P_max, ' W'
    
end program iv_curve_azur_mpp

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: