SciLab. CicloTermodinámico


 Adjunto el programas en Scilab de un ciclo termodinámico:

clc; clear;

function CicloGrafico()
    // Número de procesos
    nproc = evstr(x_dialog("Número de transformaciones en el ciclo:","4"));
    
    // Datos iniciales
    labels = ["Presión inicial (atm)","Volumen inicial (L)","Temperatura inicial (K)","Número de moles"];
    defaults = ["1","1","300","1"];
    valores = x_mdialog("Datos iniciales", labels, defaults);
    
    P = evstr(valores(1));
    V = evstr(valores(2));
    T = evstr(valores(3));
    n = evstr(valores(4));
    
    ghamma = 1.4;
    R = 0.082;
    Cv = R/(ghamma-1);
    Cp = ghamma*Cv;
    
    Vol_total = []; Pres_total = [];
    W_total = 0; Q_total = 0;
    
    // Bucle de procesos
    for k = 1:nproc
        labels2 = ["Tipo (1=isocórica, 2=isobárica, 3=isotérmica, 4=adiabática)", ...
                   "Volumen final (L)", ...
                   "Presión final (atm)", ...
                   "Temperatura final (K)"];
        defaults2 = ["3","2","1","300"];
        datos = x_mdialog("Transformación "+string(k), labels2, defaults2);
        
        tipo = evstr(datos(1));
        Vf = evstr(datos(2));
        Pf = evstr(datos(3));
        Tf = evstr(datos(4));
        
        select tipo
        case 1 // Isocórica
            Volumen = V*ones(1,100);
            Presion = linspace(P, Pf, 100);
            W = 0;
            Q = n*Cv*(Tf - T);
            
        case 2 // Isobárica
            Volumen = linspace(V, Vf, 100);
            Presion = P*ones(1,100);
            W = P*(Vf - V);
            Q = n*Cp*(Tf - T);
            
        case 3 // Isotérmica
            Volumen = linspace(V, Vf, 100);
            Presion = (n*R*T) ./ Volumen;
            W = n*R*T*log(Vf/V);
            Q = W;
            
        case 4 // Adiabática
            Volumen = linspace(V, Vf, 100);
            Presion = P * (V ./ Volumen).^ghamma;
            Pf = P * (V/Vf)^ghamma;
            W = (Pf*Vf - P*V)/(1 - ghamma);
            Q = 0;
        end
        
        // Acumular datos
        Vol_total = [Vol_total Volumen];
        Pres_total = [Pres_total Presion];
        
        // Mostrar resultados en consola
        mprintf("\nTransformación %d:\n", k);
        mprintf("Trabajo W = %.2f L·atm\n", W);
        mprintf("Calor Q = %.2f L·atm\n", Q);
        
        W_total = W_total + W;
        Q_total = Q_total + Q;
        
        // Actualizar estado
        V = Vf; P = Pf; T = Tf;
    end
    
    // Gráfica del ciclo en la misma ventana
    clf;
    plot(Vol_total, Pres_total, 'b-', linewidth=2);
    xlabel("Volumen V (L)");
    ylabel("Presión P (atm)");
    title("Ciclo termodinámico en diagrama P-V");
    xgrid();
    
    // Balance energético
    mprintf("\nBalance del ciclo:\n");
    mprintf("Trabajo total W = %.2f L·atm\n", W_total);
    mprintf("Calor total Q = %.2f L·atm\n", Q_total);
endfunction

// Ejecutar
CicloGrafico();
Explicación de cada sentencia:

 Inicio y definición de la función
clc; clear;

clc limpia la consola.

clear borra todas las variables en memoria.
→ Se empieza con un entorno limpio.

function CicloGrafico()  
Define una función llamada CicloGrafico que contendrá todo el código.

🔹 Entrada de datos iniciales
nproc = evstr(x_dialog("Número de transformaciones en el ciclo:","4"));

x_dialog abre un cuadro de diálogo para pedir el número de procesos.

"4" es el valor por defecto.

evstr convierte la cadena introducida en número.

labels = [...] y defaults = [...]

Se definen etiquetas y valores por defecto para pedir al usuario los datos iniciales: presión, volumen, temperatura y número de moles.

valores = x_mdialog("Datos iniciales", labels, defaults);

Abre un cuadro de diálogo con varios campos para introducir los datos iniciales.

P = evstr(valores(1)); V = evstr(valores(2)); T = evstr(valores(3)); n = evstr(valores(4));

Convierte las entradas en valores numéricos y los asigna a las variables de estado inicial.

🔹 Constantes termodinámicas
ghamma = 1.4; → coeficiente adiabático (γ).

