Está en la página 1de 59

..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

Matem ática Avanzada para Ingenieros Quím icos


Carrera Ingeniería Química.

Ejem plos de Matlab


Apuntes de Cátedra y
Material Didáctico

Trabajos Prácticos y
Problemas Resueltos Ejemplo 01: Que son los Métodos Numéricos?
Ejemplo 02: Errores Numéricos
Ejemplos de Matlab
Ejemplo 03: Manejo de procedimientos de lectura y escritura de archivos
Software Ejemplo 04: Overflow y Underflow
Ejemplo 05: Sistema de Ecuaciones Lineales: Extractor líquido - líquido
Bibliografía recomendada
Ejemplo 06: Matrices mal acondicionadas
Programa Analítico Ejemplo 06-b: Norma de Matrices y número de condición
Links de Interés Ejemplo 07: Descomposición plu
Ejemplo 08: Regresión Lineal
Ejemplo 09: Factorización QR de matrices
Ejemplo 10: Factorización QR con pivoteo de columna
Links Ejemplo 11: Descomposición en Valores Singulares
U.T.N. Ejemplo 12: Estadística Elemental y Probabilidad
Otras materias Ejemplo 13: Propagación del Error
Ejemplo 14: Propagación del Error en la Regresión Lineal
Ejemplo 15: Análisis y Error de Regresión
Ejemplo 16: Métodos de Newton y de la Secante
Ejemplo 17: Sistemas de Ecuaciones No Lineales
Ejemplo 18: Optimización Unidimensional
Ejemplo 19: Optimización Restringida
Ejemplo 20: Cuadratura
Ejemplo 21: Estimación del Error de Cuadratura
Ejemplo 22: Cuadratura Adaptativa
Ejemplo 23: Mapping y Cuadratura Adaptativa
Ejemplo 24: Mapping e Integración Monte Carlo
Ejemplo 25: Ecuaciones Diferenciales Ordinarias
Ejemplo 26: Métodos de Integración de EDO's
Ejemplo 27: Algoritmos con Control Adaptativo de Paso
Ejemplo 28: Problemas de Valores de Contorno: Shooting Method

%Ejemplo 01: Que son los Métodos Numéricos?


clear
echo on
%Este ejemplo demuestra el uso de un subprograma simple
%para calcular el capital de una cuenta de retiro en función
%de la tasa de ahorro. La tasa de ahorro se especifica en x%.
%En primer lugar determinaremos el arreglo de valores x,
%esto es:
x=[0:.2:30];
%La cifra en el medio simplemente nos indica que x variará
%entre 0% y 30% en pasos de 0.2%.
pause
%Seguidamente invocaremos al subprograma a través del llamado
%de la función:
[r, s]=retire(x);

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
1 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

pause
%Finalmente, graficaremos la función:
plot(x,r)
pause
%En el gráfico vemos que el capital deseado de $1M se alcanza con una tasa
%de ahorro de aproximadamente 12.5%. Un programa más sofisticado podría
%explorar el efecto de diferentes tasas de interés, de aumento y de inflación.
echo off

Funciones del Ejemplo:


function [r, s] = retire(x)
%Esta función calcula el fondo de retiro en pesos
%corrientes para un salario inicial determinado,
%para una tasa de aumento salarial anual fija y para una tasa
%de inflación fija, como función de la fracción de
%salario ahorrada. Se supone que Ud. trabaja durante 40 años.
s=40000;
r=x*s/100;
for i=2:40
s=s*(1+0.04)*(1-0.03);
r=r*(1+0.10)*(1-0.03)+s.*x/100;
end;
%Un aspecto a notar en las expresiones de arriba,
%es que cuando s se multiplica por x utilizamos el operador (.*)
%en lugar de (*).
%Como se discutió en el Matlab Primer, el comando (*)
%se utiliza para la multiplicación matricial o para la
%multiplicación por un escalar.
%El comando .* (o ./ o .^) se reserva para la
%multiplicación término a término de cada elemento de s y de x.
%Al operar de esta manera, la función puede manejar un conjunto
%de diferentes tasas de ahorro como un arreglo.
%Esto simplifica considerablemente al programa principal.
%Desafortunadamente esto puede conducir a errores de
%programación si no es cuidadoso.

ir arriba

%Ejemplo 02: Errores Numéricos


clear
echo on
%Este programa muestra el error de redondeo de la máquina
%y del algoritmo para el cálculo en diferencias hacia adelante
%de la derivada de una función.
%El algoritmo en diferencias hacia adelante es:
%df/dx = (f(x+h)-f(x))/h
%donde h representa una cantidad pequeña. Aplicamos la fórmula
%a la función f(x)=exp(x) en el rango x=0:.1.
%Promediamos el error aleatorio de redondeo para los diferentes valores de x.
%Elegimos valores de h en el rango e-6 to e-9.
pause
echo off
x=[0:.001:.1];

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
2 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

for i=60:90
h(i)=10^(-i/10);
deriv=(exp(x+h(i))-exp(x))/h(i);
error(i)=sum(abs(deriv-exp(x)))/101;
end;
echo on
loglog(h,error);
pause
%Como puede verse, el error mínimo ocurre para un valor de h
%de alrededor de 1.5*10^-8. Esto significa que, a partir de la fórmula
%para el error de diferencias hacia adelante, la precisión de la
%máquina es de alrededor de 0.5*10^-16, o sea doble precisión.
echo off
ir arriba

%Ejemplo 03: Manejo de procedimientos de lectura y escritura de archivos


clear
echo on
%Esta es una demostración de manejo de procedimientos de lectura y escritura
%de archivos. En primer lugar mostraremos el comando 'save',
%Construimos una matriz A:
A=[1.2, 2.3, 3.4; 4.5, 5.6, 2*pi]
pause
%La salvamos (guardamos) en un archivo A.m en el directorio actual:
save 'A.m' A;
%Trate de abrir el archivo A.m utilizando el editor de texto.
pause
%Esta forma de guardar los datos no luce bien debido a que éstos se almacenan
%en forma binaria.Podemos modificar esta situación haciendo algunos cambios:
save 'A.m' A -ascii -double -tabs;
%de esta manera guardamos el archivo de datos en formato ascii, usando
%doble precisión y tabulando las columnas.
%Observe nuevamente el archivo con el editor de texto.
pause
%El archivo ahora tiene más sentido, pero deberá tener en cuenta
%el error de redondeo en el último dígito!
%Podemos volver a cargar este archivo. En primer lugar borramos la variable 'A',
%luego la cargamos (comando 'load'):
clear A
load 'A.m'
%y mostramos el resultado:
A
pause
%En este caso el comando load 'A.m' carga el contenido del archivo 'A.m'
%en la variable de nombre A. Si hubiésemos estipulado el nombre 'B.m'
%por ejemplo, tendríamos que copiar el contenido del archivo 'A.m' en 'B.m'
%para dirigir el contenido de la variable de 'A' a la variable 'B'.
%Hagamos esto.Establezcamos el archivo 'B.m' utilizando el comando interno 'copyfile':
copyfile A.m B.m
load 'B.m'
B

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
3 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

pause
%Como puede verse, esta operatoria hace fácil obtener
%archivos de entrada y de salida de MATLAB. Este ejemplo puede imprimirse.
%La forma más simple de hacer esto es utilizar el comando 'diary' (de MATLAB):
diary 'out.txt'
disp('Esta es la matriz A')
disp('A')
diary off
%Ahora abrimos el archivo 'out.txt' utilizando el editor de texto.
%Nos dará la salida deseada.
%La hojarasca adicional que aparece en el archivo
%se debe a que utilizamos el comando 'echo'.
%La extensión 'txt' del archivo nos indica que es un archivo de texto,
%sin embargo, también funcionará con otras extensiones.
pause
%Se puede hacer lo mismo con figuras utilizando el comando 'print'
%Primero, determinemos la figura:
x=[0:.1:6*pi];
plot(x,sin(x))
echo off
ir arriba

%Ejemplo 04: Overflow y Underflow


clear
echo on
%Este archivo de instrucciones utiliza la función
%prob.m para calcular la probabilidad de que ocurra
%exactamente k veces un determinado evento sobre un total de
%n pruebas, teniendo en cuenta que la probabilidad del evento es p.
%Supongamos que arrojamos una moneda al aire 50 veces. ¿Cuál es la probabilidad
%que salga cara 25 veces?
x=prob(.5,25,50)
pause
%Podemos graficar la función de distribución de probabilidades en función de k:
k=[1:50];
plot(k,prob(.5,k,50))
xlabel('k')
ylabel('probabilidad')
pause
%A partir del gráfico vemos que la probabilidad presenta un máximo para k = 25
%como era de esperar.
pause
%También podemos observar la probabilidad acumulada;
semilogy(k,cumsum(prob(.5,k,50)))
xlabel('k')
ylabel('probabilidad de k occurrencias')
%Por consiguiente, la probabilidad de obtener 10 veces cara o 10 veces cruz
%de 50 tiradas es de alrededor de 10^-5, esto es, una probabilidad muy pequeña.
echo off
Funciones del Ejemplo:
function x= prob(p,k,n)
%Esta función calcula la probabilidad de obtener exactamente k resultados positivos

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
4 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%de n pruebas, teniendo en cuenta que la probabilidad individual de cada evento es p.


%En esta función n y p son escalares, pero podrían ser vectores.
%El programa se escribió para evitar el overflow y underflow para valores muy grandes de n.
%Para ello, se multiplica o divide por un número muy grande, b, para mantener el resultado
%dentro del rango de validez.
%La variable m registra el número de veces que b ha sido utilizado.
b=10^10;
npts=length(k);
for i=1:npts
xt=1;
kt=k(i);
m=0;
%Esta parte del programa calcula el numerador del coeficiente binomial (lambda 2):
for j=(n-kt+1):n
xt=xt*j;
if xt > b
xt=xt/b;
m=m+1;
end
end

%Para el denominador del coeficiente binomial (lambda 1) tenemos:


for j=1:kt
xt=xt/j;
if xt < 1/b
xt=xt*b;
m=m-1;
end
end

%Luego, multiplicamos por la probabilidad de ocurrencia de cada evento individual:


for j=1:kt
xt=xt*p;
if xt < 1/b
xt=xt*b;
m=m-1;
end
end

for j=(kt+1):n
xt=xt*(1-p);
if xt < 1/b
xt=xt*b;
m=m-1;
end
end
%Finalmente multiplicamos por la cantidad b^m para corregir por todos nuestros ajustes
x(i)=xt*b^m;
end;
function x= prob2(p,k,n)
%Esta función calcula la probabilidad de obtener exactamente k resultados positivos
%de n pruebas, teniendo en cuenta que la probabilidad individual de cada evento es p.
%En esta función n y p son escalares, pero podrían ser vectores.
%El programa se escribió sin escalamiento, por lo tanto no evita el overflow y underflow
%para valores muy grandes de n.
npts=length(k);

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
5 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

for i=1:npts
xt=1;
kt=k(i);
m=0;
%Esta parte del programa calcula el numerador del coeficiente binomial (lambda 2):
for j=(n-kt+1):n
xt=xt*j;
end

%Para el denominador del coeficiente binomial (lambda 1) tenemos:


for j=1:kt
xt=xt/j;
end

%Luego, multiplicamos por la probabilidad de ocurrencia de cada evento individual:


for j=1:kt
xt=xt*p;
end

for j=(kt+1):n
xt=xt*(1-p);
end

x(i)=xt;
end;
ir arriba

%Ejemplo 05: Sistema of Ecuaciones Lineales: Extractor líquido - líquido


clear
echo on
%Este archivo de sentencias ilustra como un sistema de ecuaciones
%puede ser usado para resolver problemas de ingeniería química.
%Consideremos el ejemplo del extractor líquido-líquido como el visto en teoría.
%En cada etapa los flujos de agua y solvente se consideran en equilibrio
%de manera que, y(i)=k*x(i) donde k es la constante de la ley de Henry.
%Además, el balance de masa en cada etapa establece que
%la cantidad de soluto que ingresa a la misma es igual a la
%cantidad de soluto que sale.
%
%Usaremos esta información para determinar la
%distribución de concentraciones en las cuatro etapas.
pause
%Sea s el flujo molar del solvente y w el flujo molar de la
%corriente de agua. k es la constante de la ley de Henry.
%La solución del sistema depende únicamente de la relación s*k/w,
%la cual representaremos por el símbolo chi.
chi = 0.1;
pause
%Establecemos la matriz:
n=4;
%Esta línea de códigos crea la diagonal principal de
%la matriz a resolver:
a=-(1+chi)*diag(ones(1,n),0)
pause
%Esta línea crea la sub-diagonal de la matriz:

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
6 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

a=a+diag(ones(1,n-1),-1)
pause
%Y esta línea crea la diagonal superior:
a=a+chi*diag(ones(1,n-1),1)
pause
%Establecemos el lado derecho del sistema de ecuaciones:
b=zeros(n,1);
b(1)=-1
%donde hemos asumido que la concentración de entrada
%del soluto en el agua es la unidad, y la concentración de
%entrada del soluto en el solvente es cero.
pause
%Ahora, resolvemos la distribución de concentraciones
%usando el comando \ , y graficamos el resultado.
x=a\b;
plot(x)
ir arriba

%Ejemplo 06: Matrices mal acondicionadas


clear
echo on
%En este ejemplo demostraremos el error inducido por una matriz mal acondicionada.
%Utilizaremos como ejemplo la matriz de Hilbert dada abajo:
n=5;
h=zeros(n,n);
%Esto inicializa el tamaño de h
echo off
for i=1:n
for j=1:n
h(i,j)=1/(i+j-1);
end;
end;
pause
echo on
%Ahora mostramos esta matriz:
h
pause
%Como puede observarse, la matriz aparenta ser normal, esto es,
%no revela suciedad escondida dentro.
%Para este ejemplo, en primer lugar determinaremos la solución.
%Construyamos el vector b de términos independientes de manera que la solución
%del sistema h*x=b sea x(i)=i. Así:
pause
x=cumsum(ones(n,1))
%Esta es la manera más rápida de hacerlo. Ahora, para b:
pause
b=h*x
%cuyo lado derecho aparenta ser perfectamente inocente.
pause
format long
%Resolvamos el sistema utilizando la descomposición LU:

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
7 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

x=h\b
format short
pause
%Observe el error que se comete en la solución! Éste se produce aún trabajando
%en doble precisión. Podemos ver esto más claramente si adicionamos un poco
%de error al vector b:
bp=b+rand(n,1)*10^(-n)
%La operación anterior adiciona al vector b un error aleatorio del orden de 10^-n.
%Observemos ahora la solución:
pause
xp=h\bp
%que es disparatadamente diferente de la solución original!
%Finalmente, podemos comparar las normas (en este ejemplo utilizamos la norma 1 o Manhattan):
pause
deltax=norm(xp-x,1)/norm(x,1)
deltab=norm(bp-b,1)/norm(b,1)
%Finalmente calculamos la razón:
ratio=deltax/deltab
pause
%Esta relación es muy grande! Podemos compararla con el número de condición de la matriz
%de Hilbert:
cond(h,1)
%que es del mismo orden de magnitud que la razón calculada previamente.
%Moraleja de esta historia: ¡Cuidado con las matrices mal acondicionadas!
echo off
ir arriba

%Ejemplo 06-b: Norma de Matrices y número de condición


