program solve_tem_conc
    implicit none
    real :: G_tot, A_conc, alpha_conc, sigma, epsilon_pv, A_pv, Tem_pv
    real :: h_conc, Tem_a, epsilon_conc, Tem_sky, Tem_conc
    real :: tol
    integer :: max_iter

    ! Asignar valores a las variables conocidas
    G_tot = 578
    A_conc = 94
    alpha_conc = 0.03
    sigma = 5.67e-8
    epsilon_pv = 0.2
    A_pv = 6
    Tem_pv = 355.45
    h_conc = 1.579
    Tem_a = 282
    epsilon_conc = 0.3
    Tem_sky = 282

    ! Parámetros para el método de Newton-Raphson
    tol = 1.0e-6
    max_iter = 100

    ! Estimación inicial de Tem_conc
    Tem_conc = 350.0

    ! Llamar a la función para resolver Tem_conc
    call newton_raphson(Tem_conc, tol, max_iter)

    ! Imprimir el resultado
    print *, 'La estimación de Tem_conc es: ', Tem_conc

contains

    function f(Tem_conc)
        real :: f, Tem_conc
        real :: q_solar_conc, q_rad_pv, q_conv_conc_front, q_conv_conc_back, q_rad_conc

        q_solar_conc = G_tot * A_conc * alpha_conc
        q_rad_pv = sigma * epsilon_pv * A_pv * (Tem_pv**4 - Tem_conc**4)
        q_conv_conc_front = A_conc * h_conc * (Tem_conc - Tem_a)
        q_conv_conc_back = A_conc * h_conc * (Tem_conc - Tem_a)
        q_rad_conc = sigma * epsilon_conc * A_conc * (Tem_conc**4 - Tem_sky**4)

        f = q_solar_conc + q_rad_pv - (q_conv_conc_front + q_conv_conc_back + q_rad_conc)
    end function f

    function df(Tem_conc)
        real :: df, Tem_conc
        real :: q_rad_pv, q_conv_conc, q_rad_conc

        q_rad_pv = sigma * epsilon_pv * A_pv * (-4.0 * Tem_conc**3)
        q_conv_conc = 2.0 * A_conc * h_conc
        q_rad_conc = sigma * epsilon_conc * A_conc * (4.0 * Tem_conc**3)

        df = q_rad_pv - (q_conv_conc + q_rad_conc)
    end function df

    subroutine newton_raphson(Tem_conc, tol, max_iter)
        real, intent(inout) :: Tem_conc
        real, intent(in) :: tol
        integer, intent(in) :: max_iter
        real :: f_val, df_val
        integer :: iter

        do iter = 1, max_iter
            f_val = f(Tem_conc)
            df_val = df(Tem_conc)

            if (abs(df_val) < tol) then
                print *, 'Error: La derivada es muy pequeña'
                stop
            endif

            Tem_conc = Tem_conc - f_val / df_val

            if (abs(f_val) < tol) then
                return
            endif
        end do

        print *, 'Advertencia: Número máximo de iteraciones alcanzado'
    end subroutine newton_raphson

end program solve_tem_conc

Embed on website

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