import numpy as np
import matplotlib.pyplot as plt
# Datos proporcionados
m_h = 0.8  # kg/s, caudal másico de aceite
cp_h = 2.0 * 1000  # J/kg·K, capacidad calorífica del aceite
T_h_i = 150  # °C, temperatura de entrada del aceite
m_c = 1.5  # kg/s, caudal másico de agua
cp_c = 4.18 * 1000  # J/kg·K, capacidad calorífica del agua
T_c_i = 30  # °C, temperatura de entrada del agua
U = 600  # W/m²·K, coeficiente global de transferencia de calor
A_s = 5.0  # m², área de transferencia de calor
print("ANÁLISIS DE INTERCAMBIADOR DE CALOR DE CONTRAFLUJO")
print("=" * 50)
# Cálculo de capacidades térmicas
C_h = m_h * cp_h  # W/K
C_c = m_c * cp_c  # W/K
print(f"Capacidad térmica del aceite (C_h): {C_h:.0f} W/K")
print(f"Capacidad térmica del agua (C_c): {C_c:.0f} W/K")
# Identificar C_min y C_max
C_min = min(C_h, C_c)
C_max = max(C_h, C_c)
cr = C_min / C_max  # relación de capacidades
print(f"\nCapacidad mínima (C_min): {C_min:.0f} W/K")
print(f"Capacidad máxima (C_max): {C_max:.0f} W/K")
print(f"Relación de capacidades (cr): {cr:.3f}")
# Cálculo de NTU
NTU = U * A_s / C_min
print(f"\nNúmero de Unidades de Transferencia (NTU): {NTU:.3f}")
# Cálculo de efectividad para contraflujo
if cr == 1:
    epsilon = NTU / (1 + NTU)
else:
    numerador = 1 - np.exp(-NTU * (1 - cr))
    denominador = 1 - cr * np.exp(-NTU * (1 - cr))
    epsilon = numerador / denominador
print(f"Efectividad (ε): {epsilon:.3f}")
# Cálculo de Q_max
Q_max = C_min * (T_h_i - T_c_i)
print(f"\nCalor máximo transferible (Q_max): {Q_max:.0f} W")
# Cálculo de la tasa de transferencia de calor
Q = epsilon * Q_max  # W
print(f"Tasa de transferencia de calor real (Q): {Q:.0f} W ({Q/1000:.1f} kW)")
# Cálculo de temperaturas de salida
T_h_o = T_h_i - Q / C_h
T_c_o = T_c_i + Q / C_c
print(f"\nTEMPERATURAS DE SALIDA:")
print(f"Temperatura de salida del aceite (Th,o): {T_h_o:.2f} °C")
print(f"Temperatura de salida del agua (Tc,o): {T_c_o:.2f} °C")
# GRÁFICA 1: Efectividad vs NTU para diferentes cr
print(f"\nGENERANDO GRÁFICAS...")
NTU_vec = np.linspace(0, 5, 100)  # Vector NTU de 0 a 5
cr_vec = [0, 0.2, 0.4, 0.6, 0.8, 1]  # Diferentes valores de cr
epsilon_contra = np.zeros((len(NTU_vec), len(cr_vec)))  # Matriz para almacenar efectividad
for i, cr_val in enumerate(cr_vec):
    for j, NTU_val in enumerate(NTU_vec):
        if cr_val == 1:
            epsilon_contra[j, i] = NTU_val / (1 + NTU_val)  # Para cr=1, fórmula especial
        else:
            numerador = 1 - np.exp(-NTU_val * (1 - cr_val))
            denominador = 1 - cr_val * np.exp(-NTU_val * (1 - cr_val))
            epsilon_contra[j, i] = numerador / denominador
plt.figure(figsize=(10, 6))
for i, cr_val in enumerate(cr_vec):
    plt.plot(NTU_vec, epsilon_contra[:, i], label=f'cr={cr_val}')
plt.xlabel('Número de Unidades de Transferencia (NTU)')
plt.ylabel('Efectividad (ε)')
plt.title('Efectividad vs NTU para Intercambiador de Contraflujo')
plt.legend(loc='lower right')
plt.grid(True, alpha=0.3)
# Marcar el punto de operación
plt.plot(NTU, epsilon, 'ro', markersize=10, label='Punto de Operación')
plt.annotate(f'NTU={NTU:.3f}\nε={epsilon:.3f}', 
             xy=(NTU, epsilon), 
             xytext=(NTU+0.5, epsilon-0.1),
             arrowprops=dict(arrowstyle='->', color='red'))
plt.tight_layout()
plt.show()
# GRÁFICA 2: Q vs NTU para nuestro cr específico
Q_vec = np.zeros(len(NTU_vec))
for j, NTU_val in enumerate(NTU_vec):
    if cr == 1:
        epsilon_temp = NTU_val / (1 + NTU_val)
    else:
        numerador = 1 - np.exp(-NTU_val * (1 - cr))
        denominador = 1 - cr * np.exp(-NTU_val * (1 - cr))
        epsilon_temp = numerador / denominador
    Q_vec[j] = epsilon_temp * Q_max