clear
echo on
%Este archivo de instrucciones demuestra la
%relación entre la norma de la matriz A y su
%número de condición. El número de condición
%se usa en la determinación de la sensibilidad
%de la solución de un sistema de ecuaciones a los
%errores en la matriz y en el vector de términos
%independientes
%
%Primero definamos a:
a=[1 2; 3 4]
pause
%Deseamos determinar la variación de la relación
%||Ax|| / ||x|| con la dirección del vector x.
%Esta relación es independiente de la longitud de x,
%y es solamente función de su dirección y del modo
%en que esta dirección interactua con la matriz A.
%A una vector de 2 dimensiones podemos
%representarlo en función de un angulo theta.
%Esto es
pause
theta=[0:.01:2*pi];
npt=length(theta);

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
8 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

echo off
for i=1:npt
x=[cos(theta(i)),sin(theta(i))]';
%Aquí usamos la transpuesta porque necesitamos un
%vector columna para x.

b=a*x;

%Finalmente, calculamos la relación de las normas. El


%'1' en el comando 'norm' especifica la norma manhattan.
m(i)=norm(b,1)/norm(x,1);
end;
echo on
pause
%Grafiquemos la relación vs. la dirección del vector x:
plot(theta,m)
xlabel('theta')
ylabel('norm(b)/norm(n)')
%Esta relación depende fuertemente del ángulo theta.
%El valor máximo es la norma de la matriz A, el cual es
%igual al máximo de las normas de todas las columnas de A.
%Para esta matriz el máximo es 6.
pause
%El mínimo es 1/||inv(A)||. Podemos determinarlo:
ainv=inv(a)
%entonces el mínimo es solo 1/3.5 = 0.2857. Este es cercano
%al valor que obtenemos de la gráfica:
min(m)
pause
%La diferencia ocurre porque no hemos elegido un vector
%x que realmente corresponda a la dirección del mínimo.
%
%Finalmente, podemos determinar el número de condición.
%Este es igual a ||inv(A)||*||A||, o el max dividido por el
%min de ||Ax|| / ||x||
%De esta manera obtenemos:
condition=max(m)/min(m)
%Podemos compararlo con el valor estimado por la función de
%MATLAB 'cond(A)':
cond(a)
pause
%Como podemos ver, los dos son un tanto diferentes. Los procedimientos
%de cálculo de matlab para el número de condición utilizan la norma-2
%en cambio de la norma manhattan.
%El número de condición de la norma-2 se define como la relación
%del más grande al más pequeño de los valores singulares de la matriz.
%El número de condición de la norma manhattan puede ser estimado
%mediante el siguiente comando:
condest(a)
pause
%Este valor no es siempre correcto - se utiliza un algoritmo
%para estimar el número de condición porque el cálculo exacto
%realiza muchas más operaciones que la descomposición LU!
echo off

ir arriba

Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.
9 de 59 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Ejemplo 07: Descomposición plu


clear
echo on
%En este ejemplo demostraremos el uso de la descomposición plu de una matriz 'a'
%para resolver un sistema de ecuaciones lineales. En primer lugar definamos la matriz 'a'.
%Nuevamente, utilizaremos una matriz de Hilbert de 7x7:
echo off
n=7;
a=zeros(n,n);
for i=1:n
for j=1:n
a(i,j)=1/(i+j-1);
end;
end;
echo on
%Veamos la matriz a,
a
pause
%Determinemos el vector de términos independientes 'b' del sistema a*x=b:
x=[1:n]';
b=a*x
%esto es, a partir de la matriz 'a' y el vector solución 'x' obtenemos el lado derecho del
%sistema de ecuaciones cuya solución nos dá el arreglo x = [1:n]'.
pause
%Resolvamos el sistema utilizando la descomposición lu:
[l u pt]=lu(a);
%que genera una matriz triangular superior 'u', una matriz triangular inferior 'l' y la
%transpuesta de la matriz de permutacion p, pt=p'. La matriz original puede recuperarse
%efectuando a = p * l * u.
%Para mayor información escriba en la línea de comandos del MATLAB 'help lu'.
%Examinemos c/u de éstas matrices.
pause
%La matriz de permutación viene dada por:
p=pt'
%Observemos que 'p' representa a la matriz identidad permutada, esto es,
%lo que hace es intercambiar las filas de la matriz 'a' debido al pivoteo.
pause
%La matriz 'p' tiene la propiedad de ortogonalidad, por ejemplo, p'*p = p*p' = eye.
%Esto significa que si una matriz es ortogonal, su inversa es igual a su transpuesta.
%Podemos ver esto:
p'*p
%y
p*p'
pause
%La matriz 'l' es una matriz triangular inferior con unos en la diagonal. Los elementos son
%simplemente los multiplicadores del proceso de eliminación Gaussiana:
l
pause
%La matriz 'u' es una matriz triangular superior - matriz resultante una vez que el proceso de
%eliminación Gaussiana se haya completado:
u

10 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

pause
%Podemos utilizar estas matrices para resolver el sistema original de ecuaciones para vectores
%arbitrarios 'b', resolviendo la siguiente serie de problemas:
% p* z= b
% l*y=z
% u* x= y
%Esto es mucho más rápido que efectuar la eliminación Gaussiana. Mostremos esto:
pause
flops(0)
z=p'*b;
y=l\z;
x=u\y;
%Por lo tanto x resulta:
x
%y el número total de sustituciones hacia atrás y hacia adelante es:
subflops=flops
pause
%Podemos comparar este número de operaciones resolviendo 'x' directamente para cada vector 'b'
%en el lado derecho del sistema:
flops(0)
x=a\b
elimflops=flops
%Por consiguiente la solución 'x' del sistema de ecuaciones es la misma que antes,
%pero el número de operaciones es más alto. La discrepancia sería mucho mayor si el orden n de
%la matriz fuese mucho mayor.
echo off
ir arriba

%Ejemplo 08: Regresión Lineal


clear
echo on
%Este ejemplo muestra el uso de técnicas matriciales de solución para
%resolver problemas de regresión lineal.
%Como ejemplo, supongamos que hemos medido la concentración de un soluto en un solvente
%en función del tiempo, con el propósito de determinar el coeficiente de transferencia
%de masa de una membrana. Para observar la geometría del sistema, vea las notas de clase.
%Tenemos entonces, los tiempos y las concentraciones medidas:
t=[0,1,2,4,8];
%y
c=[2.1,1.55,1.38,1.13,1.016];
pause
%Podemos graficar estos valores,
plot(t,c,'o')
xlabel('Tiempo')
ylabel('Concentración')
hold on
%Observe que la concentración tiende a un valor de equilibrio cuando el tiempo
%alcanza valores muy grandes. Determinamos que el valor de equilibrio es 1.0.
pause
%En razón de efectuar una regresion lineal, nuestra ecuación debe ser lineal
%en los parámetros del modelo (no necesariamente en el tiempo). Para ello, transformamos
%el modelo:
% (c-ceq)=(c0 - ceq)exp(-hAt/V)
%en la forma:

11 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

