Está en la página 1de 5

Regresión no lineal.

Juan Camilo de la Cruz Álzate (1842841)


Laboratorio de Ingeniería química I, Universidad del Valle

Primer ejercicio
Se uso el comando fminsearch de Matlab para dar solución al problema, obteniendo los
parámetros de ajuste evidenciados en la Tabla 1.

Tabla 1: Parámetros de la ecuación de estado de Sánchez.


Parámetro Valor numérico
n 2.2581
b (L/mol) 0.058553
a (atm*L2*Kn) /(mol2) 9.2268X105

Con el propósito de visualizar la calidad del ajuste, se graficó el volumen experimental contra
volumen calculado usando el modelo (Figura 1).

Figura 1: Grafico del volumen experimental contra volumen calculado (◊). La línea continua
representa el comportamiento de los datos cuando el R2 es 1.
A continuación se muestra el algoritmo de Matlab usado:

clear; clc;

%Datos
Data = xlsread('04 - Datos de regresion no lineal','Ejercicio 1','A2:C22');
v = Data(:,1); v = v*(72)*(1/1000);
T = Data(:,3); T = T + 273.15;
P = Data(:,2);
R = 0.082057; %unidades de (atm*L)/(mol*K)

EOS = @(B) sum(((R*T)./(v-B(1)) - B(2)./((T.^B(3)).*v.^2)-P).^2); %Ecuacion de ajuste

%Obtencion de los parametros de ajuste


Bo = [0 0 0]; %Valor inicial de los parametros de ajuste (Ecuacion gas ideal)

for i = 1:100
opt=optimset('TolFun',0,'TolX',0,'Maxiter',10^(1e10));
Coeff = fminsearch(EOS,Bo,opt);
clc;
Bo = Coeff;
end

b = Coeff(1); a = Coeff(2); n = Coeff(3);


t = table(a,b,n);

%Grafico de volumen experimental vs volumen calculado


%Se usó la funcion fzero para determinar el volumen calculado con los
%parametros de ajuste. El volumen inicial es el volumen del gas ideal.

vo = (R*T)./P;
v_Model = zeros(21,1);

for i = 1:length(P)
EOS_Model = @(V)(R*T(i))./(V-Coeff(1)) - Coeff(2)./((T(i).^Coeff(3)).*V.^2)-
P(i);
v_Model(i) = fsolve(EOS_Model,vo(i));
clc;
end

plot(v_Model,v,'kd')
x = [min(v); max(v)];
y = x;
hold on
plot(x,y,'k-')
ylabel('volumen molar experimental (L/mol)')
xlabel('volumen molar calculado (L/mol)')

disp(t);

Problema 2

Para calcular los parámetros de la función a trozos, primero se separaron los datos en dos
grupos, cuando ∑xi > 150 y cuando ∑xi < 150. Luego, se estimaron los parámetros de ajuste
para cada uno de los casos. En la Tabla 2, se evidencian los parámetros de ajuste obtenidos
al usar el comando fminsearch de Matlab.
Tabla 2: Parámetros de la función a trozos.
Parámetro Valor numérico
Cuando ∑xi es mayor a 150
a1 -1.5341 X103
a2 13.0123
a3 0.0401
Cuando ∑xi es menor a 150
a1 149.9560
a2 12.0989
a3 0.0458

Finalmente, se realizo un grafico de y experimental contra y calculado para ambos grupos de


datos, es decir cuando ∑xi > 150 y cuando ∑xi < 150 (Figura 2 y 3 respectivamente), para
visualizar la calidad de ajuste del modelo.

Figura 2: Grafico de y experimental contra y calculado (◊) cuando ∑xi > 150. La línea
continua representa el comportamiento de los datos cuando el R2 es 1.
Figura 3: Grafico de y experimental contra y calculado (◊) cuando ∑xi < 150. La línea
continua representa el comportamiento de los datos cuando el R2 es 1.

A continuacion se muestra el algoritmo de Matlab usado:

clear; clc;

%Ajuste de curva cuando sum(xi) > 150


%%
Data1 = xlsread('04 - Datos de regresion no lineal','Ejercicio 2','F3:I15');
y = Data1(:,1); x1 = Data1(:,2); x2 = Data1(:,3); x3 = Data1(:,4);

F = @(a) (a(1) + a(2)*(x1.^2) + cos(a(3)*x2)).^(sin(a(3)*x3));


F1 = @(a) sum((F(a)-y).^2);

ao = [100 10 0.05];
opt=optimset('TolFun',0,'TolX',0,'Maxiter',10^(1e10));
a1 = fminsearch(F1,ao,opt);

y1 = [y F(a1)];
r1 = [min(y) max(y)]';

%Ajuste de curva cuando sum(xi) < 150


%%
Data1 = xlsread('04 - Datos de regresion no lineal','Ejercicio 2','F17:I23');
y = Data1(:,1); x1 = Data1(:,2); x2 = Data1(:,3); x3 = Data1(:,4);
F = @(a) (a(1) + a(2)*(x1.^2) + cos(a(3)*x2)).^1.5;
F1 = @(a) sum((F(a)-y).^2);

ao = [100 10 0.05];
opt=optimset('TolFun',0,'TolX',0,'Maxiter',10^(1e10));
a2 = fminsearch(F1,ao,opt);

y2 = [y F(a2)];
r2 = [min(y) max(y)]';
clc;

%Grafico de y experimental contra y calculada


%%
subplot(1,2,1),plot(y1(:,2),y1(:,1),'kd')
hold on
plot(r1,r1,'k-')
xlabel('valor de y calculada')
ylabel('valor de y experimental')
hold off

subplot(1,2,2),plot(y2(:,2),y2(:,1),'kd')
hold on
plot(r2,r2,'k-')
xlabel('valor de y calculada')
ylabel('valor de y experimental')
hold off

a1 = a1'; a2 = a2';
T = table(a1,a2);
disp(T)

También podría gustarte