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·atmDe 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