% ln(c-ceq)=ln(c0-ceq) - (hA/V)t
%donde ln(c0-ceq) y -(hA/V) son los nuevos parámetros del modelo.
%Podemos resolver directamente:
pause
%Definiendo x1=-(hA/V) y x2=ln(c0-ceq), obtenemos:
n=length(t);
ceq=1.0;
y=log(c-ceq);
x1=(y*t'-sum(y)*sum(t)/n)/(t*t'-sum(t)^2/n)
x2=(sum(y)-x1*sum(t))/n
pause
%Podemos graficar este resultado:
plot(t,ceq+exp(x2+x1*t), 'r')
%que pasa entre los puntos experimentales.
hold off
pause
%Hay más de una manera de resolver el sistema de ecuaciones lineales.
%El problema de regresión lineal que hemos resuelto puede transformarse en
%un sistema de ecuaciones lineales.
%Definimos las funciones de modelización como una matriz A:
A=[t', ones(n,1)]
%y definimos el lado derecho (los puntos medidos ajustados por el modelo) por el vector
%columna:
b=y'
%El vector solución x que representa a los parámetros del modelo, obtenido por regresión
%lineal, puede determinarse a partir de la resolución del siguiente sistema de ecuaciones
%lineales:
%(A'*A)*x = A'*b.
%Estas ecuaciones se conocen con el nombre de ecuaciones normales de la regresión lineal.
pause
%Si resolvemos este problema utilizando los operadores del MATLAB obtenemos:
x=(A'*A)\(A'*b)
%que es la misma solución obtenida a través del enfoque directo.
%La ventaja de este enfoque es que fácilmente puede extenderse a cualquier número
%de parámetros del modelo.
%En la próxima clase demostraremos una forma superior de resolver este tipo de problemas
%de regresión.
echo off
ir arriba

%Ejemplo 09: Factorización QR de matrices


clear
echo on
%En este ejemplo demostraremos como
%la factorización QR se puede usar para resolver
%problemas de regresion lineal. Primero plantearemos
%el problema. Supongamos que deseamos determinar
%la aceleración de la gravedad
%midiendo la posición de un proyectil
%en función del tiempo después de su lanzamiento.
%Sabemos de mecánica que la posición en función del tiempo de un proyectil balístico
%se expresa como:
%h = h0 + u0*t -0.5*g*t^2
%donde h0 es la posición inicial y u0 es la velocidad inicial.
%De este modo tenemos como datos los puntos (t(i),h(i));
%podemos ajustarlos a una parábola y obtener g.
pause

12 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Tomemos como datos los siguientes tiempos:


t=[0,.1,.2,.3,.4,.5,.6]'
%y las respectivas alturas del proyectil:
h=[0.5,14.6,21.0,15.5,2.0,-22.7,-56]'
pause
%Podemos graficarlos:
plot(t,h,'o')
pause
%Las funciones del modelo son 1, t, y t^2,
%luego la matriz A esta dada por:
n=length(t);
a=[ones(n,1),t,t.^2]
pause
%Podemos resolver el problema usando las ecuaciones normales:
ata=a'*a
atb=a'*h
pause
%la solución será:
x=ata\atb
%con una aceleración gravitacional de:
g=-2*x(3)
pause
%Podemos comparar las predicciones del modelo con los datos experimentales:
hold on
plot(t,a*x)
pause
%Ahora realicemos lo mismo via factorización QR.
%Primero obtengamos la factorización QR:
[q,r]=qr(a);
%Veamos a r primero:
r
%Notar que sólo los elementos triangulares superiores son distintos de
%cero. Los elementos diagonales de esta matriz no están
%necesariamente ordenados por tamaño.
pause
%Veamos la matriz q:
q
%Esta es una matriz cuadrada con la interesante propiedad
%que q'*q=eye, esto es, q es ortogonal.
q'*q
pause
%Podemos reducir el problema multiplicando a la matriz 'a' y el lado derecho
%de la ecuación por q':
qta=q'*a
%y
qtb=q'*h
pause
%Notar que los últimos cuatro elementos del nuevo lado derecho de la ecuación
%proveen la norma del residuo.
%Resolvamos esto:
x=r\qtb
%lo cual da el mismo resultado.
echo off

ir arriba

%Ejemplo 10: Factorización QR con pivoteo de columna

13 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

clear
echo on
%Este archivo de instrucciones demuestra el uso de la factorización 'qr' con
%pivoteo de columna.
%En primer lugar consideremos la matriz A:
a=[1 2 3;4 5 6;7 8 9;10 11 12]
pause
%Si efectuamos una factorización 'qr' sobre est matriz, obtenemos:
[q r]=qr(a)
pause
%Observe que la matriz 'a' no es de rango total debido a que el último término de
%la diagonal de la matriz 'r' es cero. No es exactamente cero debido a los errores de redondeo.
%Veamos su valor:
format short e
s=r(3,3)
format short
%que es lo que esperaríamos para simple precisión. Veamos ahora la matriz discutida en clase.
pause
%Tenemos:
n=7
a=eye(n)
%Construímos la matriz 'a'triangular superior de la siguiente manera:
echo off
for i=1:(n-1)
for j=i+1:n
a(i,j)=-1;
end
end
%que produce:
a
pause
echo on
%Podemos efectuar una factorización 'qr' a la matriz 'a':
[q r]=qr(a)
%Observemos que la factorización 'qr' no produce ningún cambio
%debido a que la matriz 'a' ya se encuentra en la forma triangular superior.
pause
%Podemos aprender mucho acerca de la matriz (cuán próxima se encuentra a la
%singularidad) si efectuamos factorización 'qr' con pivoteo de columna:
[q, r, pt]=qr(a);
%Esta vez obtenemos:
r
pause
%Observemos que el último elemento diagonal de 'r' es un par de órdenes de magnitud
%más pequeño que los otros elementos diagonales. Esto es debido a que la matriz 'a'
%está próxima a la singularidad.
%Esta descomposición es una descomposición 'qrp', sin embargo MATLAB devuelve 'pt'
%(transpuesta de 'p') en lugar de 'p'. Podemos mostrar esto:
q*r*pt'
%que es la matriz original 'a', al menos para la precisión de la máquina.

14 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

echo off
ir arriba

%Ejemplo 11: Descomposición en Valores Singulares


echo on
clear
clf
clc
%Este programa demuestra de qué manera puede utilizarse la descomposición en valores singulares
%para comprimir una imagen.
%Requiere del programa displaycomponents.m que debe estar en el mismo directorio que el
%presente archivo de instrucciones.
%La imagen trees está incluida en el demo de MATLAB.
load trees; %Se carga la imagen.
a=X;
[m,n] = size(a); %Tamaño de la imagen.
%Descomposición en valores singulares:
[u,s,v] = svd(a);
sv = diag(s); %Valores singulares de a.
plot(sv)
pause
%Seguidamente se genera una diapositiva que permite controlar el número de valores singulares
%que se utilizarán en la reconstrucción de la imagen.
components = uicontrol('Style','Slider',...
'Min',1,'Max',250,'Value',20,...
'Position',[20,20,500,20],...
'Callback','displaycomponents');
%Esta es una función de MATLAB que genera y dibuja la imagen con el número de componentes
%controladas por diapositiva:
displaycomponents

Archivo de sentencias complementario al ejemplo:


%displaycomponents.m
echo off;
ncomp = get(components,'Value');
ncomp = round(ncomp)
i = 1:ncomp; %Selecciona los primeros ncomp valores.
us = u(:,i);
vs = v(:,i);
ss = diag(sv(i));
echo on
%Esto genera una estimación de a utilizando únicamente los primeros ncomp valores singulares.
as=us*ss*vs';
subplot(1,2,1);
image(a);
subplot(1,2,2);
image(as);

Para bajar el archivo complementario trees hacer clik aquí


ir arriba

15 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Ejemplo 12: Estadística Elemental y Probabilidad


clear
echo on
%Este archivo ilustra algunas propiedades elementales
%de la distribución normal o Gaussiana.
%La densidad de probabilidad de una distribución normal se define como
%la probabilidad que una medición esté en el rango [x,x+dx]dividida por el ancho
%del intervalo. Es igual a la derivada de la función de probabilidad acumulada.
%Para una distribución Gaussiana, la densidad tiene la forma:
%
%p(x) = 1/((2*pi)^.5*sigma)*exp((x-mu)^2/(2*sigma^2))
%
%que está caracterizada por la media mu y la desviación estándar sigma.
%Seguidamente graficamos esta distribución.
pause
mu=0;
sigma=1;
x=[-3:.01:3];
p = 1/((2*pi)^.5*sigma)*exp(-(x-mu).^2/(2*sigma^2));
plot(x,p)
pause
%Como puede observarse, la probabilidad de obtener una determinada medición cae rápidamente
%cuando uno se aleja de la media.
%Podemos ver ahora la probabilidad acumulada, que se obtiene integrando p(x), o
%más convenientemente, utilizando la función erf, definida como la integral de:
%2/sqrt(pi) * exp(-t^2) de cero a x. Por consiguiente:
P = 0.5 + erf((x-mu)/sigma/sqrt(2))/2;
pause
plot(x,P)
%A partir de este gráfico se puede ver que hay un 31% de probabilidades que una medición caiga
%1 sigma por encima o 1 sigma por debajo de la media. Esto se reduce al 5%
%para 2 sigma y así sucesivamente.
pause
%¿Cómo calculamos ahora la media y la varianza de la distribución?
%En primer lugar generemos la distribución utilizando el comando
%randn (generador de una distribución normal)
n=100;
z=randn(n,1);
%Grafiquemos la distribución acumulativa:
zs=sort(z);
cumprob=[1:n]/n;
pause
plot(zs,cumprob)
%Puede verse que esto se asemeja a la probabilidad que obtuvimos antes, excepto que es
%bastante más ruidosa. Comparémoslas:
pause
hold on
plot(x,P,'r')
hold off
%lo cual demuestra la equivalencia.
%Podemos calcular la media de la muestra:
mean=sum(z)/n

16 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%y la varianza:
variance = sum((z-mean).^2)/(n-1)
%Observe que la varianza es mucho menos segura que la media.
%Esto se debe a que hemos tratado de estimar un momento de orden más elevado que, en general
%toma muchos más datos!.
echo off

ir arriba

%Ejemplo 13: Propagación del Error


clear
echo on
%Este archivo ilustra cómo se propaga el error a través de un cálculo cuando hay un
%error en cada una de las variables.
%Supongamos que tenemos dos variables "x" e "y" que son independientes y que están normalmente
%distribuidas.
%Establezcamos que "x" tiene una media de 2 e "y" una media de 3, ambas con desvío estándar igual a
1.
n=1000;
x=randn(n,1)+2;
y=randn(n,1)+3;
pause
%Podemos graficar la distribución acumulada de estas dos variables:
cumprob=[1:n]/n;
plot(sort(x),cumprob)
hold on
plot(sort(y),cumprob,'gr')
hold off
pause
%Observe que las pendientes de las probabilidades acumuladas son las mismas, lo cual indica
%que cada una de las variables tiene el mismo desvío estándar.
%Definamos una nueva variable "z" tal que "z" = "x" + "y". ¿Cuál es su probabilidad acumulada?
z=x+y;
plot((sort(z)-5),cumprob,'gr')
hold on
plot((sort(x)-2),cumprob,'y')
pause
%Hemos sustraido la media de "x" y de "z" de manera de poder comparar más fácilmente sus
pendientes.
%Observe que la pendiente de la probabilidad acumulada de "z" es menor que la de "x", lo cual indica
%un mayor desvío estándar.
pause
%Veamos ahora la distribución de "z" y calculemos la media y el desvío estándar directamente:
mean=sum(z)/n
%y la varianza:
stdev = (sum((z-mean).^2)/(n-1))^.5
%Observe que este desvío estándar está muy próximo al valor esperado de sqrt(2).
%La sustracción debería dar exactamente el mismo desvío estándar!
pause
%Podemos comparar la distribución de probabilidad verdadera con una distribución normal de igual
%media y varianza:
plot(sort(z-5),(0.5 + erf((sort(z)-mean)/stdev/sqrt(2))/2),'b')

17 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

hold off
%que ajusta los datos bastante bien.
pause
%¿Que sucede con la multiplicación?. Esto es un poco diferente.
%Define "z" = "x" * "y" y grafiquemos su probabilidad acumulada:
z = x .* y;
plot((sort(z)-6),cumprob,'gr')
hold on
plot((sort(x)-2),cumprob,'y')
%donde nuevamente hemos sustraido los valores medios de "z" y "x" .
pause
%La primer cosa que Ud. debería notar es que "z" no está normalmente distribuida!
%Esto se debe a que una variable está normalmente distribuida sólo si
%el error fraccional es pequeño, esto es, sigma(x)/x <<1, y lo mismo debería ocurir para "y".
%En este caso estas condiciones no se cumplen y distorsionan la distribución de "z".
%Podemos calcular la media y el desvío estándar de "z":
mean=sum(z)/n
%y la varianza:
stdev = (sum((z-mean).^2)/(n-1))^.5
pause
%Podemos comparar la distribución de "z" con una distribución normal:
plot(sort(z-6),(0.5 + erf((sort(z)-mean)/stdev/sqrt(2))/2),'b')
hold off
%Observe que esta vez la distribución normal no es un buen ajuste.
%Esto se debe a que hemos violado la restricción que el error en "x" e "y" sea relativamente pequeño
%con respecto a las magnitudes de "x" e "y".
pause
%Supongamos ahora que "x" e "y" estuviesen centrados alrededor de 20 y 30 respectivamente,
%y con desvío estándar de alrededor de la unidad. Ahora obtenemos:
x=x+18;
y=y+27;
z=x .* y;
plot((sort(x)-20),cumprob,'y')
hold on
plot((sort(z)-600),cumprob,'gr')
pause
%Ahora "z" es una variable normalmente distribuida. Podemos calcular la media:
mean=sum(z)/n
%y la varianza:
stdev = (sum((z-mean).^2)/(n-1))^.5
pause
%Podemos comparar gráficamente esto con la distribución de probabilidad observada:
plot(sort(z-600),(0.5 + erf((sort(z)-mean)/stdev/sqrt(2))/2),'b')
hold off
pause
%Este desvío estándar podría haber sido calculado a partir de la fórmula:
sigmax=1;
sigmay=1;
stdev = ((sigmax/20)^2+(sigmay/30)^2)^.5*600
%que suministra aproximadamente el mismo valor.
echo off

ir arriba

18 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Ejemplo 14: Propagación del Error en la Regresión Lineal


clear
echo on
%En este ejemplo efectuaremos un análisis estadístico del consumo de energía en Los Esatados
Unidos,
%discriminando según las fuentes de energía.
%Analizaremos los datos de 1993 obtenidos del Department of Commerce's Economic Bulletin Board.
%Los datos se presentan a continuación:
pause
%Consumo mensual de 1993 (10^15 BTU)
% Carbón Gas Natural Petróleo Nuclear
% Enero...... 1.660 2.357 2.697 .631
% Febrero.... 1.540 2.235 2.611 .548
% Marzo...... 1.609 2.205 2.931 .498
% Abril...... 1.442 1.731 2.708 .461
% Mayo....... 1.448 1.338 2.753 .538
% Junio...... 1.618 1.328 2.759 .562
% Julio...... 1.840 1.388 2.894 .603
% Agosto..... 1.823 1.405 2.890 .600
% Septiembre. 1.580 1.315 2.848 .534
% Octubre.... 1.566 1.533 2.889 .474
% Noviembre.. 1.584 1.819 2.869 .500
% Diciembre.. 1.720 2.192 2.994 .567
pause
%
% hídrica geotérmica otras
% Enero...... .278 .014 .006
% Febrero.... .229 .013 .001
% Marzo...... .267 .014 .005
% Abril...... .278 .014 .004
% Mayo....... .315 .012 .004
% Junio...... .287 .012 .004
% Julio...... .275 .013 .001
% Agosto..... .245 .014 .004
% Septiembre. .212 .013 .001
% Octubre.... .208 .013 .003
% Noviembre.. .213 .013 .002
% Diciembre.. .248 .013 .004
pause
%Antes que nada, debemos poner estos datos en un formato que pueda ser leído por el MATLAB.
%Los datos se salvan bajo el nombre energy.dat como un arreglo 12x7. Luego, cargamos los datos,
%leemos y graficamos:
pause
load energy.dat
month = [1:12];
plot(month,energy)
xlabel('mes')
ylabel('energia consumida, 10^15 BTU')
pause
%A partir del gráfico podemos ver que el consumo de petróleo es prácticamnete plano,
%el consumo de gas natural presenta picos durante el invierno, el de carbón presenta picos
%durante el verano, y el consumo de energía nuclear picos durante el verano y el invierno.
%Por otra parte, el consumo de energía hidroeléctrica presenta picos a fines de la primavera
%- esto corresponde a la nieve de primavera que se funde en las montañas.

19 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Las otras fuentes son insignificantes.


pause
%Queremos calcular el consumo promedio de combustible por mes para todas las fuentes,
%así como la covariancia. Hagamos esto:
echo off
[n m]=size(energy);
mean=sum(energy)/n
for i=1:m
for j=1:m
var(i,j)=(energy(:,i)'*energy(:,j)-mean(i)*mean(j)*n)/(n-1);
end
end
pause
echo on
%Se genera la matriz de covarianza:
var
pause
%La matriz tiene más sentido si normalizamos sus elementos con los valores del desvío estándar
%de la i-ésima y j-ésima variables. Los elementos diagonales se vuelven unitarios y los elementos
%fuera de la diagonal comparan la magnitud de la covarianza con la variabilidad de cada variable:
std=diag(var).^.5;
relvar=var./(std*std')
pause
%Al observar esta matriz concluimos que las correlaciones positivas más fuertes se presentan
%entre el carbón y la energía nuclear (la primera y cuarta columna). ESto tiene sentido debido
%a que ambas se utilizan en la producción de electricidad.
%El examen de la matriz de covarianza muestra que la variabilidad más grande en el consumo de
%energía corresponde al gas natural debido a que es fuertemente estacional.
pause
%Ahora podemos calcular algo. En primer lugar observemos la relación del consumo promedio
%mensual de potencia hidroeléctrica y el consumo de combustibles fósiles.
%Esto corresponde a la relación entre la quinta columna y la suma de las primeras tres.
%Si todo lo que guardamos era la matriz de covarianza y las medias, podríamos calcular esto:
ratio=mean(5)/(sum(mean(1:3)))
%que no es muy grande!
pause
%Para calcular la varianza de la relación necesitamos las derivadas de la relación con respecto
%a las variables. Hagamos esto numéricamente:
echo off
eps = 1e-8;
for i=1:m
tmean=mean;
tmean(i)=mean(i)+eps;
tratio=tmean(5)/(sum(tmean(1:3)));
deriv(i)=(tratio-ratio)/eps;
end
echo on
pause
%Esto genera la derivada de la relación:
deriv
%Podemos utilizar esto para calcular la varianza:
ratiovar=deriv*var*deriv'

20 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%y el desvío estandar relativo:


relstd=ratiovar^.5/ratio
%que es muy pequeño.
pause
%Dado que los datos mismos están en la computadora, podemos calcular esto más exactamente:
ratiovec=energy(:,5)./sum(energy(:,1:3)')';
%donde se ha utilizado el comando traspuesta "'" y la definición de 'sum' para comprimir un
%poco el código.
%Luego, obtenemos el valor promedio:
exactratio=sum(ratiovec)/n
%la varianza:
exactvar=(ratiovec'*ratiovec-exactratio^2*n)/(n-1)
%y el desvío estándar:
exactrelstd=exactvar^.5/exactratio
%que es próximo al calculado con la fórmula de arriba.
pause
%Las desviaciones son:
ratio/exactratio-1
relstd/exactrelstd-1
%que difieren sólo en un pequeño porcentaje. La discrepancia surge debido a la variabilidad en cada
%variable que alimenta la relación no es suficientemente pequeña con respecto a cada media.
pause
echo off

Para bajar el archivo comolementario energy hacer clik aquí


ir arriba

%Ejemplo 15: Análisis y Error de Regresión


clear
echo on
%
%Este programa ilustra el cálculo del error en la regresión lineal.
%Se ha desarrollado un proceso de separación en el que el transporte de moléculas de soluto
%es selectivamente mejorado por un fluido oscilante a través de un poro o una fibra en una
%membrana.
%Se han obtenido los siguientes datos para la mejora en el transporte del 1-butanol y el
%t-butanol, como función del desplazamiento tidal (la amplitud de oscilación):
%
pause
%
tidal=[.0544;.102;.131;.276;.132;.131;.161;.163;.182;.181];
enhancetbut=[.287;1.15;1.45;8.17;1.44;1.58;2.29;2.19;2.88;2.04]*10^4;
enhance1but=[.407;1.72;2.18;10.06;1.93;2.18;3.17;3.08;4.04;2.66]*10^4;
%
pause
%
%Mostremos esto en forma matricial:
format short e
[tidal,enhance1but,enhancetbut]
format short
%
pause
%
%Grafiquemos esto:

21 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

loglog(tidal,[enhance1but,enhancetbut],'o')
xlabel( 'desplazamiento tidal')
ylabel('mejora en el transporte')
%
%Como puede verse a partir de este gráfico, se tiene una dependencia tipo "ley de potencia"
%con el deplazamiento tidal.
%Además, la mejora para el 1-butanol es mayor que para el t-butanol, formando la base para
%la separación.
%
pause
%
%A partir de la teoría, esperamos que la mejora dependa del cuadrado del desplazamiento tidal.
%Se desea determinar si esta dependencia es satisfecha por los datos dentro de un determinado
%error, para evaluar la relación o razón de las mejoras, con sus correspondientes límites de
%error.
%Hagamos esto utilizando regresión lineal.
%
pause
%
%Esperamos una dependencia tipo "ley de potencia" con el deplazamiento tidal, por consiguiente,
%debemos en primer lugar convertir el modelo no lineal a una forma lineal:
%
% enhancement = c1 * tidal ^ c2
%
%Se transforma en:
%
% log(enhancement) = log(c1) + c2 * log(tidal)
%
%Por lo tanto, los parámetros del modelo son el logaritmo de la amplitud y el exponente.
%
pause
%
%Podemos utilizar esta forma lineal para establecer la matriz A (es la misma para el 1 y el
%t-butanol):
n=length(tidal);
a=[ones(n,1),log(tidal)]
%
pause
%
%y los dos lados derechos:
b1=log(enhance1but);
bt=log(enhancetbut);
%
%Podemos poner a éstos (los lados derechos) juntos:
bcomb=[b1,bt]
%
pause
%
%Para un mejor ajuste de los parámetros, resolvemos utilizando las ecuaciones normales.
%Podemos resolver el problema a través de la relación x = inv(A'*A)*A' * b como se hizo en clase.
%Por consiguiente:
k=inv(a'*a)*a';
%Visualizamos la transpuesta de esta matriz:
k'
%
pause
%
%Podemos resolver simultáneamente para los dos vectores:

22 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

x=k*bcomb;
x1=x(:,1)
xt=x(:,2)
%
pause
%
%Como puede verse, el exponente para ambos conjuntos de datos es similar y próximo al
%valor esperado 2.0.
%Comparemos esto con los datos:
%
hold on
plot(tidal,exp(a*x))
hold off
%
%que ajusta los datos bastante bien.
%
pause
%
%Ahora podemos calcular el error en las mediciones y el error en la pendiente.
%Primero obtenemos el error en las mediciones. Éste es exactamente el cuadrado de la norma-2
%del residuo dividido por n-2 debido a que tenemos dos parámetros de ajuste:
r=a*x-bcomb
%
pause
%
%Observe que éste suministra el residuo para ambos conjuntos de datos al mismo tiempo!.
%La varianza es:
var=sum(r.*r)/(n-2);
std1=var(1)^.5
stdt=var(2)^.5
%
%Por consiguiente, el error en las mediciones en el 1 y el t-butanol son muy similares.
%Observe que el error dado aquí en realidad es el error en el logaritmo de la mejora,
%dado que es lo que estamos ajustando del modelo.
%
pause
%
%Veamos ahora el error que esto causa en el exponente calculado.
%Obtenemos el exponente utilizando la segunda fila de la matriz k (o segunda columna de k'),
%por consiguiente:
varexp=k(2,:)*k(2,:)'*var;
stdexp1=varexp(1)^.5
stdexpt=varexp(2)^.5
%
%Por lo tanto, ambos caen dentro de un desvío estándar del valor esperado 2.0.
%
pause
%
%Finalmente, queremos ver la relación o razón de las velocidades de transporte dado que ésta es
%la que determina la selectividad. Debido a que los exponentes son ligeramente diferentes para
%las dos mejoras, es razonable comparar las mejoras en la mitad del rango sobre el que se
%efectuaron las mediciones. Por consiguiente, comparamos la mejora para un desplazamiento
%tidal de 0.15.
%Calculamos ahora la mejora y el error en la mejora para cada una de las especies investigadas
%correspondientes a ese desplazamiento tidal. Luego,
%
%pause
%

23 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

enhance=exp([1,log(.15)]*x);
enhance1=enhance(1)
enhancet=enhance(2)
ratio=enhance1/enhancet
%
%por lo tanto, existe algo de selectividad suministrada por el esquema de oscilación.
%
pause
%
%Ahora para el error en cada una de las mejoras correspondientes a un desplazamiento tidal de
%0.15.
%Podemos obtenerlo utilizando la fórmula vectorial descripta en clase:
avec=[1;log(0.15)];
prod=(k'*avec)'*(k'*avec);
predvar=prod*var
%
pause
%
%Esta es la varianza en los valores pronosticados - el logaritmo de las mejoras pronosticadas
%para el 1-butanol y el t-butanol. Si queremos el error en la mejora verdadera, tenemos que
%usar la fórmula para el error de propagación para una función de variable aleatoria.
%En este caso la mejora es exactamente la exponencial del punto pronosticado por la curva de
%ajuste, de manera que el cálculo del error es extremadamente simple.
%El error en el logaritmo de una variable aleatoria es aproximadamente igual (para pequeñas
%variaciones) al error relativo de la variable misma! Por consiguiente:
%
pause
%
relpredstd1=predvar(1)^.5
relpredstdt=predvar(2)^.5
%
%donde estas cantidades representan el desvío estándar fraccional en la mejora
%(el desvío estándar por la mejora).
%La desviación en cada una de las mejoras pronosticadas es más que pequeña, sólo un poco más del
5%
%de la mejora pronosticada.
%
%pause
%
%Si queremos averiguar el error en la relación o razón, podríamos utilizar la fórmula estándar
%para el error en una relación suponiendo que la variabilidad en las dos mejoras es independiente.
%Esto daría para el error:
%
pause
%
ratio
relratiostd=sum(predvar)^.5
%que es bastante grande considerando que el desvío con respecto a la unidad de la razón o
%relación en la mejora (la cual suministra la selectividad del proceso) es sólo de 0.38.
%Sin embargo, este error, es incorrecto!
%Esto se debe a que existe un considerable grado de covarianza en la dispersión de las mejoras
%observadas para el 1 y el t-butanol.
%Podemos ver esto en la gráfica original de los datos, observando que, mientras que la mejora
%en torno de cada una de las líneas ajustadas presenta bastante dispersión, la separación entre
%los datos del 1 y el t-butanol es notablemente consistente, lo cual indica una relación o razón
%constante.
%¿Cómo podemos manejarnos con esta covarianza?
%

24 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

pause
%
%La forma más simple de hacer esto es volver a los datos originales y ajustar la relación
%o razón directamente con una "ley de potencia", en lugar de hacerlo en forma individual con
%las mejoras. En ese caso, el exponente esperado de la "ley de potencia" debería ser cero
%(la dependencia con el desplazamiento tidal se cancela) y la función de modelización, evaluada
%para un desplazamiento tidal de 0.15 debería suministrar el valor y el error correctos.
%Hagamos esto:
%
pause
%
%En primer lugar, determinemos un nuevo lado derecho para el problema de regresión:
bratio=b1-bt
%Observe que la diferencia de logaritmos es equivalente a la división en la mejora original.
%
%pause
%
%La matriz de regresión permanece inalterada, de manera que la solución al problema de
%regresión es precisamente:
xratio=k*bratio
%
%pause
%
%Let's plot this up:
loglog(tidal,exp(bratio),'o')
xlabel('desplazamiento')
ylabel('selectividad')
hold on
loglog(tidal,exp(a*xratio))
%
hold off
%
%Por lo tanto, vemos a partir de la gráfica que la selectividad es una función ligeramente
%decreciente del desplazamiento tidal, lo cual está en discrepancia con la teoría.
%Veamos si esta discrepancia es estadísticamente significativa.
%
pause
%
%Para hacer esto calculemos la variabilidad en la razón o relación (en realidad, el logaritmo
%de la relación):
ratiovar=(bratio-a*xratio)'*(bratio-a*xratio)/(n-2);
%Obtenemos por consiguiente el error en los dos coeficientes:
xratiovar=sum(k'.^2)'*ratiovar;
xratio(2)
expstd=xratiovar(2)^.5
%
pause
%
%Por consiguiente, el decrecimiento en la selectividad con el desplazamiento tidal es
%significativo con un nivel de confianza del 97.5%. Esto se debe a que la probabilidad que
%el exponente verdadero se encuentre más allá de dos desvíos estándar -por encima- del valor
%observado es de alrededor del 2.5%. Observe que también hay una probabilidad del 2.5%
%que el exponente se encuentre 2 sigma por debajo del valor medio, de manera que el intervalo
%de confianza 2 sigma es del 95%.
%
pause
%
%Obtengamos ahora la selectividad para un valor intermedio del desplazamiento tidal:

25 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

exactratio=exp(avec'*xratio)
prod=(k'*avec)'*(k'*avec);
exactvar=prod*ratiovar;
exactratiorelstd=exactvar^.5
%Por consiguiente, el error verdadero en la selectividad es cinco (5) veces más pequeño que el
%que obtuvimos ignorando la covarianza!!
%
pause
%
%La conclusión de todo esto es que debemos ser muy cuidadosos al analizar nuestros datos.
%Si hubiésemos analizado las pendientes originales en las gráficas de la mejora versus el
%desplazamiento tidal, con el error asociado, habríamos concluido que ambas mejoras se
%encontraban dentro de la incerteza estadística de la pendiente de valor 2.0 estimada
%teóricamente. Esta última parte debería conducirnos a la conclusión que la selectividad no está
%afectada por el desplazamiento tidal.
%Un análisis estadístico más preciso muestra exactamente lo opuesto, esto es, existe un pequeño
%pero significativo decrecimiento en la selectividad!
%
pause
%
%En conclusión, la estadística es un tema más que resbaladizo, por lo tanto debemos entender
%-exactamente- que es lo que estamos tratando de calcular para hacerlo bien. En particular,
%debemos entender todo acerca de las variables calculadas con respecto a las otras y si existe
%alguna covarianza.
%Finalmente, recordemos que todo esto trata con errores aleatorios - si el número de datos es
%muy grande, el error total en el experimento estará dominado por los errores sistemáticos
%acerca de los cuales estos estudios estadísticos no pueden suministrar información.
pause
echo off

ir arriba

%Ejemplo 16: Métodos de Newton y de la Secante


clear
echo on
%Este ejemplo ilustra tres técnicas para la determinación de las raíces de una ecuación,
%en este caso, algebraica:
%a) El método de bisección.
%b) El método de Newton.
%C) El método de la secante.
%En los tres casos trataremos de encontrar las raíces del polinomio f(x)=x^3-2.
%Para el método de bisección todo lo que tenemos que saber es que las raíces yacen entre
%1 y 2. Todos los otros métodos requieren que definamos la función f(x), suministrada a través
%del correspondiente archivo de funciones de MATLAB. También requerimos (para el método de
%Newton) la derivada fprime(x).
%Definimos el intervalo:
a=1;
b=2;
pause
%En primer lugar, grafiquemos la función:
y=[a:(b-a)/50:b];
plot(y,f(y));
pause
hold on
%Observemos que para nuestra función f(a)*f(b)<0.

26 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Denominamos alpha el extremo inferior del intervalo corriente, beta el extremo superior
%y mid(i) al punto medio de ese intervalo. Sabemos que la respuesta es exactamente 2^(1/3),
%por lo tanto podemos determinar el error en cada etapa de cálculo. Comencemos:
if f(a)*f(b)>0,
disp('La raíz no está en el intervalo!')
else
alpha(1)=a;
beta(1)=b;
mid(1)=(a+b)/2;
plot(mid(1),f(mid(1)),'o')
for i=1:24,
if f(alpha)*f(mid(i))<0,
beta=mid(i);
else,
alpha=mid(i);
end;
mid(i+1)=(alpha+beta)/2;
plot(mid(i),f(mid(i)),'o')
pause(1)
echo off
end
end
hold off
echo on
pause
%Ahora veamos como es el error en función de número de iteraciones:
answer=2^(1/3);
plot(abs(mid-answer))
ylabel('Error absoluto')
xlabel('Número de iteraciones')
hold off
pause
%Si utilizamos un gráfico semilogarítmico, obtenemos:
plot(log10(abs(mid-answer)))
ylabel('Logaritmo del error absoluto')
xlabel('Número de iteraciones')
hold off
%Obsérvese que la progresión al mínimo no es estacionaria, pero el comportamiento en este
%gráfico semilogarítmico es aproximadamente lineal.
%La pendiente de la recta promedio es log10(C), aproximadamente igual a -0.301 correspondiente
%a C=1/2.
pause
%Podemos estimar la velocidad de convergencia r a partir de la gráfica log-log
%del error(i+1) vs error(i).
%La velocidad de convergencia r es la pendiente de la recta promedio de esta gráfica.
[m,nbisection]=size(mid)
plot(log(abs(mid(1:nbisection-1)-answer)),log(abs(mid(2:nbisection)-answer)))
ylabel('log e(i+1)')
xlabel('log e(i)')
hold off
%La pendiente de la recta promedio es aproximadamente 1, lo cual nos indica que el método
%de bisección converge linealmente.
pause
%Veamos ahora el método de Newton. Aquí necesitamos f(x) y fprime(x). Comencemos el proceso de
%integración en x(1)=1. Además estableceremos una tolerancia para determinar cuando hemos
%alcanzado una solución. Por lo tanto:

27 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

tol=1e-7;
xlast=a;
%Este criterio sólo se utiliza para finalizar las iteraciones si la distancia entre
%puntos sucesivos se hace demasiado pequeña. En el arranque la fijamos más grande
%que la tolerancia para cualquier valor diferente de x(1).
x(1)=(b+a)/2;
i=1;
plot(y,f(y))
hold on
plot(x(i),f(x(i)),'o')
pause(1)
while min(abs(f(x(i))),abs(x(i)-xlast))>tol,
x(i+1)=x(i)-f(x(i))/fprime(x(i));
xlast=x(i);
i=i+1;
plot(x(i),f(x(i)),'o')
pause(1)
echo off
end
echo on
hold off
pause
%Observe que prácticamente no tomó muchas iteraciones alcanzar la tolerancia establecida!
%El número total de iteraciones fue:
i
%que es muy inferior al método de bisección.
pause
%Analicemos el error como función del número de iteraciones.
echo off
[m,nnewton]=size(x);
plot([1:nbisection],log10(abs(mid-answer)),...
[1:nnewton],log10(abs(x-answer)))
ylabel('Logaritmo del error absoluto')
xlabel('Número de iteraciones')
echo on
%Obsérvese que el error en el método de Newton disminuye mucho más rápido!
%Esto es consecuencia de la convergencia cuadrática del método.
pause
%Podemos estimar la velocidad de convergencia r a partir de la gráfica log-log
%del error(i+1) vs error(i).
%La velocidad r es justamente la pendiente de esta curva. Por consiguiente:
echo off
plot(log(abs(x(1:nnewton-1)-answer)),log(abs(x(2:nnewton)-answer)),...
log(abs(mid(1:nbisection-1)-answer)),log(abs(mid(2:nbisection)-answer)))
ylabel('log e(i+1)')
xlabel('log e(i)')
echo on
%La pendiente del error en el método de bisección es aproximadamente la mitad de la
%pendiente del error en el método de Newton y además es mucho más ruidoso!
pause
%Por último veamos el método de la secante.
%En esta técnica necesitamos dos puntos de arranque diferentes.
%Estos puntos se utilizan para estimar (a través de una aproximación en diferencias finitas)
%la derivada local. Ésta a su vez, se utiliza en un algoritmo tipo Newton para estimar un nuevo
%punto en la iteración.
%Sólo conservamos los dos últimos puntos. Por lo tanto:

28 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

tol=1e-7;
xs(1)=(b+a)/2;
xs(2)=a+(b-a)/4;
i=2;
plot(y,f(y))
hold on
plot(xs(1:2),f(xs(1:2)),'o')
pause(1)
while min(abs(f(xs(i))),abs(xs(i)-xs(i-1)))>tol,
xs(i+1)=xs(i)-f(xs(i))*...
(xs(i)-xs(i-1))/(f(xs(i))-f(xs(i-1)));
i=i+1;
plot(xs(i),f(xs(i)),'o')
pause(1)
echo off
end
echo on
hold off
pause
%Este método demanda un poco más de iteraciones que el método de Newton,
i
%pero aún conserva una velocidad de convergencia superlineal.
pause
%Veamos el error:
echo off
[m,nsec]=size(xs);
plot([1:nbisection],log10(abs(mid-answer)),...
[1:nnewton],log10(abs(x-answer)),...
[2:nsec],log10(abs(xs(2:nsec)-answer)))
ylabel('Logaritmo del error absoluto')
xlabel('Número de iteraciones')
echo on
%donde la convergencia del método de la secante yace entre los dos métodos anteriores.
pause
%Para concluir, examinemos la velocidad de convergencia del método de la secante graficando el
%log(error(i+1)) vs. log(error(i)):
echo off
plot(log(abs(x(1:nnewton-1)-answer)),...
log(abs(x(2:nnewton)-answer)),...
log(abs(mid(1:nbisection-1)-answer)),...
log(abs(mid(2:nbisection)-answer)),...
log(abs(xs(2:nsec-1)-answer)),...
log(abs(xs(3:nsec)-answer)))
ylabel('log e(i+1)')
xlabel('log e(i)')
echo on
%donde la pendiente del método de la secante yace entre la de las otras dos.
%Esta pendiente viene dada por r = 0.5*(1+5^.5) = 1.618. La inversa de r se conoce como la
%razón o relación dorada dado que satisface la condición 1/r = 1-(1/r)^2. Este número se
%utiliza en la técnica de la búsqueda dorada para hallar el mínimo de funciones unimodales.
%Haremos esto más adelante.
echo off

Funciones del Ejemplo:


function y= f(x)
%Esta es un función no lineal con una raíz en x = 2^(1/3) = 1.26.

29 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

y=x.^3-2.;
function y= fprime(x)
%This is the derivative of the function
%f(x) defined in another routine. It is
%required to perform Newton's method.
y=3*x.^2;
ir arriba

%Ejemplo 17: Sistemas de Ecuaciones No Lineales


clear
echo on
%Este ejemplo muestra el uso del método de Newton para resolver sistemas de ecuaciones
%no lineales.
%Para este propósito consideraremos una red simple de tuberías. Una red de tuberías
%es muy similar a una red de resitencias eléctricas, con la caída de presión entre
%los empalmes equivalente a la caída de tensión o voltaje entre nodos, y la resistencia
%al flujo de agua equivalente a la resistencia eléctrica de los cables de conexión.
%La diferencia principal es que la red eléctrica es lineal y la caída de tensión
%proporcional a la corriente eléctrica, mientras que la red de tuberías es no lineal.
%A elevados números de Reynolds, la caída de presión en una tubería es proporcional al cuadrado
%del caudal volumétrico.
pause
%Examinaremos que sucede al caudal de mi ducha cuando mi hijo abre la canilla del baño
%de la planta baja. La principal dificultad es que tenemos un par de filtros en la misma
%red que generan una tremenda resistencia al flujo de agua a través de nuestra casa.
%Estoy tratando de rediseñar el sistema de provisión de agua, pero hasta ahora sólo tengo un
%buen ejemplo de como no hay que diseñar una red de tuberías.
pause
%¿Cómo debe ser la red? Básicamente tenemos lo siguiente:
%
% ***(canilla del lavabo)**(3)
% *
%(1)***(filtros)***(2)*
% *
% ***(llave de la ducha)**(4)
%
%Los nodos en esta red de tubería son:
%1) La fuente (en este caso el tanque de provisión de agua).
%2) La te colocada después de los filtros.
%3) El lavabo de mi hijo.
%4) Mi ducha.
%Las resistencias son
%r12: Los filtros
%r23: La canilla del lavabo
%r24: La llave de la ducha
pause
%La pérdida total de carga a lo largo de cualquier trayectoria que conecta los mismos nodos en
%una tubería debe ser la misma. Esto significa que la pérdida de (1) a (3) y de (1) a (4) debe
%ser igual a la pérdida total generada por el sistema. Llamaremos a ésta ptot.
%Aceptando que la resistencia generada por cada una de las partes del sitema es proporcional
%al cuadrado del caudal volumétrico, obtenemos el siguiente par de ecuaciones:
%
%ptot-r12*(x(1)+x(2))^2-r23*x(1)^2=0
%and
%ptot-r12*(x(1)+x(2))^2-r24*x(2)^2-dh=0

30 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%
%donde x(1) es el caudal volumétrico en la canilla del lavabo y x(2) el caudal en la ducha.
%dh es el cambio es el cambio de presión del agua debido a que mi ducha está 15 pies por encima
%del lavabo de mi hijo.
%
pause
%
%Estamos en condiciones de resolver nuestro problema. En primer lugar, pongamos algunos números:
ptot=50; %psig
r12=20; %psig/(gal/min)^2
r23=5; %psig/(gal/min)^2
r24=20; %psig/(gal/min)^2
dh=8; %psig
%Necesitamos hacer ahora una estimación de los caudales x(1) y x(2). Sean entonces:
x(1)=1;
x(2)=1;
v=[0,2,0,2]
axis(v)
plot(x(1),x(2),'o')
hold on
pause
%
%Comenzamos el proceso iterativo:
f(1)=ptot-r12*(x(1)+x(2))^2-r23*x(1)^2;
f(2)=ptot-r12*(x(1)+x(2))^2-r24*x(2)^2-dh;
%Valores iniciales de la función f:
f
while sum(abs(f))>.0001,
%Definimos la matriz Jacobiana:
j(1,1)=-2*r12*(x(1)+x(2))-2*r23*x(1);
j(1,2)=-2*r12*(x(1)+x(2));
j(2,1)=-2*r12*(x(1)+x(2));
j(2,2)=-2*r12*(x(1)+x(2))-2*r24*x(2);
%Calculamos el cambio en nuestro vector de incógnitas x:
dx=j\f';
%Actualizamos x:
x=x-dx';
%Recalculamos f:
f(1)=ptot-r12*(x(1)+x(2))^2-r23*x(1)^2;
f(2)=ptot-r12*(x(1)+x(2))^2-r24*x(2)^2-dh;
plot(x(1),x(2),'o')
pause(1)
echo off
end
echo on
hold off
pause
%Los valores correctos de x son:
x
pause
%Comparemos estos valores con lo que sucede si mi hijo cierra la canilla del lavabo.
%Para simular esta condición establezcamos r23=1e7 (esta situación no está lejos de la realidad
%dado que la canilla del lavabo gotea un poco).
%Comencemos inicializando con los valores del problema anterior:
plot(x(1),x(2),'o')
pause
r23=1e7;
f(1)=ptot-r12*(x(1)+x(2))^2-r23*x(1)^2;

31 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

f(2)=ptot-r12*(x(1)+x(2))^2-r24*x(2)^2-dh;
axis(v)
plot(x(1),x(2),'o')
hold on
while sum(abs(f))>.0001,
%Definimos la matriz Jacobiana:
j(1,1)=-2*r12*(x(1)+x(2))-2*r23*x(1);
j(1,2)=-2*r12*(x(1)+x(2));
j(2,1)=-2*r12*(x(1)+x(2));
j(2,2)=-2*r12*(x(1)+x(2))-2*r24*x(2);
%Calculamos el cambio en el vector x:
dx=j\f';
%Actualizamos x
x=x-dx';
%Recalculamos f
f(1)=ptot-r12*(x(1)+x(2))^2-r23*x(1)^2;
f(2)=ptot-r12*(x(1)+x(2))^2-r24*x(2)^2-dh;
echo off
plot(x(1),x(2),'o')
pause(1)
end
echo on
hold off
pause
%Ahora los caudales son:
x
%Como puede verse, la canilla del lavabo de mi hijo realmente afecta al caudal de mi ducha!
ir arriba

%Ejemplo 18: Optimización Unidimensional


clear
echo on
%En este ejemplo demostraremos la optimización de una función utilizando los métodos de Newton,
%de interpolación parabólica sucesiva y de búsqueda dorada (Fibonacci modificado).
%El problema de optimización implica la búsqueda de un máximo o de un mínimo.
%En este ejemplo lo que buscamos es un máximo.
%
pause
%
%Supongamos que tenemos la siguiente reacción batch secuencial:
%
% A --> B --> C
%
%En este problema B es el producto deseado y C es un subproducto indeseado. Queremos
%maximizar el producto B. Las dos reacciones se suponen de primer orden:
%
pause
%
% Ra = -k1 * Ca
%
% Rb = k1 * Ca - k2 * Cb
%
%donde k1 y k2 son constantes de reacción. Si la concentración inicial de B es cero
%y la concentración inicial de A es Ca0 tenemos la solución:
%
% Cb = Ca0*k1/(k2-k1)*(exp(-k1*t)-exp(-k2*t))
%

32 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%que inicialmente aumenta y disminuye con el tiempo.


%Tenemos que definir esta función en un archivo de funciones de MATLAB, cb.m.
%
pause
%
%Grafiquemos esta función:
%Elijamos valores de Ca0, k1 y k2 y hagámosle saber a la función Cb los valores que toman
%estos parámetros:
global ca0 k1 k2
ca0=1;
k1=2;
k2=1;
tt=[0:.1:2];
plot(tt,cb(tt))
xlabel('Tiempo')
ylabel('Concentración de B')
hold on
pause
%Como puede verse, existe un máximo alrededor de t = 0.7.
%Utilicemos las tres subrutinas de optimización discutidas en clase para determinar este valor
%con más exactitud.
%
pause
%
%En primer lugar, utilizamos el métodod de Newton arrancado de t=1.
%Tenemos la fórmula:
%
% x(k+1) = x(k) - f'(x(k))/f''(x(k))
%
%Por simplicidad, calcularemos las derivadas numéricamente, utilizando algoritmos en
%diferencias finitas de segundo orden:
%
pause
%
echo off
eps=1e-5;
clear t
t(1)=1;
i=1;
cbc=cb(t(i));
plot(t(i),cbc,'o')
fp=1;
dt=1;
while abs(dt)>1e-4
cbp=cb(t(i)+eps);
cbm=cb(t(i)-eps);
fp=(cbp-cbm)/2/eps;
fpp=(cbp+cbm-2*cbc)/eps^2;
dt=-fp/fpp;
t(i+1)=t(i)+dt;
i=i+1;
cbc=cb(t(i));
plot(t(i),cbc,'o')
pause(1)
end
hold off
echo on
%

33 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

pause
%La solución exacta para el máximo es:
%
texact=log(k2/k1)/(k2-k1)
%
%Por lo tanto podemos calcular la velocidad de progresión a la solución correcta:
ernm=abs(t-texact);
nnm=length(ernm);
loglog(ernm(1:nnm-1),ernm(2:nnm))
xlabel('e(i)')
ylabel('e(i+1)')
pause
%Consecuentemente podemos ver que para esta función el método de Newton converge
%cuadráticamente. Obsérvese que esto funciona mientras podamos determinar la primera y segunda
%derivada con suficiente seguridad.
%También se requiere comenzar donde la segunda derivada es del signo apropiado, en este caso
%negativo. Si hubiésemos comenzado en t=2 habríamos capturado el mínimo para
%t --> infinito.
%
pause
%
%Veamos ahora el método de interpolación parabólica sucesiva. En cada etapa ajustamos una
%parábola a tres puntos y la utilizamos para estimar donde está el máximo o el mínimo.
%Comenzamos:
echo off
clear t
t(1)=1;
t(2)=0;
t(3)=.5;
f=cb(t);
i=3;
plot(tt,cb(tt))
xlabel('Tiempo')
ylabel('Concentración de B')
hold on
plot(t,f,'o')
pause
while abs(t(i)-t(i-1))>1e-7,
tm=t(i-2:i)';
fm=f(i-2:i)';
a=[ones(3,1),tm,tm.^2];
x=a\fm;
i=i+1;
t(i)=-x(2)/2/x(3);
f(i)=cb(t(i));
plot(t(i),f(i),'o')
pause(1)
end
hold off
echo on
%
pause
%
%Podemos calcular la velocidad de progresión a la solución exacta:
echo off
erspi=abs(t-texact);
nspi=length(erspi);
loglog(ernm(1:nnm-1),ernm(2:nnm),'b')

34 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

hold on
loglog(erspi(1:nspi-1),erspi(2:nspi),'r')
xlabel('e(i)')
ylabel('e(i+1)')
hold off
echo on
%
pause
%
%En este caso la velocidad de progresión es ligeramente super lineal, con una pendiente
%de 1.324. Esta progresión también es un poco más aleatoria.
%
pause
%
%Finalizamos con el método de Fibonacci o de la búsqueda dorada. Este método utiliza la
%relación o razón dorada que es solución de:
%
% r^2 = 1 - r
%
%o r = 0.6180. Esta búsqueda sólo funciona sobre funciones unimodales, esto es, aquellas
%funciones para las cuales la primera derivada es estrictamente positiva para t < t* y negativa
%para t > t*, o la inversa si estamos buscando un mínimo. Obsérvese que la segunda derivada
%puede cambiar de signo localmente y el método ser aún válido.
%El método de Newton debería fallar en esta circunstancia.
%
pause
%
%Trabajemos este método. Comenzamos con algún intervalo conocido sobre el cual la función
%es unimodal, digamos [0,1]. Evaluamos la función en el interior en dos puntos adicionales
%localizados en r y 1-r a partir de los bordes.
%Conservamos el nuevo intervalo [0,r] o [1-r,1] dependiendo cual contiene el máximo (o el
%mínimo). Entonces procedemos a la próxima etapa. La clave es que el método sólo requiere una
%nueva evaluación de la función en cada etapa.
%
pause
%
%Hagamos esto:
echo off
r=(sqrt(5)-1)/2;
clear t
plot(tt,cb(tt))
xlabel('Tiempo')
ylabel('Concentración de B')
hold on
a=0;
b=1;
t(1)=a+(b-a)*(1-r);
tl=t(1);
t(2)=a+(b-a)*r;
tr=t(2);
f=cb(t);
plot(t,f,'o')
fl=f(1);
fr=f(2);
i=2;
pause
while abs(t(i)-t(i-1))>1e-5,
i=i+1;

35 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

if fr>fl,
a=tl;
tl=tr;
fl=fr;
t(i)=a+(b-a)*r;
tr=t(i);
fr=cb(tr);
plot(tr,fr,'o')
else,
b=tr;
tr=tl;
fr=fl;
t(i)=a+(b-a)*(1-r);
tl=t(i);
fl=cb(tl);
plot(tl,fl,'o')
end
pause(1)
end
hold off
echo on
%
pause
%
%Esta técnica converge aún más lentamente que el método de interpolación parabólica sucesiva.
%La velocidad de convergencia es lineal y el intervalo se reduce en un factor 0.618 en cada
%etapa. Podemos graficar esto:
%
pause
%
echo off
ergs=abs(t-texact);
ngs=length(ergs);
loglog(ernm(1:nnm-1),ernm(2:nnm),'b')
hold on
loglog(erspi(1:nspi-1),erspi(2:nspi),'r')
loglog(ergs(1:ngs-1),ergs(2:ngs),'g')
xlabel('e(i)')
ylabel('e(i+1)')
hold off
echo on
pause
%Si comparamos estas tres técnicas para esta función vemos que el método de Newton es el que
%converge más rápido pero sólo si arrancamos de un valor próximo al valor verdadero. El método
%de la búsqueda dorada es más lento pero más robusto -podríamos haber elegido cualquier
%intervalo conteniendo al máximo (mínimo) y eventualmente haber llegado al valor correcto-. No
%se puede decir lo mismo de las dos técnicas superlineales.
echo off

Funciones del Ejemplo:


function y= cb(t)
%This function takes it an array of times and returns
%the concentration of B. We need the reaction rates
%given by a global statement in the main script:
global ca0 k1 k2
y=ca0*k1/(k2-k1)*(exp(-k1*t)-exp(-k2*t));
ir arriba

36 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Ejemplo 19: Optimización Restringida


clear
echo on
%En este ejemplo mostraremos tres enfoques para la determinación del mínimo de una función de
%dos variables.
%Utilizaremos el método del gradiente (de la dirección descendente más pronunciada)
%y el método simplex tal como está implementado en la subrutina fmins de MATLAB.
%La función a minimizar es:
%
% f(x)=exp((x(1)-1)^2+(x(2)-1)^2/4)
%
%Las líneas de nivel de esta función son elipses centradas alrededor de (1,1).
%Debemos almacenar esta función bajo el nombre fex.m en el directorio apropiado.
%
pause
%
%Grafiquemos las líneas de nivel de esta función:
echo off
xx1=[.5:.1:1.5];
xx2=[0:.1:2];
for i=1:length(xx2)
for j=1:length(xx1)
z(i,j)=fex([xx1(j),xx2(i)]);
end
end
contour(xx1,xx2,z,10)
hold on
echo on
%
pause
%
%El primer método que utilizaremos es el del gradiente (de la dirección descendente más
%pronunciada)
%Elegimos la dirección descendente más pronunciada como menos el gradiente de la función.
%Luego, buscamos el mínimo en esta dirección utilizando algún algoritmo.
%En este caso usaremos interpolación parabólica sucesiva.
%Comenzamos nuestras iteraciones en el punto (0.5,0.5):
%
pause
%
echo off
x=[0.5,0.5];
plot(x(1),x(2),'o')
pause(1)
delta=1;
eps=1e-5;
n=length(x);
sdit=0;
while delta>1e-4,
%Evaluamos la dirección de búsqueda utilizando una fórmula en diferencias centrales:
for i=1:n
ep=zeros(size(x));
ep(i)=eps;
gradf(i)=(fex(x+ep)-fex(x-ep))/2/eps;
end
direc=-gradf/norm(gradf);

37 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Buscamos ahora la raíz en esa dirección:


clear alpha f
alpha(1)=0.1;
alpha(2)=0.2;
alpha(3)=0.3;
f(1)=fex(x+alpha(1)*direc);
f(2)=fex(x+alpha(2)*direc);
f(3)=fex(x+alpha(3)*direc);
i=3;
while abs(alpha(i)-alpha(i-1))>1e-6
ft=f(i-2:i)';
at=alpha(i-2:i)';
a=[ones(3,1),at,at.^2];
coeff=a\ft;
i=i+1;
alpha(i)=-coeff(2)/2/coeff(3);
f(i)=fex(x+alpha(i)*direc);
end
x=x+alpha(i)*direc;
plot(x(1),x(2),'o')
pause(1)
sdit=sdit+1;
delta=abs(alpha(i));
end
hold off
echo on
%
pause
%
%El mínimo es:
x
%determinado en el siguiente número de iteraciones:
sdit
%
pause
%
%Comparemos esto con el método simplex implementado en la subrutina de MATLAB fmins.
%Ésta es mucho más fácil de usar ya que MathWorks (la empresa que comercializa MATLAB)
%ha hecho el trabajo por Ud.
%También usaremos la función modificada fexp.m de manera que podamos graficar los pasos
%intermedios. Por consiguiente:
x=[0.5,0.5];
contour(xx1,xx2,z,10)
hold on
[x,options]=fmins('fexp',x);
x
echo off
func_evals=options(10)
echo on
%Se ha encontrado el mínimo, pero ha insumido casi 100 evaluaciones de la función.
hold off
echo off

Funciones del Ejemplo:


function y= fex(x)
y=exp((x(1)-1)^2+0.25*(x(2)-1)^2);
function y= fexp(x)
y=exp((x(1)-1)^2+0.25*(x(2)-1)^2);

38 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%This next bit graphs the intermediate steps


plot(x(1),x(2),'o')
drawnow
ir arriba

%Ejemplo 20: Cuadratura


clear
echo on
%En este ejemplo presentamos tres reglas diferentes de cuadratura.
%En primer lugar mostramos una regla de cuadratura donde f(x) únicamente se evalúa en el lado
%izquierdo de cada panel.
%Evaluaremos la integral para diferentes discretizaciones con el propósito de determinar el
%orden de la regla. Aplicaremos código a la función f(x)=exp(x).
%
pause
%
%Primero fijamos el intervalo:
a=1
b=3
%y el número de evaluaciones de la integral,
m=5
echo off
for i=1:m;
%Seguidamente establecemos el tamaño del panel:
n=2^(i-1);
dx=(b-a)/n;
x=[a:dx:b];
%ahora la función de ponderación
w=ones(1,n);
w(n+1)=0;
%y el resultado:
f=exp(x);
integral(i)=dx * w * f';
h(i)=dx;
end;
echo on
%Calculamos el error:
error=integral-(exp(b)-exp(a));
loglog(h,abs(error))
xlabel('h')
ylabel('Error absoluto')
%
pause
%
%Ahora hacemos lo mismo con la regla del trapezoide:
echo off
for i=1:m,
%Establecemos el tamaño del panel:
n=2^(i-1);
dx=(b-a)/n;
x=[a:dx:b];
%la función de ponderación o de peso:
w=ones(1,n);
w(n+1)=.5;
w(1)=.5;
%y el resultado:
f=exp(x);

39 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

integral(i)=dx * w * f';
trh(i)=dx;
end;
echo on
%Calculamos el error:
trerror=integral-(exp(b)-exp(a));
loglog(h,abs(error),trh,abs(trerror))
xlabel('h')
ylabel('Error absoluto')
%
pause
%
%Finalmente, para la regla de Simpson tenemos:
echo off
for i=1:m,
%Establecemos el tamaño del panel:
n=2^(i-1);
dx=(b-a)/n;
x=[a:dx:b];
%la función de peso:
w=2*ones(1,n)/3.;
w(2:2:n)=w(2:2:n)+2./3.;
w(n+1)=1/3.;
w(1)=1/3.;
%y el resultado:
f=exp(x);
integral(i)=dx * w * f';
sih(i)=dx;
end;
echo on
%Calculamos el error:
sierror=integral-(exp(b)-exp(a));
xlabel('h')
ylabel('Error absoluto')
%Finalmente comparamos los errores.
loglog(h,abs(error),trh,abs(trerror),sih,abs(sierror))
xlabel('h')
ylabel('Error absoluto')
%
pause
%
%Como puede verse, la pendiente del primer algoritmo es uno, suministrando un error
%de O(h), la pendiente de la regla del trapezoide es de O(h^2), y la pendiente de la regla de
%Simpson es de O(h^4).
echo off
ir arriba

%Ejemplo 21: Estimación del Error de Cuadratura


clear
echo on
%Este ejemplo ilustra la exactitud de las rutinas Gaussianas de cuadratura.
%Calcula la integral de exp(x) sobre el dominio [-1,1] utilizando reglas de cuadratura con
%n = 1 a 4.
%El error resultante se compara con reglas de cuadratura cuyos pesos se optimizan pero
%los nodos están igualmente espaciados (no optimizados).
%Para la cuadratura Gaussiana:
%Comenzamos con la regla del punto medio(n=1)

40 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

ngq(1)=1;
igq(1)=2*exp(0);
ergq(1)=igq(1)-(exp(1)-exp(-1))
%
pause
%
%Ahora para la regla de dos puntos:
ngq(2)=2;
igq(2)=exp(-1/3^.5)+exp(1/3^.5);
ergq(2)=igq(2)-(exp(1)-exp(-1))
%
pause
%
%Ahora para regla de tres puntos:
ngq(3)=3;
igq(3)=8/9.*exp(0)+5/9.*(exp(-0.6^.5)+exp(0.6^.5));
ergq(3)=igq(3)-(exp(1)-exp(-1))
%
pause
%
%Finalmente la regla de cuatro puntos:
ngq(4)=4;
igq(4)=0.3478548*(exp(-0.8611363)+exp(0.8611363))...
+0.6521452*(exp(-0.3399810)+exp(0.3399810));
ergq(4)=igq(4)-(exp(1)-exp(-1))
%
pause
%
semilogy(ngq,abs(ergq))
%
pause
%
%OK, ahora para puntos colocados de manera no óptima, esto es,
%los nodos están igualmente espaciados.
%En este caso comenzamos con n=2 puntos (la regla del trapezoide):
n(1)=2;
i(1)=exp(-1)+exp(1);
er(1)=i(1)-(exp(1)-exp(-1))
%
pause
%
%Ahora para n=3 (esta es la regla de Simpson)
n(2)=3;
i(2)=4/3*exp(0)+1/3*(exp(-1)+exp(1));
er(2)=i(2)-(exp(1)-exp(-1))
%
pause
%
%y para n=4:
n(3)=4;
i(3)=1/4*(exp(1)+exp(-1))+3/4*(exp(-1/3)+exp(1/3));
er(3)=i(3)-(exp(1)-exp(-1))
%
pause
%
%Finalmente, para n=5:
n(4)=5;
i(4)=7/45*(exp(-1)+exp(1))+32/45*(exp(-.5)+exp(.5))...

41 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

+12/45*exp(0);
er(4)=i(4)-(exp(1)-exp(-1))
%
pause
%
semilogy(ngq,abs(ergq),n,abs(er))
%Como podemos ver, los nodos óptimamente espaciados de la cuadratura Gaussiana permiten
%un cálculo de la integral mucho más exacto que aquel en el que los nodos no están
%óptimamente espaciados.
echo off
ir arriba

%Ejemplo 22: Cuadratura Adaptativa


clear
echo on
%Este es un ejemplo de extrapolación repetida de Richardson.
%El algoritmo se basa en la utilización de evaluaciones de una función para crear una regla de
%cuadratura utilizando un polinomio de grado superior.
%Por ejemplo, dado que conocemos que la regla del trapezoide es de O(h^2) en exactitud,
%podemos combinar una regla del trapezoide con una a dos veces la discretización
%para obtener una regla de Simpson.
%De la misma manera, podemos combinar dos reglas de Simpson par obtener una nueva regla con
%error de O(h^6), y así sucesivamente.
%
pause
%
%El algoritmo es como sigue:
%T1
%T2 S2
%T4 S4 P4
%T8 S8 P8 Q8
%T16 S16 P16 Q16 R16
%y así sucesivamente.
%La idea es que las reglas del trapezoide T1 y T2 de uno y dos paneles se combinen para formar
%la regla de Simpson de dos paneles, S2.
%De la misma manera, las reglas de Simpson de cuatro y ocho paneles se combinan para formar
%la regla de ocho paneles en el orden superior siguiente.
%Este algoritmo avanza tanto como querramos, sólo depende del número de evaluaciones que se
%hayan efectuado de la función.
%
pause
%
%Implementemos esta técnica. Iremos hasta el quinto nivel de iteración.
%Comenzamos construyendo las reglas trapezoidales. Operamos sobre la función exp(x) en el
%intervalo [-1,1]. Luego:
n=5; %Niveles de iteración
a=-1;
b=1;
h=(b-a)/2^n;
t(1,1)=(exp(a)+exp(b))/2;
echo off
for i=2:n+1,
t(i,1)=t(i-1,1);
for j=1:2^(i-2),
t(i,1)=t(i,1)+exp(a+h*2^(n-i+1)+h*(j-1)*2^(n-i+2));
end
end

42 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

for i=1:n+1,
t(i,1)=t(i,1)*h*2^(n+1-i);
end
echo on
%
pause
%
%Este algoritmo se construyó para la regla trapezoidal de manera de efectuar el mínimo
%número de llamados de la función. Recordemos que para 2^k paneles (con k=0,1,2 ...n),
%se requieren (2^k)+1 evaluaciones de la función; estas evaluaciones se vuelven a utilizar
%con (2^2k) paneles (en total (2^2k)+1 puntos). Por consiguiente, en cada etapa sólo se
%necesita evaluar la función en 2^k nuevos puntos.
%Si estudiamos la estructura de la expresión de arriba, vemos que ésta se verifica.
%No se requieren evaluaciones adicionales de la función para la extrapolación sucesiva de
%Richardson.
%
pause
%
%Ahora que hemos construido las estimaciones de la regla trapezoidal, grafiquemos los errores
%de arriba:
semilogy(abs(t(:,1)-(exp(1)-exp(-1))))
%Como podemos ver, el error es recortado en un factor de cuatro cada vez que el intervalo es
%llevado a la mitad.
%
pause
%
%Apliquemos ahora el método de extrapolación sucesiva de Richardson.
%Cada regla sucesiva será de orden h^2 más alta que aquella utilizada para calcularla. Por lo
%tanto podemos utilizar la fórmula de Simpson de 2n puntos a partir de la fórmula:
%S2n = (4*T2n - Tn)/(4-1) y la siguiente fórmula de orden superior:
%P2n = (16*S2n - Sn)/(16-1) y así sucesivamente:
echo off
for j=2:n+1
for i=n+1:-1:j
t(i,j)=(4^(j-1)*t(i,j-1)-t(i-1,j-1))/(4^(j-1)-1);
end
end
echo on
%y esto es todo!. La matriz t es de la forma triangular inferior, y contiene la regla del
%trapezoide, la de Simpson y estimaciones de cuadratura de orden superior.
%Veamos esta matriz:
%
pause
%
t
%
pause
%
%Como puede apreciarse, las estimaciones rápidamente convergen al valor correcto.
%Resulta de interés graficar los errores de la última fila. Esta fila contiene las
%estimaciones de cuadratura de orden h^2k (k=1, 2, ..., (n+1)), siendo la primer columna el
%resultado de la regla del trapezoide, la segunda el resultado de la regla de Simpson y así
%sucesivamente. Por lo tanto:
%
pause
%
semilogy(abs(t(n+1,:)-(exp(1)-exp(-1))))
hold on

43 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

semilogy(abs(t(:,1)-(exp(1)-exp(-1))))
hold off
%Por consiguiente, después de la quinta iteración tenemos una regla que es del orden h^12,
%y el error es del orden del error de redondeo, al menos para esta función uniforme.
%No podemos ir mucho más allá, dado que estamos limitados por la exactitud en la doble
%precisión de la computadora.
%En conclusión, la regla de extrapolación sucesiva de Richardson representa un enfoque simple
%y útil para efectuar estimaciones de cuadratura si no se tiene a mano una tabla de nodos y
%pesos de cuadratura Gaussiana. La diferencia entre los dos últimos elementos de la última fila
%suministra una estimación del error de cuadratura. Un par G7K15 Gauss-Kronod podría alcanzar
%un más que elevado nivel de exactitud así como una estimación del error con un poco menos de
%la mitad de evaluaciones de la función utilizada aquí.
echo off
ir arriba

%Ejemplo 23: Mapping y Cuadratura Adaptativaiba


clear
echo on
format compact
format short e
%Este ejemplo muestra el uso de mapping aplicado a la cuadratura Gaussiana en un dominio
%arbitrario, y la remoción de una singularidad de un integrando utilizando técnicas analíticas.
%Utilizaremos como ejemplo la función cos(x)log(x) y la guardaremos en un archivo de función
%MATLAB bajo el nombre 'f1.m'.
%Esta función posee una singularidad integrable en x=0. Queremos integrar la función bajo el
%dominio [0,1]. En primer lugar grafiquemos el integrando:
y=[.0001:.01:1];
plot(y,f1(y))
%Obsérvese que el integrando presenta una dependencia funcional indeseable alrededor de x=0.
%
pause
%
%Veamos como afecta esta situación a la exactitud del esquema de cuadratura Gaussiana.
%En primer lugar calculamos en forma analítica la integral (también podríamos obtenerla
%como una serie infinita)
%La integral es igual a -0.946083. Por lo tanto:
answer=-9.460830703672338e-01;
%Comparémosla con las reglas de cuadratura para 1 a 4 puntos. Haremos esto utilizando
%el archivo de instrucciones 'gauss.m' que devuelve los cuatro valores de la integral.
%Por consiguiente:
a=0;
b=1;
er1=gauss('f1',a,b)-answer
semilogy(abs(er1))
%
pause
%
%Como podemos ver, el error decrece muy lentamente cuando el número de puntos se incrementa.
%Qué sucede si removemos analíticamente la singularidad? En este caso simplemente sustraemos
%la singularidad y la integramos analíticamente. Por lo tanto resolvemos analíticamente el
%siguiente problema: log(x) + (cos(x)-1)log(x). La integral del log(x) sobre el dominio es
%igual a -1.
%En primer lugar graficamos el nuevo integrando (cos(x)-1)log(x). Hemos salvado esta función
%bajo el nombre 'f2.m':
plot(y,f2(y))
%Ciertamente esta función presenta un mejor comportamiento en las proximidades de x=0!

44 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%
pause
%
%Veamos ahora el error de la cuadratura Gaussiana sobre este nuevo integrando:
er2=gauss('f2',a,b)-1-answer
%Obsérvese que tuvimos que sustraer el resultado analítico de la integral del log(x).
n=[1:4];
semilogy(n,abs(er1),n,abs(er2))
%
pause
%
%Como puede apreciarse ésta es una gran mejora. No obstante, podemos mejorar aún más la
%integral debido a que, mientras que la función (cos(x)-1)log(x) se comporta bien en las
%proximidades del origen, sus derivadas de orden superior son todavía singulares! En
%particular, su derivada segunda es singular. Esto se debe a que el error en la cuadratura de
%cuatro puntos se comba hacia arriba en lugar de ir hacia abajo.
%Si continuamos con reglas de cuadratura de orden superior (incrementando uniformemente el
%número de puntos) obtendríamos poco beneficio.
%Obtendríamos un resultado exacto si utilizásemos sobre esta función un algoritmo adaptativo
%incrementando el número de puntos en la región de la singularidad, pero hay otra forma de
%hacer esto!
%
pause
%
%La integral del integrando original puede simplicarse mediante integración por partes.
%Al hacer esto encontramos que la integral de cos(x)log(x) sobre [0,1] es la misma que
%-sin(x)/x. Este integrando se comporta bien en todas partes. Tratemos de integrarlo.
%Lo salvamos bajo el nombre 'f3.m':
pause
%Veamos nuevamente el integrando:
plot(y,f3(y))
pause
%y el error de integración:
er3=gauss('f3',a,b)-answer
semilogy(n,abs(er1),n,abs(er2),n,abs(er3))
%
pause
%
%Ahora tenemos mayor exactitud! El error en la regla de cuadratura de cuatro puntos es del
%orden de 5e-11 para el último integrando, comparado con 3e-2 obtenido para el integrando
%original y 2e-5 si hubiésemos removido la singularidad en forma analítica.
%La moraleja de la historia es que si tenemos alguna duda en la integración de una función,
%o sustraemos la forma asintótica que es singular o transformamos el integrando en una forma
%que presente un mejor comportamiento (desde el punto de vista analítico).
%
pause
%
%Como último ejemplo, veamos que hace con la función el algoritmo adaptativo.
%No podemos aplicarlo a la primera función debido a que 'quad' utiliza la regla de Simpson,
%que requiere la evaluación de la función en los puntos extremos. Por lo tanto integraremos
%la segunda función. La llamaremos 'f2plot' debido a que le hemos agregado un poco de gráficos.
%Nuevamente, tenemos que evitar el colapso de la integral en x=0. Por consiguiente:
%
pause
%
plot(y,f2(y))
hold on
error=quad('f2plot',a,b)-1-answer

45 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

hold off
%
pause
%
%Como podemos ver, la singularidad de la derivada segunda x=0 ha forzado un gran número de
%evaluaciones! La exactitud del resultado final no es mucho mejor que la regla de cuadratura
%Gaussiana de 4 puntos.
echo off

Funciones del Ejemplo:


function y= f1(x)
y=cos(x).*log(x);
function y= f2(x)
y=(cos(x)-1).*log(x);
function y= f2plot(x)
n=length(x);
for i=1:n,
if x(i)==0
y(i)=0;
else
y(i)=(cos(x(i))-1).*log(x(i));
end
end
plot(x,y,'o')
drawnow
function y= f3(x)
y=-sin(x)./x;
function igq= gauss(f,a,b)
%This function calculates the integral of the function
%specified by the string variable 'f' for the 1, 2, 3,
%and 4 point gaussian quadrature rules. The four values
%are returned as an array.
%We define the midpoint:
mid=(b+a)/2;
%We begin with the midpoint rule (n=1)
xstar=0;
wstar=2;
x=mid+xstar*(b-a)/2;
w=wstar*(b-a)/2;
igq(1)=sum(w.*feval(f,x));
%Now the two-point rule
xstar=[-1/3^.5,1/3^.5];
wstar=[1,1];
x=mid+xstar*(b-a)/2;
w=wstar*(b-a)/2;
igq(2)=sum(w.*feval(f,x));
%And the three point rule
xstar=[-0.6^.5,0,0.6^.5];
wstar=[5/9,8/9,5/9];
x=mid+xstar*(b-a)/2;
w=wstar*(b-a)/2;
igq(3)=sum(w.*feval(f,x));
%Finally the four point rule
xstar=[-0.86113631159405,-0.33998104358486,0.33998104358486,0.86113631159405];
wstar=[0.34785484513745,0.65214515486255,0.65214515486255,0.34785484513745];

46 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

x=mid+xstar*(b-a)/2;
w=wstar*(b-a)/2;
igq(4)=sum(w.*feval(f,x));
ir arriba

%Ejemplo 24: Mapping e Integración Monte Carlo


clear
echo on
%Este ejemplo muestra la técnica denominada Integración Monte Carlo.
%Mediante esta técnica se integra la función exp(xy) sobre el círculo x^2+y^2<1.
%Además, se ilustra la técnica de incorporar el dominio, sobre el que realmente se efectúa la
%integración, en el dominio cuadrado |x|<1,|y|<1 definiendo simplemente que la función sea cero
%fuera del círculo pero dentro del cuadrado. El error es precisamente el desvío estándar de la
%función dividido por la raíz cuadrada del número de puntos.
%
pause
%En primer lugar, fijemos el valor de la variable sum en cero:
%
sum=0;
sumsq=0; %Esta variable se define para calcular el error.
n=500;
%Veamos ahora las gráficas. Obsérvese que las gráficas muestran que el proceso disminuye
%lentamente!. Si utilizamos un número grande de puntos, debemos advertir esta situación!
%
pause
%
xx=[-1:.01:1];
yplus=(1-xx.*xx).^.5;
yminus=-(1-xx.*xx).^.5;
plot(xx,yplus,xx,yminus)
drawnow
hold on
%
pause
%
%Veamos ahora el proceso de integración. Conservemos la huella de la suma del integrando
%y la suma del cuadrado del integrando sobre todos los puntos muestreados.
%Este último se utiliza para calcular el error en el proceso de integración. Luego:
%
pause
%
echo off
for i=1:n
x=1-rand*2;
y=1-rand*2;
plot(x,y,'o')
drawnow
if x^2+y^2 < 1,
f=exp(x*y);
sum=sum+f;
sumsq=sumsq+f^2.;
end
end
echo on
hold off
%

47 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

pause
%
%Ahora calculamos la integral y el error.
%Obsérvese que la integral es exactamente el valor del promedio veces el área de integración
%(incluyendo la región cero fuera del dominio embebido o incorporado).
integ=sum/n*4;
error=4*(sumsq/n-(sum/n)^2)^.5/n^.5;
[integ,error]
%
pause
%
%El error relativo depende de la magnitud de la función, del grado de variación y del número
%de puntos utilizados en la evaluación.
%Para 500 puntos, el error para este integrando es de alrededor del 3% .
%La respuesta correcta es:
correct_int=3.2077
%que está dentro del error del valor medio (téngase presente que, usualmente, el valor obtenido
%será diferente cada vez que corramos el programa!)
echo off

ir arriba

%Ejemplo 25: Ecuaciones Diferenciales Ordinarias


clear
echo on
%En este programa demostraremos la inestabilidad de técnicas implícitas
%en la integración de una ecuación diferencial stiff.
%Observaremos el comportamiento de la función dy/dt = f(y), donde f = -a*y+b.
%Esta es la ecuación diferencial que resultaría del llenado estacionario de un reactor
%continuo tanque agitado (CSTR) con agua salada si éste inicialmente contenía
%agua fresca. Por consiguiente, la variable y representa la cantidad de sal presente.
%La estabilidad de la EDO depende del Jacobiano J = df/dy, que en este caso es negativo
%(al menos para valores positivos del parámetro a).
%Echemos una mirada a la estabilidad del Método de Euler. Para comenzar consideremos:
%a=5, b=5 e y(0)=0.
%La solución exacta de esta EDO es: y=(b/a)*(1-exp(-a*t)). Consecuentemente la gráfica de
%la función es:
a=5;
b=5;
x=[0:.01:3];
y=(b/a)*(1-exp(-a*x));
v=[0,3,0,2.5];
axis(v)
plot(x,y)
hold on
pause
%Veamos ahora que resultado nos suministra el Método de Euler.
%Recordemos que la regla de Euler ajusta localmente la función solución con la
%recta tangente en el punto [t(k),y(k)] y utiliza dicha recta para predecir su valor
%en t(k+1). Su expresión es entonces: yem(k+1)=yem(k)+f(yem(k),t(k))*dt. Por lo tanto
%obtenemos la serie:
dt=.1;
yem(1)=0;
t(1)=0;
plot(t(1),yem(1),'o')
pause(1)
k=1;

48 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

while t(k)<3,
yem(k+1)=yem(k)+(b-yem(k)*a)*dt;
t(k+1)=t(k)+dt;
plot(t(k+1),yem(k+1),'o')
pause(1)
k=k+1;
echo off
end;
echo on
%Como podemos ver, el procedimiento de integración permite seguir muy bien la evolución
%temporal de la función. Esto se debe a que la función misma es estable y el tamaño de
%paso suficientemente pequeño de manera que el producto hJ satisface la condición de
%estabilidad del método |1+hJ| < 1. Podemos graficar el error:
pause
hold off
plot(t,yem-(b/a)*(1-exp(-a*t)))
%A partir de este gráfico vemos que el error arranca en cero, se incrementa en magnitud y
%decrece nuevamente. El último decrecimiento se debe a que la ecuación es estable,
%-la familia de soluciones es convergente-, de aquí que los errores anteriores sean
%eliminados.
%Comparemos este comportamiento con lo que sucedería si utilizásemos un tamaño de
%paso más grande.
%Elijamos ahora dt = .3, que aún no es lo suficientemente grande como para que el
%procedimiento sea inestable.
pause
axis(v)
dt=.3;
clear t;
clear yem;
plot(x,y)
hold on
yem(1)=0;
t(1)=0;
plot(t(1),yem(1),'o')
pause(1)
k=1;
while t(k)<3,
yem(k+1)=yem(k)+(b-yem(k)*a)*dt;
t(k+1)=t(k)+dt;
plot(t(k+1),yem(k+1),'o')
pause(1)
k=k+1;
echo off
end;
echo on
%Esta vez el error oscila antes que éste disminuya nuevamente. El método es casi inestable,
%el producto hJ del orden de -1.5, aún es mayor que el valor crítico de -2.
%Si incrementamos el paso un poco más, ocurrirán cosas peores:
pause
hold off
dt=.4;
clear t;
clear yem;
axis(v)
plot(x,y)
hold on
yem(1)=0;
t(1)=0;

49 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

plot(t(1),yem(1),'o')
pause(1)
k=1;
while t(k)<3,
yem(k+1)=yem(k)+(b-yem(k)*a)*dt;
t(k+1)=t(k)+dt;
plot(t(k+1),yem(k+1),'o')
pause(1)
k=k+1;
echo off
end;
echo on
hold off
pause
%Veamos ahora como podemos mejorar las cosas utilizando una técnica implícita.
%La técnica más simple es el Método de Euler Hacia Atrás (Backward Euler), por el
%cual aproximamos la función con una recta, esta vez tangente en el punto [t(k+1),y(k+1)]
%y la usamos desde el punto [t(k),y(k)] para predecir y(k+1). Este procedimiento conduce
%al algoritmo BE (Backward Euler): ybe(k+1)=ybe(k)+f(ybe(k+1),t(k+1))*dt.
%Normalmente para funciones f(t,y)no-lineales tenemos que utilizar un resolvedor de
%ecuaciones no lineales para resolver la relación implícita en el BE algoritmo.
%Sin embargo, para un sistema lineal, éste no es el caso. Podemos resolver ybe(k+1)
%explícitamente. Por lo tanto obtenemos:
dt=.1;
clear t;
axis(v)
plot(x,y)
hold on
ybe(1)=0;
t(1)=0;
plot(t(1),ybe(1),'o')
pause(1)
k=1;
while t(k)<3,
ybe(k+1)=(ybe(k)+b*dt)/(1+a*dt);
t(k+1)=t(k)+dt;
plot(t(k+1),ybe(k+1),'o')
pause(1)
k=k+1;
echo off
end;
echo on
hold off
pause
%El error en este caso es aproximadamente el mismo que en el Método de Euler.
%Esto se debe a que elejimos dt suficientemente pequeño (0.1) de manera que hJ
%no era suficientemente grande como para provocar inestabilidad. Utilicemos ahora
%dt = .4, el valor que causaba que el EM (Euler Method) colapsara:
dt=.4;
clear t;
clear ybe;
axis(v)
plot(x,y)
hold on
ybe(1)=0;
t(1)=0;
plot(t(1),ybe(1),'o')
pause(1)

50 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

k=1;
while t(k)<3,
ybe(k+1)=(ybe(k)+b*dt)/(1+a*dt);
t(k+1)=t(k)+dt;
plot(t(k+1),ybe(k+1),'o')
pause(1)
k=k+1;
echo off
end;
echo on
hold off
pause
%En este caso el error es más grande que en el ejemplo para dt=0.1 (como era de esperar)
%pero las oscilaciones debidas al algoritmo EM se han eliminado completamente.
%Esto refleja el hecho que el método implícito BE es absolutamente estable para toda
%ecuación diferencial estable, no importa cuán grande sea el tamaño del paso.
%Esta es la razón por la cual la mayoría de las subrutinas comerciales de integración
%tienen al menos algún carácter implícito a pesar de la dificultad de resolver la ecuación
%no lineal determinada por el problema implícito.
%Observemos que, usualmente, esta ecuación no lineal es muy fácil de resolver debido a que
%tenemos una excelente estimación inicial para el valor de y(k+1) a partir de las fórmulas
%explícitas. Por consiguiente, esquemas rápidos tales como el método de Newton tienen una
%elevada tasa de convergencia y usualmente no nos ponen en dificultad.
hold off
echo off

ir arriba

%Ejemplo 26: Métodos de Integración de EDO's


clear
echo on
%Este programa muestra el uso de los siguientes métodos de resolución de EDO's:
%1) Euler (Forward Euler)
%2) Euler hacia Atrás (Backward Euler)
%3) Euler-Gauss (Regla del Trapecio)
%4) Runge-Kutta de 2do. orden
%5) Runge-Kutta de 4to. orden
%en la integración de una función arbitraria f(y,t).
%El ejemplo es similar al desarrollado en las últimas clases, excepto que crearemos
%una función de MATLAB que llamaremos "fa" para manejar la función f(y,t) en lugar
%de escribirla explícitamente.
%También utilizaremos el método de Newton para resolver las partes implícitas de los
%métodos de Euler-Gauss y Backward Euler.
pause
%La ecuación específica que integraremos es la correspondiente al oscilador forzado
%sin amortiguamiento: y"=-y + a*cos(w*t).
%La función de forzamiento depende de dos parámetros: "a" y "w".
%En razón de pasar estos dos parámetros a la función de MATLAB, simplemente los
%declararemos parámetros globales tanto en el programa principal (en el main script,
%esto es, en este archivo) como en la función misma.
%Trataremos a la variable dependiente "y" como un vector de variables dependientes:
%y(1) = y e y(2) = y'.
%para hacer que el proceso de integración sea tan general como sea posible.
pause
global a w
a = 1.5;
w = 2;

51 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

dt = 0.1;
%Para comenzar, veamos como es esta función para este conjunto específico de parámetros.
%La respuesta exacta viene expresada a través de la función: yexact.m
%Por consiguiente:
time=[0:.2:20];
v=[0,20,-2,2];
axis(v);
plot(time,yexact(time))
xlabel('t')
ylabel('y(t)')
hold on
%Para el Método de Euler clásico:
y(1)=1;
y(2)=0;
t=0;
i=1;
plot(t,y(1),'o')
echo off
while t<20,
y=y+dt*fa(y,t);
t=t+dt;
plot(t,y(1),'o')
erem(i)=y(1)-yexact(t);
i=i+1;
end
echo on
hold off
pause
%Como podemos ver, el Método de Euler arranca siguiendo la función bastante bien,
%pero la inestabilidad aparece a tiempos largos y el error aumenta.
%El error se conserva en la variable erem:
plot(erem)
xlabel('t')
ylabel('error')
%Como podemos ver, el error que cometemos es muy grande!
pause
%También podemos ver el método Backward Euler. En este caso, el método es implícito,
%por consiguiente tenemos que encontrar la raíz de una ecuación (algebraica o no
%algebraica) en cada paso. Luego:
axis(v);
plot(time,yexact(time))
xlabel('t')
ylabel('y(t)')
hold on
y(1)=1;
y(2)=0;
t=0;
i=1;
[m,n] = size(y);
tol=.0001;
eps=.00001;
plot(t,y(1),'o')
echo off
while t<20,
dy=1;
ybe=y+dt*fa(y,t); %Comenzamos estimando con el método de Euler explícito.
while sum(abs(dy))>tol,
%Esta es la función que debería ser cero:

52 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

g=ybe-y-dt*fa(ybe,t+dt);
for k=1:n
e=zeros(1,n);
e(k)=eps;
j(1:n,k)=(fa(ybe+e,t+dt)-fa(ybe-e,t+dt))'/2/eps;
end
%Esta es la derivada de la función de arriba:
gp=eye(n)-dt*j;
%Ahora resolvemos para el valor corregido BE:
dy=gp\g';
ybe=ybe-dy';
end
t=t+dt;
y=ybe;
plot(t,y(1),'o')
xlabel('t')
ylabel('y(t)')
erbe(i)=y(1)-yexact(t);
i=i+1;
end
echo on
hold off
pause
%Este método traza la función como el método explícito de Euler.
%La magnitud del error permanece acotada, pero todavía crece con el tiempo.
%Podemos graficar los dos errores juntos:
plot(erem)
xlabel('t')
ylabel('error')
hold on
plot(erbe,'r')
hold off
%Como podemos ver, el método Backward Euler no es una gran mejora.
%Esto se debe a que la ecuación diferencial misma no es stiff, sino que sólo es
%neutralmente estable sin amortiguamiento.
%Cualquier valor finito de dt conducirá a inestabilidad numérica.
pause
%Veamos ahora el Método de Gauss-Euler (o regla del trapecio).
%Este método también es implícito, por lo tanto, nuevamente, utilizaremos el método
%de Newton para resolver cada nuevo y. Tenemos:
axis(v);
plot(time,yexact(time))
xlabel('t')
ylabel('y(t)')
hold on
y(1)=1;
y(2)=0;
t=0;
i=1;
[m,n] = size(y);
tol=.0001;
eps=.00001;
plot(t,y(1),'o')
echo off
while t<20,
dy=1;
ytr=y+dt*fa(y,t);
while sum(abs(dy))>tol,

53 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

g=ytr-y-dt*(fa(ytr,t+dt)+fa(y,t))/2;
for k=1:n
e=zeros(1,n);
e(k)=eps;
j(1:n,k)=(fa(ytr+e,t+dt)-fa(ytr-e,t+dt))'/2/eps;
end
gp=eye(n)-dt*j/2;
dy=gp\g';
ytr=ytr-dy';
end
t=t+dt;
y=ytr;
plot(t,y(1),'o')
ertr(i)=y(1)-yexact(t);
i=i+1;
end
echo on
hold off
pause
%La regla del trapecio realiza un mejor trabajo de seguimiento de la solución,
%como uno esperaría. El error aún crece con el tiempo, sin embargo, debido a la
%naturaleza implícita de la regla es bastante lento.
%Comparemos esta regla con una de las reglas explícitas más simples, el método de
%Runge-Kutta de 2do. orden:
pause
axis(v);
plot(time,yexact(time))
xlabel('t')
ylabel('y(t)')
hold on
y(1)=1;
y(2)=0;
t=0;
i=1;
plot(t,y(1),'o')
echo off
while t<20,
k1=dt*fa(y,t);
k2=dt*fa(y+k1,t+dt);
y=y+(k1+k2)/2;
t=t+dt;
plot(t,y(1),'o')
er2s(i)=y(1)-yexact(t);
i=i+1;
end
echo on
hold off
pause
%Aquí también el método traza la función solución bastante bien con un error ligeramente
%más grande.
%Podemos ver esto un poco mejor si graficamos los dos errores simultáneamente.
%En primer lugar el del RK de 2do. orden:
plot(er2s)
xlabel('t')
ylabel('error')
pause
%Luego el de Gauss-Euler:
hold on

54 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

plot(ertr,'r')
hold off
pause
%A partir de este gráfico resulta claro que el error del Método de Euler-Gauss
%es aproximadamente la mitad del que suministra la técnica de Runge-Kutta de 2do. orden.
%La discrepancia sería más grande (y mucho) para un problema stiff en el que el método
%explícito debería fallar, pero el método implícito sería estable.
pause
%Volvamos ahora a nuestra regla final, el método de Runge-Kutta de 4to. orden.
%Tenemos el conjunto simple de ecuaciones:
axis(v);
plot(time,yexact(time))
xlabel('t')
ylabel('y(t)')
hold on
y(1)=1;
y(2)=0;
t=0;
i=1;
plot(t,y(1),'o')
echo off
while t<20,
k1=dt*fa(y,t);
k2=dt*fa(y+k1/2,t+dt/2);
k3=dt*fa(y+k2/2,t+dt/2);
k4=dt*fa(y+k3,t+dt);
y=y+(k1+2*k2+2*k3+k4)/6;
t=t+dt;
plot(t,y(1),'o')
er4s(i)=y(1)-yexact(t);
i=i+1;
end
echo on
hold off
pause
%Este método también traza la función muy bien, pero ahora el error es muy pequeño,
%suministrando:
plot(er4s)
xlabel('tiempo')
ylabel('error')
%que es varios órdenes de magnitud más pequeño que el error en el método
%de R-K de segundo orden!
pause
hold off
echo off

Funciones del Ejemplo:


function z= fa(y,t)
global a w
z(1)=y(2);
z(2)=-y(1)+a*cos(w*t);
function y= yexact(t)
global a w
y=-a/(w^2-1)*(cos(w*t)-cos(t))+cos(t);

ir arriba

55 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

%Ejemplo 27: Algoritmos con Control Adaptativo de Paso


clear
echo on
%Este programa ilustra el uso de un algoritmo con control adaptativo de paso para mejorar
%la exactitud de la integración. Básicamente, queremos poner más puntos en la región
%donde la curvatura de la función es grande, de la misma manera como se hacía con la
%cuadratura adaptativa.
%En este caso utilizaremos la rutina de cuadratura ode23.m.
%Elegimos como ejemplo, al sistema presa-predador que ya fuera discutido en clase.
%Supondremos que la población de conejos está representada por y(1) y la población de
%zorros por y(2).
pause
%Las poblaciones variarán de acuerdo con las ecuaciones:
%f(1)=a*y(1)-b*y(1)*y(2);
%f(2)=(b*y(1)-1)*y(2);
%donde a=2, b=1, y c=0.5 son algunas constantes que describen el crecimiento y el
%acoplamiento de las poblaciones.
%Esta información será almacenada en el programa adjunto conejo.m.
pause
%Debemos establecer condiciones iniciales y decidir sobre la tolerancia en el error.
%Por consiguiente:
y0=[1,0.1]
options=odeset('reltol',1e-05);
%Queremos integrar este sistema desde t=0 hasta t=15. Luego:
pause
[t,y]=ode23('conejo',[0 15],y0,options);
%Graficamos primero la población de conejos:
plot(t,y(:,1),'b')
hold on
pause
%luego la de zorros:
plot(t,y(:,2),'r')
hold off
pause
%Como podemos ver, la función es más que cíclica con la población de zorros
%creciendo lentamente al principio y la población de conejos creciendo drásticamente
%después que la población de zorros prácticamente ha desaparecido.
%Podemos examinar la evolución del tamaño del paso:
n=length(t)
dt=t(2:n)-t(1:n-1);
hold on
plot(t(1:n-1),dt*100,'g')
pause
%Como puede apreciarse, se produce un tremendo decrecimiento en el tamaño del paso donde
%cada una de las funciones tienen un elevado grado de curvatura.
hold off
echo off

Funciones del Ejemplo:


function f= conejo(t,y)
f=zeros(2,1);
a=2;
b=1;
c=0.5;
f(1)=a*y(1)-b*y(1)*y(2);
f(2)=(c*y(1)-1)*y(2);

56 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

ir arriba

%Ejemplo 28: Problemas de Valores de Contorno: Shooting Method


clear all
global dist v0 dt height
clf
echo on
%Este programa ilustra el uso del shooting method.
%Como ejemplo analizaremos el ángulo de inclinación que debería adoptar
%un cañón para que una bala disparada por éste impacte en un blanco determinado.
%Para convertir un problema de valores de contorno en uno de valores iniciales
%utilizaremos el shooting method.
%Para este propósito seguiremos la trayectoria de la bala disparada por el cañón.
%Conocemos desde donde ésta parte (el lugar donde está ubicado el cañón) y su
%velocidad inicial (determinada por la cantidad de pólvora o propelente utilizado),
%y queremos averiguar que ángulo de elevación se debe dar al cañón para que la
%bala disparada por éste impacte en un blanco ubicado a una determinada distancia
%y a una determinada altura sobre el suelo.
%Definimos el vector y = [x,z,vx,vz] y escribimos las ecuaciones de movimiento
%o de evolución en el tiempo de la bala en la función cannonball.m.
pause
%En primer lugar especificamos la velocidad inicial(usaremos ingreso manual de datos).
%Velocidad inicial en m/seg (módulo):
v0 = input ('ingrese velocidad inicial = ')
%
%Distancia horizontal del blanco en metros:
dist = input ('ingrese distancia horizontal del blanco = ')
%
%Altura del blanco en metros:
height = input ('ingrese altura del blanco = ')
%
%Tiempo de discretización (seg.):
dt = input ('ingrese tiempo de discretización = ')
%Graficamos la posición del blanco:
plot(dist,height,'x')
hold on
pause
%Finalmente ingresamos el ángulo de elevación del cañón (en radianes). Si ingresamos el valor 0
%el programa efectúa el ajuste en forma automática.
%Si los valores son distintos de cero, el ajuste lo hacemos en forma manual por simple inspección
%de la gráfica:
theta=input('ingrese ángulo de elevación del cañón = ');
%
echo off
%
while theta~=0,%ángulo distinto de cero
%Usamos esto para calcular las velocidades:
y(1)=0;
y(2)=0;
y(3)=v0*cos(theta);
y(4)=v0*sin(theta);
plot(y(1),y(2),'o')
%
%Procedemos a integrar el sistema de ecuaciones lineales.
%Utilizamos el método de Runge-Kutta de tercer orden:
t=0;
while dist>y(1),

57 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

k1=dt*cannonball(t,y);
k2=dt*cannonball(t+dt,y+k1);
k3=dt*cannonball(t+dt/2,y+(k1+k2)/4);
y=y+(k1+4*k3+k2)/6;
t=t+dt;
plot(y(1),y(2),'o')
end;
theta=input('ingrese ángulo de elevación del cañón = ');
end;
hold off
echo on
%Este programa ilustra el ajuste manual del shooting method.
%Frecuentemente el ajuste manual es bastante efectivo si hay
%solo un parámetro para jugar.
%Ciertamente esto nos permite tener una buena idea de la función
%y obtener una estimación del valor correcto del parámetro de disparo.
%Una manera más elegante de hacer esto es utilizar una técnica
%de determinación de raíces.
%Para este propósito utilizamos la rutina fzero de MATLAB para
%determinar el ángulo de disparo que suministra la altura correcta
%a la distancia correcta.
pause
%Para hacer esto debemos poner la rutina de integración en una función
%que devuelve la diferencia entre la altura de la bala de cañón y la del blanco
%a la distancia del blanco.
%Llamaremos a esta función deltah(theta).
%La rutina de MATLAB fzero ajustará theta hasta que el valor devuelto
%por esta función sea cero.
pause
plot(dist,height,'x')
hold on
opttheta=fzero('deltah',0.1)
%y esto es todo!
%La vida se nos complica un poco si tenemos dos parámetros de ajuste,
%pero podemos resolver esto mediante un procedimiento de minimización 2D
%donde la función a minimizarse es la suma de los cuadrados de las desviaciones.
%Si Ud. hace esto asegúrese de escalar todo cuidadosamente.
hold off
echo off

Funciones del Ejemplo:


function dh= deltah(theta)
%Esta función toma un valor de entrada del ángulo inicial
%y devuelve la diferencia de altura entre bala y el blanco a
%la distancia del blanco.
%Si ésta es cero, el blanco ha sido impactado.
%Observe que después del proceso de integración debemos
%debemos efectuar una interpolación para obtener la altura correcta
%de la bala a la distancia horizontal estipulada.
%
global dist v0 dt height
%
%Tenemos las posición inicial:
y(1)=0;
y(2)=0;
%y la velocidad inicial
y(3)=v0*cos(theta);
y(4)=v0*sin(theta);

58 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM
..:: Matemática Avanzada para Ingenieros Químicos ::.. Carrera Ingenierí... http://www.frro.utn.edu.ar/catedras/index.php?mostrar_contenido=248&m...

plot(y(1),y(2),'o')
%
%Para el procedimiento de integración usamos el método de Runge-Kutta de tercer orden:
t=0;
while dist>y(1),
ylast=y;
k1=dt*cannonball(t,y);
k2=dt*cannonball(t+dt,y+k1);
k3=dt*cannonball(t+dt/2,y+(k1+k2)/4);
y=y+(k1+4*k3+k2)/6;
t=t+dt;
plot(y(1),y(2),'o')
end;
drawnow
%Ahora, para el proceso de interpolación.
%El tiempo que la bala pasó por el blanco es un poco menor (debido al paso temporal de
%integración) que el tiempo final calculado en el while; por lo tanto la última distancia
%horizontal calculada es un poco mayor que la distancia a la que se encuentra el blanco.
%Podemos obtener esta diferencia temporal, que llamamos delta (y que es negativa para poder
%utilizarla para calcular la altura a la que pasó la bala al tiempo de llegada a la posición
%del blanco mediante desarollo en serie de Taylor hacia atrás):
delta=-(y(1)-dist)/(y(1)-ylast(1))*dt;
%Calculamos la altura final de la bala utilizando tres términos del desarrollo hacia atrás en
%serie de Taylor alrededor del último tiempo calculado, para obtener una medida más exacta, así:
hfinal=y(2)+y(4)*delta+0.5*delta^2*(y(4)-ylast(4))/dt;
%Finalmente, devolvemos la diferencia en altura:
dh=hfinal-height;

function f= cannonball(t,y)
%Esta función devuelve las derivadas temporales de las posiciones
%"x" y "z" y de las componentes de la velocidad, vx y vz.
%Tenemos los siguientes valores de parámetros:
m=5; %Masa de la bala (kg)
cd=0.44; %Coeficiente de arrastre
a=0.03; %Sección transversal de la bala (m^2)
rho=1.0; %Densidad del aire (kg/m^3)
g=9.8; %Aceleración debida a la gravedad (m/s^2)
%y las derivadas:
f(1)=y(3);
f(2)=y(4);
f(3)=-cd*a*rho/2/m*(y(3)^2+y(4)^2)^.5*y(3);
f(4)=-cd*a*rho/2/m*(y(3)^2+y(4)^2)^.5*y(4)-g;
%Observe que el coeficiente de arrastre total está distribuido entre las dos componentes
%de la velocidad y es proporcional a la velocidad en cada dirección.

ir arriba

U.T.N. Facultad Regional Rosario | Area Redes y Comunicaciones | Contactese | CSS and XHTML

59 deCreated
59 with novaPDF Printer (www.novaPDF.com). Please register to remove this message. 9/19/2013 7:13 AM

También podría gustarte