R = 0.082; → constante de los gases en unidades L·atm/(mol·K).

Cv = R/(ghamma-1); → calor específico a volumen constante.

Cp = ghamma*Cv; → calor específico a presión constante.

🔹 Inicialización de acumuladores
Vol_total = []; Pres_total = [];

Vectores vacíos para ir guardando todos los puntos del ciclo.

W_total = 0; Q_total = 0;

Variables para acumular el trabajo y el calor de todo el ciclo.

🔹 Bucle de procesos
for k = 1:nproc  
Itera sobre cada transformación del ciclo.

labels2 y defaults2

Etiquetas y valores por defecto para pedir datos de cada transformación: tipo, volumen final, presión final, temperatura final.

datos = x_mdialog(...)

Cuadro de diálogo para introducir los parámetros de la transformación.

tipo = evstr(datos(1)); Vf = evstr(datos(2)); Pf = evstr(datos(3)); Tf = evstr(datos(4));

Se convierten los datos a valores numéricos.

🔹 Selección del tipo de proceso
select tipo ... end  
Dependiendo del tipo de transformación:

Isocórica (volumen constante)

Volumen = V*ones(1,100); → vector constante.

Presion = linspace(P, Pf, 100); → presión cambia linealmente.

W = 0; → no hay trabajo.

Q = n*Cv*(Tf - T); → calor depende de ΔT.

Isobárica (presión constante)

Volumen = linspace(V, Vf, 100); → volumen cambia linealmente.

Presion = P*ones(1,100); → presión constante.

W = P*(Vf - V); → trabajo = P·ΔV.

Q = n*Cp*(Tf - T); → calor depende de ΔT.

Isotérmica (temperatura constante)

Volumen = linspace(V, Vf, 100);

Presion = (n*R*T) ./ Volumen; → ley de Boyle.

W = n*R*T*log(Vf/V); → trabajo isotérmico.

Q = W; → calor = trabajo.

Adiabática (sin intercambio de calor)

Volumen = linspace(V, Vf, 100);

Presion = P * (V ./ Volumen).^ghamma; → relación adiabática.

Pf = P * (V/Vf)^ghamma; → presión final.

W = (Pf*Vf - P*V)/(1 - ghamma); → trabajo adiabático.

Q = 0; → no hay calor.

🔹 Acumulación y resultados
Vol_total = [Vol_total Volumen]; Pres_total = [Pres_total Presion];

Se añaden los puntos de cada proceso al ciclo completo.

mprintf(...)
mprintf("\nTransformación %d:\n", k);
mprintf → función de Scilab para imprimir texto en la consola (similar a printf en C).

"\nTransformación %d:\n" → cadena de texto que incluye:

\n → salto de línea (para que el texto aparezca en una nueva línea).

"Transformación %d:" → texto fijo.

%d → marcador de posición para un número entero.

k → variable que indica el número de la transformación dentro del ciclo (1, 2, 3, …).


Código
Transformación 2:
 Segunda línea

mprintf("Trabajo W = %.2f L·atm\n", W);
"Trabajo W = %.2f L·atm\n" → cadena de texto que incluye:

"Trabajo W =" → texto fijo.

%.2f → marcador de posición para un número decimal con 2 cifras decimales.

"L·atm" → unidades del trabajo (litro·atmósfera).

\n → salto de línea.

W → variable que contiene el trabajo calculado en esa transformación.

Ejemplo de salida:

Código
Trabajo W = 12.45 L·atm
Tercera línea

mprintf("Calor Q = %.2f L·atm\n", Q);
"Calor Q = %.2f L·atm\n" → cadena de texto que incluye:

"Calor Q =" → texto fijo.

%.2f → número decimal con 2 cifras decimales.

"L·atm" → unidades del calor.

\n → salto de línea.

Q → variable que contiene el calor intercambiado en esa transformación.

Ejemplo de salida:

Código
Calor Q = -5.30 L·atm
n conjunto
Cada bloque imprime algo como esto en la consola:

Código
Transformación 1:
Trabajo W = 0.00 L·atm
Calor Q = 8.23 L·atm
De esta forma, el usuario puede seguir paso a paso el balance energético de cada proceso antes de ver el ciclo completo en la gráfica.

Muestra en consola el trabajo y calor de cada transformación.
W_total = W_total + W; Q_total = Q_total + Q;

Se acumulan los balances.

V = Vf; P = Pf; T = Tf;

Se actualiza el estado final como nuevo estado inicial para la siguiente transformación.














.




No hay comentarios:

Publicar un comentario