plt.figure(figsize=(10, 6))
plt.plot(NTU_vec, Q_vec/1000, 'b-', linewidth=2)  # Convertir a kW
plt.xlabel('Número de Unidades de Transferencia (NTU)')
plt.ylabel('Tasa de Transferencia de Calor Q (kW)')
plt.title(f'Tasa de Transferencia de Calor vs NTU para cr={cr:.3f}')
plt.grid(True, alpha=0.3)
# Marcar el punto de operación
plt.plot(NTU, Q/1000, 'ro', markersize=10, label='Punto de Operación')
plt.annotate(f'NTU={NTU:.3f}\nQ={Q/1000:.1f} kW', 
             xy=(NTU, Q/1000), 
             xytext=(NTU+0.5, Q/1000-10),
             arrowprops=dict(arrowstyle='->', color='red'))
plt.legend()
plt.tight_layout()
plt.show()
# GRÁFICA 3: Perfil de temperaturas a lo largo del intercambiador
print(f"\nGENERANDO PERFIL DE TEMPERATURAS...")
# Simular el perfil a lo largo del intercambiador
longitud = np.linspace(0, 1, 100)  # Longitud adimensional
T_h_profile = np.zeros(len(longitud))
T_c_profile = np.zeros(len(longitud))
for i, L in enumerate(longitud):
    # Para contraflujo, las temperaturas varían exponencialmente
    A_eff = A_s * L  # Área efectiva hasta el punto L
    # Usar ecuaciones de variación de temperatura para contraflujo
    if C_h != C_c:
        T_h_profile[i] = T_h_i - (Q / C_h) * (1 - np.exp(-U * A_eff * (1/C_h - 1/C_c))) / (1 - (C_h/C_c) * np.exp(-U * A_eff * (1/C_h - 1/C_c)))
        T_c_profile[i] = T_c_i + (Q / C_c) * (1 - np.exp(-U * A_eff * (1/C_h - 1/C_c))) / (1 - (C_h/C_c) * np.exp(-U * A_eff * (1/C_h - 1/C_c)))
    else:
        # Caso cuando C_h = C_c
        T_h_profile[i] = T_h_i - (T_h_i - T_c_i) * (U * A_eff) / (C_h + U * A_eff)
        T_c_profile[i] = T_c_i + (T_h_i - T_c_i) * (U * A_eff) / (C_h + U * A_eff)
plt.figure(figsize=(10, 6))
plt.plot(longitud, T_h_profile, 'r-', linewidth=2, label='Aceite (Caliente)')
plt.plot(longitud, T_c_profile, 'b-', linewidth=2, label='Agua (Fría)')
plt.xlabel('Longitud Adimensional del Intercambiador')
plt.ylabel('Temperatura (°C)')
plt.title('Perfil de Temperaturas a lo largo del Intercambiador de Contraflujo')
plt.legend()
plt.grid(True, alpha=0.3)
# Marcar temperaturas de entrada y salida
plt.annotate(f'Entrada: {T_h_i}°C', xy=(0, T_h_i), xytext=(0.1, T_h_i+10),
             arrowprops=dict(arrowstyle='->', color='red'))
plt.annotate(f'Salida: {T_h_o:.1f}°C', xy=(1, T_h_o), xytext=(0.7, T_h_o-10),
             arrowprops=dict(arrowstyle='->', color='red'))
plt.annotate(f'Entrada: {T_c_i}°C', xy=(0, T_c_i), xytext=(0.1, T_c_i-10),
             arrowprops=dict(arrowstyle='->', color='blue'))
plt.annotate(f'Salida: {T_c_o:.1f}°C', xy=(1, T_c_o), xytext=(0.7, T_c_o+10),
             arrowprops=dict(arrowstyle='->', color='blue'))
plt.tight_layout()
plt.show()
# RESUMEN FINAL
print("\n" + "=" * 60)
print("RESUMEN FINAL DEL ANÁLISIS")
print("=" * 60)
print(f"Efectividad del intercambiador: {epsilon:.3f} ({epsilon*100:.1f}%)")
print(f"Tasa de transferencia de calor: {Q/1000:.1f} kW")
print(f"Temperatura de salida del aceite: {T_h_o:.1f} °C")
print(f"Temperatura de salida del agua: {T_c_o:.1f} °C")
print(f"Diferencia de temperatura del aceite: {T_h_i - T_h_o:.1f} °C")
print(f"Diferencia de temperatura del agua: {T_c_o - T_c_i:.1f} °C")
print("=" * 60)
Cita come
Juan Guillermo (2025). PRJECT (https://it.mathworks.com/matlabcentral/fileexchange/182415-prject), MATLAB Central File Exchange. Recuperato .
Compatibilità della release di MATLAB
              Creato con
              R2025b
            
            
              Compatibile con qualsiasi release
            
          Compatibilità della piattaforma
Windows macOS LinuxTag
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Scopri Live Editor
Crea script con codice, output e testo formattato in un unico documento eseguibile.
| Versione | Pubblicato | Note della release | |
|---|---|---|---|
| 1.0.0 |  | 
