Vous êtes sur la page 1sur 88

Ejemplo 01: Que son los Mtodos Numricos?

Ejemplo 02: Errores Numricos

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

Ejemplo 04: Overflow y Underflow

Ejemplo 05: Sistema de Ecuaciones Lineales: Extractor lquido - lquido

Ejemplo 06: Matrices mal acondicionadas

Ejemplo 06-b: Norma de Matrices y nmero de condicin

Ejemplo 07: Descomposicin plu

Ejemplo 08: Regresin Lineal

Ejemplo 09: Factorizacin QR de matrices

Ejemplo 10: Factorizacin QR con pivoteo de columna

Ejemplo 11: Descomposicin en Valores Singulares

Ejemplo 12: Estadstica Elemental y Probabilidad

Ejemplo 13: Propagacin del Error

Ejemplo 14: Propagacin del Error en la Regresin Lineal

Ejemplo 15: Anlisis y Error de Regresin

Ejemplo 16: Mtodos de Newton y de la Secante

Ejemplo 17: Sistemas de Ecuaciones No Lineales

Ejemplo 18: Optimizacin Unidimensional

Ejemplo 19: Optimizacin Restringida

Ejemplo 20: Cuadratura

Ejemplo 21: Estimacin del Error de Cuadratura

Ejemplo 22: Cuadratura Adaptativa

Ejemplo 23: Mapping y Cuadratura Adaptativa

Ejemplo 24: Mapping e Integracin Monte Carlo

Ejemplo 25: Ecuaciones Diferenciales Ordinarias

Ejemplo 26: Mtodos de Integracin 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 Mtodos Numricos?


clear
echo on
%Este ejemplo demuestra el uso de un subprograma simple
%para calcular el capital de una cuenta de retiro en funcin
%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 travs del llamado
%de la funcin:
[r, s]=retire(x);
pause
%Finalmente, graficaremos la funcin:
plot(x,r)
pause
%En el grfico vemos que el capital deseado de $1M se alcanza con una tasa
%de ahorro de aproximadamente 12.5%. Un programa ms sofisticado podra
%explorar el efecto de diferentes tasas de inters, de aumento y de inflacin.
echo of
Funciones del Ejemplo:
function [r, s] = retire(x)
%Esta funcin 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 inflacin fija, como funcin de la fraccin de
%salario ahorrada. Se supone que Ud. trabaja durante 40 aos.
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 multiplicacin matricial o para la
%multiplicacin por un escalar.

%El comando .* (o ./ o .^) se reserva para la


%multiplicacin trmino a trmino de cada elemento de s y de x.
%Al operar de esta manera, la funcin 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
%programacin si no es cuidadoso.
ir arriba
%Ejemplo 02: Errores Numricos
clear
echo on
%Este programa muestra el error de redondeo de la mquina
%y del algoritmo para el clculo en diferencias hacia adelante
%de la derivada de una funcin.
%El algoritmo en diferencias hacia adelante es:
%df/dx = (f(x+h)-f(x))/h
%donde h representa una cantidad pequea. Aplicamos la frmula
%a la funcin 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 of
x=[0:.001:.1];
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 mnimo ocurre para un valor de h
%de alrededor de 1.5*10^-8. Esto significa que, a partir de la frmula
%para el error de diferencias hacia adelante, la precisin de la
%mquina es de alrededor de 0.5*10^-16, o sea doble precisin.
echo of
ir arriba

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


clear
echo on
%Esta es una demostracin 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 situacin haciendo algunos cambios:
save 'A.m' A -ascii -double -tabs;
%de esta manera guardamos el archivo de datos en formato ascii, usando
%doble precisin y tabulando las columnas.
%Observe nuevamente el archivo con el editor de texto.
pause
%El archivo ahora tiene ms sentido, pero deber tener en cuenta
%el error de redondeo en el ltimo dgito!
%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 hubisemos estipulado el nombre 'B.m'
%por ejemplo, tendramos 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
pause
%Como puede verse, esta operatoria hace fcil obtener
%archivos de entrada y de salida de MATLAB. Este ejemplo puede imprimirse.
%La forma ms simple de hacer esto es utilizar el comando 'diary' (de MATLAB):
diary 'out.txt'
disp('Esta es la matriz A')
disp('A')
diary of
%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 extensin 'txt' del archivo nos indica que es un archivo de texto,
%sin embargo, tambin 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 of
ir arriba
%Ejemplo 04: Overflow y Underflow
clear
echo on
%Este archivo de instrucciones utiliza la funcin

%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. Cul es la probabilidad
%que salga cara 25 veces?
x=prob(.5,25,50)
pause
%Podemos graficar la funcin de distribucin de probabilidades en funcin de k:
k=[1:50];
plot(k,prob(.5,k,50))
xlabel('k')
ylabel('probabilidad')
pause
%A partir del grfico vemos que la probabilidad presenta un mximo para k = 25
%como era de esperar.
pause
%Tambin 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 pequea.
echo of
Funciones del Ejemplo:
function x= prob(p,k,n)
%Esta funcin 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 funcin n y p son escalares, pero podran 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 nmero muy grande, b, para mantener el
resultado
%dentro del rango de validez.
%La variable m registra el nmero 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 funcin 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 funcin n y p son escalares, pero podran 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);
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 lquido - lquido
clear
echo on

%Este archivo de sentencias ilustra como un sistema de ecuaciones


%puede ser usado para resolver problemas de ingeniera qumica.
%Consideremos el ejemplo del extractor lquido-lquido como el visto en teora.
%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.
%Adems, 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 informacin para determinar la
%distribucin 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 solucin del sistema depende nicamente de la relacin s*k/w,
%la cual representaremos por el smbolo chi.
chi = 0.1;
pause
%Establecemos la matriz:
n=4;
%Esta lnea de cdigos crea la diagonal principal de
%la matriz a resolver:
a=-(1+chi)*diag(ones(1,n),0)
pause
%Esta lnea crea la sub-diagonal de la matriz:
a=a+diag(ones(1,n-1),-1)
pause
%Y esta lnea 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 concentracin de entrada

%del soluto en el agua es la unidad, y la concentracin de


%entrada del soluto en el solvente es cero.
pause
%Ahora, resolvemos la distribucin 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 tamao de h
echo of
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 solucin.
%Construyamos el vector b de trminos independientes de manera que la solucin
%del sistema h*x=b sea x(i)=i. As:

pause
x=cumsum(ones(n,1))
%Esta es la manera ms rpida de hacerlo. Ahora, para b:
pause
b=h*x
%cuyo lado derecho aparenta ser perfectamente inocente.
pause
format long
%Resolvamos el sistema utilizando la descomposicin LU:
x=h\b
format short
pause
%Observe el error que se comete en la solucin! ste se produce an trabajando
%en doble precisin. Podemos ver esto ms claramente si adicionamos un poco
%de error al vector b:
bp=b+rand(n,1)*10^(-n)
%La operacin anterior adiciona al vector b un error aleatorio del orden de 10^-n.
%Observemos ahora la solucin:
pause
xp=h\bp
%que es disparatadamente diferente de la solucin 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 razn:

ratio=deltax/deltab
pause
%Esta relacin es muy grande! Podemos compararla con el nmero de condicin de
la matriz
%de Hilbert:
cond(h,1)
%que es del mismo orden de magnitud que la razn calculada previamente.
%Moraleja de esta historia: Cuidado con las matrices mal acondicionadas!
echo of
ir arriba
%Ejemplo 06-b: Norma de Matrices y nmero de condicin
clear
echo on
%Este archivo de instrucciones demuestra la
%relacin entre la norma de la matriz A y su
%nmero de condicin. El nmero de condicin
%se usa en la determinacin de la sensibilidad
%de la solucin de un sistema de ecuaciones a los
%errores en la matriz y en el vector de trminos
%independientes
%
%Primero definamos a:
a=[1 2; 3 4]
pause
%Deseamos determinar la variacin de la relacin
%||Ax|| / ||x|| con la direccin del vector x.
%Esta relacin es independiente de la longitud de x,
%y es solamente funcin de su direccin y del modo
%en que esta direccin interactua con la matriz A.
%A una vector de 2 dimensiones podemos
%representarlo en funcin de un angulo theta.
%Esto es
pause
theta=[0:.01:2*pi];
npt=length(theta);
echo of
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 relacin 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 relacin vs. la direccin del vector x:
plot(theta,m)
xlabel('theta')
ylabel('norm(b)/norm(n)')
%Esta relacin depende fuertemente del ngulo theta.
%El valor mximo es la norma de la matriz A, el cual es
%igual al mximo de las normas de todas las columnas de A.
%Para esta matriz el mximo es 6.
pause
%El mnimo es 1/||inv(A)||. Podemos determinarlo:
ainv=inv(a)
%entonces el mnimo es solo 1/3.5 = 0.2857. Este es cercano
%al valor que obtenemos de la grfica:
min(m)
pause
%La diferencia ocurre porque no hemos elegido un vector
%x que realmente corresponda a la direccin del mnimo.
%
%Finalmente, podemos determinar el nmero de condicin.
%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 funcin de
%MATLAB 'cond(A)':
cond(a)
pause
%Como podemos ver, los dos son un tanto diferentes. Los procedimientos
%de clculo de matlab para el nmero de condicin utilizan la norma-2
%en cambio de la norma manhattan.
%El nmero de condicin de la norma-2 se define como la relacin
%del ms grande al ms pequeo de los valores singulares de la matriz.

%El nmero de condicin 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 nmero de condicin porque el clculo exacto
%realiza muchas ms operaciones que la descomposicin LU!
echo of
ir arriba
%Ejemplo 07: Descomposicin plu
clear
echo on
%En este ejemplo demostraremos el uso de la descomposicin 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 of
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 trminos independientes 'b' del sistema a*x=b:
x=[1:n]';
b=a*x
%esto es, a partir de la matriz 'a' y el vector solucin 'x' obtenemos el lado derecho
del
%sistema de ecuaciones cuya solucin nos d el arreglo x = [1:n]'.

pause
%Resolvamos el sistema utilizando la descomposicin 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 informacin escriba en la lnea de comandos del MATLAB 'help lu'.
%Examinemos c/u de stas matrices.
pause
%La matriz de permutacin 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 eliminacin Gaussiana:
l
pause
%La matriz 'u' es una matriz triangular superior - matriz resultante una vez que el
proceso de

%eliminacin Gaussiana se haya completado:


u
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 ms rpido que efectuar la eliminacin Gaussiana. Mostremos esto:
pause
flops(0)
z=p'*b;
y=l\z;
x=u\y;
%Por lo tanto x resulta:
x
%y el nmero total de sustituciones hacia atrs y hacia adelante es:
subflops=flops
pause
%Podemos comparar este nmero 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 solucin 'x' del sistema de ecuaciones es la misma que antes,
%pero el nmero de operaciones es ms alto. La discrepancia sera mucho mayor si
el orden n de
%la matriz fuese mucho mayor.
echo of
ir arriba
%Ejemplo 08: Regresin Lineal

clear
echo on
%Este ejemplo muestra el uso de tcnicas matriciales de solucin para
%resolver problemas de regresin lineal.
%Como ejemplo, supongamos que hemos medido la concentracin de un soluto en
un solvente
%en funcin del tiempo, con el propsito de determinar el coeficiente de
transferencia
%de masa de una membrana. Para observar la geometra 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('Concentracin')
hold on
%Observe que la concentracin tiende a un valor de equilibrio cuando el tiempo
%alcanza valores muy grandes. Determinamos que el valor de equilibrio es 1.0.
pause
%En razn de efectuar una regresion lineal, nuestra ecuacin debe ser lineal
%en los parmetros del modelo (no necesariamente en el tiempo). Para ello,
transformamos
%el modelo:
% (c-ceq)=(c0 - ceq)exp(-hAt/V)
%en la forma:
% ln(c-ceq)=ln(c0-ceq) - (hA/V)t
%donde ln(c0-ceq) y -(hA/V) son los nuevos parmetros 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 of
pause

%Hay ms de una manera de resolver el sistema de ecuaciones lineales.


%El problema de regresin lineal que hemos resuelto puede transformarse en
%un sistema de ecuaciones lineales.
%Definimos las funciones de modelizacin 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 solucin x que representa a los parmetros del modelo, obtenido por
regresin
%lineal, puede determinarse a partir de la resolucin del siguiente sistema de
ecuaciones
%lineales:
%(A'*A)*x = A'*b.
%Estas ecuaciones se conocen con el nombre de ecuaciones normales de la
regresin lineal.
pause
%Si resolvemos este problema utilizando los operadores del MATLAB obtenemos:
x=(A'*A)\(A'*b)
%que es la misma solucin obtenida a travs del enfoque directo.
%La ventaja de este enfoque es que fcilmente puede extenderse a cualquier
nmero
%de parmetros del modelo.
%En la prxima clase demostraremos una forma superior de resolver este tipo de
problemas
%de regresin.
echo of
ir arriba
%Ejemplo 09: Factorizacin QR de matrices
clear
echo on
%En este ejemplo demostraremos como
%la factorizacin QR se puede usar para resolver
%problemas de regresion lineal. Primero plantearemos
%el problema. Supongamos que deseamos determinar
%la aceleracin de la gravedad
%midiendo la posicin de un proyectil
%en funcin del tiempo despus de su lanzamiento.
%Sabemos de mecnica que la posicin en funcin del tiempo de un proyectil
balstico
%se expresa como:
%h = h0 + u0*t -0.5*g*t^2
%donde h0 es la posicin inicial y u0 es la velocidad inicial.

%De este modo tenemos como datos los puntos (t(i),h(i));


%podemos ajustarlos a una parbola y obtener g.
pause
%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 solucin ser:
x=ata\atb
%con una aceleracin 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 factorizacin QR.
%Primero obtengamos la factorizacin QR:
[q,r]=qr(a);
%Veamos a r primero:
r
%Notar que slo los elementos triangulares superiores son distintos de
%cero. Los elementos diagonales de esta matriz no estn
%necesariamente ordenados por tamao.
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 ecuacin por q':

qta=q'*a
%y
qtb=q'*h
pause
%Notar que los ltimos cuatro elementos del nuevo lado derecho de la ecuacin
%proveen la norma del residuo.
%Resolvamos esto:
x=r\qtb
%lo cual da el mismo resultado.
echo of
ir arriba
%Ejemplo 10: Factorizacin QR con pivoteo de columna
clear
echo on
%Este archivo de instrucciones demuestra el uso de la factorizacin '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 factorizacin '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 trmino 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 esperaramos para simple precisin. Veamos ahora la matriz
discutida en clase.
pause

%Tenemos:
n=7
a=eye(n)
%Construmos la matriz 'a'triangular superior de la siguiente manera:
echo of
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 factorizacin 'qr' a la matriz 'a':
[q r]=qr(a)
%Observemos que la factorizacin 'qr' no produce ningn cambio
%debido a que la matriz 'a' ya se encuentra en la forma triangular superior.
pause
%Podemos aprender mucho acerca de la matriz (cun prxima se encuentra a la
%singularidad) si efectuamos factorizacin '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

%ms pequeo que los otros elementos diagonales. Esto es debido a que la matriz
'a'
%est prxima a la singularidad.
%Esta descomposicin es una descomposicin '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 precisin de la mquina.
echo of
ir arriba
%Ejemplo 11: Descomposicin en Valores Singulares
echo on
clear
clf
clc
%Este programa demuestra de qu manera puede utilizarse la descomposicin 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); %Tamao de la imagen.
%Descomposicin 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 nmero de
valores singulares

%que se utilizarn en la reconstruccin de la imagen.


components = uicontrol('Style','Slider',...
'Min',1,'Max',250,'Value',20,...
'Position',[20,20,500,20],...
'Callback','displaycomponents');
%Esta es una funcin de MATLAB que genera y dibuja la imagen con el nmero de
componentes
%controladas por diapositiva:
displaycomponents
Archivo de sentencias complementario al ejemplo:
%displaycomponents.m
echo of;
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 estimacin 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
%Ejemplo 12: Estadstica Elemental y Probabilidad
clear
echo on

%Este archivo ilustra algunas propiedades elementales


%de la distribucin normal o Gaussiana.
%La densidad de probabilidad de una distribucin normal se define como
%la probabilidad que una medicin est en el rango [x,x+dx]dividida por el ancho
%del intervalo. Es igual a la derivada de la funcin de probabilidad acumulada.
%Para una distribucin 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 desviacin estndar sigma.
%Seguidamente graficamos esta distribucin.
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 medicin cae
rpidamente
%cuando uno se aleja de la media.
%Podemos ver ahora la probabilidad acumulada, que se obtiene integrando p(x), o
%ms convenientemente, utilizando la funcin 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 grfico se puede ver que hay un 31% de probabilidades que una
medicin 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
%Cmo calculamos ahora la media y la varianza de la distribucin?
%En primer lugar generemos la distribucin utilizando el comando
%randn (generador de una distribucin normal)

n=100;
z=randn(n,1);
%Grafiquemos la distribucin 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 ms ruidosa. Comparmoslas:
pause
hold on
plot(x,P,'r')
hold of
%lo cual demuestra la equivalencia.
%Podemos calcular la media de la muestra:
mean=sum(z)/n
%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 ms elevado
que, en general
%toma muchos ms datos!.
echo of
ir arriba
%Ejemplo 13: Propagacin del Error
clear
echo on
%Este archivo ilustra cmo se propaga el error a travs de un clculo cuando hay un
%error en cada una de las variables.
%Supongamos que tenemos dos variables "x" e "y" que son independientes y que
estn normalmente
%distribuidas.
%Establezcamos que "x" tiene una media de 2 e "y" una media de 3, ambas con
desvo estndar igual a 1.

n=1000;
x=randn(n,1)+2;
y=randn(n,1)+3;
pause
%Podemos graficar la distribucin acumulada de estas dos variables:
cumprob=[1:n]/n;
plot(sort(x),cumprob)
hold on
plot(sort(y),cumprob,'gr')
hold of
pause
%Observe que las pendientes de las probabilidades acumuladas son las mismas, lo
cual indica
%que cada una de las variables tiene el mismo desvo estndar.
%Definamos una nueva variable "z" tal que "z" = "x" + "y". Cul 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 ms
fcilmente sus pendientes.
%Observe que la pendiente de la probabilidad acumulada de "z" es menor que la de
"x", lo cual indica
%un mayor desvo estndar.
pause
%Veamos ahora la distribucin de "z" y calculemos la media y el desvo estndar
directamente:
mean=sum(z)/n
%y la varianza:
stdev = (sum((z-mean).^2)/(n-1))^.5
%Observe que este desvo estndar est muy prximo al valor esperado de sqrt(2).

%La sustraccin debera dar exactamente el mismo desvo estndar!


pause
%Podemos comparar la distribucin de probabilidad verdadera con una distribucin
normal de igual
%media y varianza:
plot(sort(z-5),(0.5 + erf((sort(z)-mean)/stdev/sqrt(2))/2),'b')
hold of
%que ajusta los datos bastante bien.
pause
%Que sucede con la multiplicacin?. 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. debera notar es que "z" no est normalmente distribuida!
%Esto se debe a que una variable est normalmente distribuida slo si
%el error fraccional es pequeo, esto es, sigma(x)/x <<1, y lo mismo debera ocurir
para "y".
%En este caso estas condiciones no se cumplen y distorsionan la distribucin de "z".
%Podemos calcular la media y el desvo estndar de "z":
mean=sum(z)/n
%y la varianza:
stdev = (sum((z-mean).^2)/(n-1))^.5
pause
%Podemos comparar la distribucin de "z" con una distribucin normal:
plot(sort(z-6),(0.5 + erf((sort(z)-mean)/stdev/sqrt(2))/2),'b')
hold of

%Observe que esta vez la distribucin normal no es un buen ajuste.


%Esto se debe a que hemos violado la restriccin que el error en "x" e "y" sea
relativamente pequeo
%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 desvo estndar 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 grficamente esto con la distribucin de probabilidad
observada:
plot(sort(z-600),(0.5 + erf((sort(z)-mean)/stdev/sqrt(2))/2),'b')
hold of
pause
%Este desvo estndar podra haber sido calculado a partir de la frmula:
sigmax=1;
sigmay=1;
stdev = ((sigmax/20)^2+(sigmay/30)^2)^.5*600
%que suministra aproximadamente el mismo valor.
echo of
ir arriba
%Ejemplo 14: Propagacin del Error en la Regresin Lineal
clear
echo on

%En este ejemplo efectuaremos un anlisis estadstico del consumo de energa en


Los Esatados Unidos,
%discriminando segn las fuentes de energa.
%Analizaremos los datos de 1993 obtenidos del Department of Commerce's
Economic Bulletin Board.
%Los datos se presentan a continuacin:
pause
%Consumo mensual de 1993 (10^15 BTU)
%
Carbn
Gas Natural
Petrleo
% Enero......
1.660
2.357
2.697
% Febrero....
1.540
2.235
2.611
% Marzo......
1.609
2.205
2.931
% Abril......
1.442
1.731
2.708
% Mayo.......
1.448
1.338
2.753
% Junio......
1.618
1.328
2.759
% Julio......
1.840
1.388
2.894
% Agosto.....
1.823
1.405
2.890
% Septiembre.
1.580
1.315
2.848
% Octubre....
1.566
1.533
2.889
% Noviembre..
1.584
1.819
2.869
% Diciembre..
1.720
2.192
2.994

Nuclear
.631
.548
.498
.461
.538
.562
.603
.600
.534
.474
.500
.567

pause
%
%
%
%
%
%
%
%
%
%
%
%
%
%

hdrica
geotrmica
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 ledo 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 grfico podemos ver que el consumo de petrleo es prcticamnete
plano,
%el consumo de gas natural presenta picos durante el invierno, el de carbn
presenta picos
%durante el verano, y el consumo de energa nuclear picos durante el verano y el
invierno.
%Por otra parte, el consumo de energa hidroelctrica presenta picos a fines de la
primavera
%- esto corresponde a la nieve de primavera que se funde en las montaas.
%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 of
[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 ms sentido si normalizamos sus elementos con los valores del
desvo estndar
%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 ms fuertes se
presentan
%entre el carbn y la energa nuclear (la primera y cuarta columna). ESto tiene
sentido debido
%a que ambas se utilizan en la produccin de electricidad.
%El examen de la matriz de covarianza muestra que la variabilidad ms grande en el
consumo de
%energa corresponde al gas natural debido a que es fuertemente estacional.
pause
%Ahora podemos calcular algo. En primer lugar observemos la relacin del consumo
promedio
%mensual de potencia hidroelctrica y el consumo de combustibles fsiles.
%Esto corresponde a la relacin entre la quinta columna y la suma de las primeras
tres.
%Si todo lo que guardamos era la matriz de covarianza y las medias, podramos
calcular esto:
ratio=mean(5)/(sum(mean(1:3)))
%que no es muy grande!
pause
%Para calcular la varianza de la relacin necesitamos las derivadas de la relacin con
respecto
%a las variables. Hagamos esto numricamente:
echo of
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 relacin:
deriv
%Podemos utilizar esto para calcular la varianza:
ratiovar=deriv*var*deriv'
%y el desvo estandar relativo:
relstd=ratiovar^.5/ratio
%que es muy pequeo.
pause
%Dado que los datos mismos estn en la computadora, podemos calcular esto ms
exactamente:
ratiovec=energy(:,5)./sum(energy(:,1:3)')';
%donde se ha utilizado el comando traspuesta "'" y la definicin de 'sum' para
comprimir un
%poco el cdigo.
%Luego, obtenemos el valor promedio:
exactratio=sum(ratiovec)/n
%la varianza:
exactvar=(ratiovec'*ratiovec-exactratio^2*n)/(n-1)
%y el desvo estndar:
exactrelstd=exactvar^.5/exactratio
%que es prximo al calculado con la frmula de arriba.
pause
%Las desviaciones son:
ratio/exactratio-1

relstd/exactrelstd-1
%que difieren slo en un pequeo porcentaje. La discrepancia surge debido a la
variabilidad en cada
%variable que alimenta la relacin no es suficientemente pequea con respecto a
cada media.
pause
echo of
Para bajar el archivo comolementario energy hacer clik aqu
ir arriba
%Ejemplo 15: Anlisis y Error de Regresin
clear
echo on
%
%Este programa ilustra el clculo del error en la regresin lineal.
%Se ha desarrollado un proceso de separacin en el que el transporte de molculas
de soluto
%es selectivamente mejorado por un fluido oscilante a travs 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 funcin del desplazamiento tidal (la amplitud de oscilacin):
%
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:
loglog(tidal,[enhance1but,enhancetbut],'o')
xlabel( 'desplazamiento tidal')

ylabel('mejora en el transporte')
%
%Como puede verse a partir de este grfico, se tiene una dependencia tipo "ley de
potencia"
%con el deplazamiento tidal.
%Adems, la mejora para el 1-butanol es mayor que para el t-butanol, formando la
base para
%la separacin.
%
pause
%
%A partir de la teora, 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 relacin o razn de las mejoras, con sus correspondientes
lmites de
%error.
%Hagamos esto utilizando regresin 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 parmetros 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 parmetros, resolvemos utilizando las ecuaciones
normales.
%Podemos resolver el problema a travs de la relacin 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 simultneamente para los dos vectores:
x=k*bcomb;
x1=x(:,1)
xt=x(:,2)
%
pause
%
%Como puede verse, el exponente para ambos conjuntos de datos es similar y
prximo al
%valor esperado 2.0.
%Comparemos esto con los datos:
%
hold on
plot(tidal,exp(a*x))
hold of
%
%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 parmetros 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 desvo estndar del valor esperado 2.0.
%
pause
%
%Finalmente, queremos ver la relacin o razn 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
%
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 oscilacin.
%
pause
%
%Ahora para el error en cada una de las mejoras correspondientes a un
desplazamiento tidal de
%0.15.
%Podemos obtenerlo utilizando la frmula 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 frmula para el error de propagacin para una funcin de variable aleatoria.
%En este caso la mejora es exactamente la exponencial del punto pronosticado por
la curva de
%ajuste, de manera que el clculo del error es extremadamente simple.
%El error en el logaritmo de una variable aleatoria es aproximadamente igual (para
pequeas
%variaciones) al error relativo de la variable misma! Por consiguiente:
%
pause
%
relpredstd1=predvar(1)^.5
relpredstdt=predvar(2)^.5
%
%donde estas cantidades representan el desvo estndar fraccional en la mejora
%(el desvo estndar por la mejora).
%La desviacin en cada una de las mejoras pronosticadas es ms que pequea, slo
un poco ms del 5%
%de la mejora pronosticada.
%
%pause
%
%Si queremos averiguar el error en la relacin o razn, podramos utilizar la frmula
estndar
%para el error en una relacin suponiendo que la variabilidad en las dos mejoras es
independiente.
%Esto dara para el error:
%

pause
%
ratio
relratiostd=sum(predvar)^.5
%que es bastante grande considerando que el desvo con respecto a la unidad de la
razn o
%relacin en la mejora (la cual suministra la selectividad del proceso) es slo de
0.38.
%Sin embargo, este error, es incorrecto!
%Esto se debe a que existe un considerable grado de covarianza en la dispersin de
las mejoras
%observadas para el 1 y el t-butanol.
%Podemos ver esto en la grfica original de los datos, observando que, mientras que
la mejora
%en torno de cada una de las lneas ajustadas presenta bastante dispersin, la
separacin entre
%los datos del 1 y el t-butanol es notablemente consistente, lo cual indica una
relacin o razn
%constante.
%Cmo podemos manejarnos con esta covarianza?
%
pause
%
%La forma ms simple de hacer esto es volver a los datos originales y ajustar la
relacin
%o razn 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" debera ser
cero
%(la dependencia con el desplazamiento tidal se cancela) y la funcin de
modelizacin, evaluada
%para un desplazamiento tidal de 0.15 debera suministrar el valor y el error
correctos.
%Hagamos esto:
%
pause
%
%En primer lugar, determinemos un nuevo lado derecho para el problema de
regresin:
bratio=b1-bt
%Observe que la diferencia de logaritmos es equivalente a la divisin en la mejora
original.
%
%pause
%

%La matriz de regresin permanece inalterada, de manera que la solucin al


problema de
%regresin 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 of
%
%Por lo tanto, vemos a partir de la grfica que la selectividad es una funcin
ligeramente
%decreciente del desplazamiento tidal, lo cual est en discrepancia con la teora.
%Veamos si esta discrepancia es estadsticamente significativa.
%
pause
%
%Para hacer esto calculemos la variabilidad en la razn o relacin (en realidad, el
logaritmo
%de la relacin):
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 ms all de dos desvos estndar -por
encima- del valor
%observado es de alrededor del 2.5%. Observe que tambin 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:
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 ms
pequeo que el
%que obtuvimos ignorando la covarianza!!
%
pause
%
%La conclusin de todo esto es que debemos ser muy cuidadosos al analizar
nuestros datos.
%Si hubisemos analizado las pendientes originales en las grficas de la mejora
versus el
%desplazamiento tidal, con el error asociado, habramos concluido que ambas
mejoras se
%encontraban dentro de la incerteza estadstica de la pendiente de valor 2.0
estimada
%tericamente. Esta ltima parte debera conducirnos a la conclusin que la
selectividad no est
%afectada por el desplazamiento tidal.
%Un anlisis estadstico ms preciso muestra exactamente lo opuesto, esto es,
existe un pequeo
%pero significativo decrecimiento en la selectividad!
%
pause
%
%En conclusin, la estadstica es un tema ms 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 nmero de
datos es
%muy grande, el error total en el experimento estar dominado por los errores
sistemticos
%acerca de los cuales estos estudios estadsticos no pueden suministrar informacin.
pause
echo of
ir arriba

%Ejemplo 16: Mtodos de Newton y de la Secante


clear
echo on
%Este ejemplo ilustra tres tcnicas para la determinacin de las races de una
ecuacin,
%en este caso, algebraica:
%a) El mtodo de biseccin.
%b) El mtodo de Newton.
%C) El mtodo de la secante.
%En los tres casos trataremos de encontrar las races del polinomio f(x)=x^3-2.
%Para el mtodo de biseccin todo lo que tenemos que saber es que las races yacen
entre
%1 y 2. Todos los otros mtodos requieren que definamos la funcin f(x),
suministrada a travs
%del correspondiente archivo de funciones de MATLAB. Tambin requerimos (para el
mtodo de
%Newton) la derivada fprime(x).
%Definimos el intervalo:
a=1;
b=2;
pause
%En primer lugar, grafiquemos la funcin:
y=[a:(b-a)/50:b];
plot(y,f(y));
pause
hold on
%Observemos que para nuestra funcin f(a)*f(b)<0.
%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 clculo. Comencemos:
if f(a)*f(b)>0,
disp('La raz 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 of
end
end
hold of
echo on
pause
%Ahora veamos como es el error en funcin de nmero de iteraciones:
answer=2^(1/3);
plot(abs(mid-answer))
ylabel('Error absoluto')
xlabel('Nmero de iteraciones')
hold of
pause
%Si utilizamos un grfico semilogartmico, obtenemos:
plot(log10(abs(mid-answer)))
ylabel('Logaritmo del error absoluto')
xlabel('Nmero de iteraciones')
hold of
%Obsrvese que la progresin al mnimo no es estacionaria, pero el comportamiento
en este
%grfico semilogartmico 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 grfica log-log
%del error(i+1) vs error(i).
%La velocidad de convergencia r es la pendiente de la recta promedio de esta
grfica.

[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 of
%La pendiente de la recta promedio es aproximadamente 1, lo cual nos indica que el
mtodo
%de biseccin converge linealmente.
pause
%Veamos ahora el mtodo de Newton. Aqu necesitamos f(x) y fprime(x).
Comencemos el proceso de
%integracin en x(1)=1. Adems estableceremos una tolerancia para determinar
cuando hemos
%alcanzado una solucin. Por lo tanto:
tol=1e-7;
xlast=a;
%Este criterio slo se utiliza para finalizar las iteraciones si la distancia entre
%puntos sucesivos se hace demasiado pequea. En el arranque la fijamos ms
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 of
end
echo on
hold of
pause
%Observe que prcticamente no tom muchas iteraciones alcanzar la tolerancia
establecida!
%El nmero total de iteraciones fue:
i
%que es muy inferior al mtodo de biseccin.

pause
%Analicemos el error como funcin del nmero de iteraciones.
echo of
[m,nnewton]=size(x);
plot([1:nbisection],log10(abs(mid-answer)),...
[1:nnewton],log10(abs(x-answer)))
ylabel('Logaritmo del error absoluto')
xlabel('Nmero de iteraciones')
echo on
%Obsrvese que el error en el mtodo de Newton disminuye mucho ms rpido!
%Esto es consecuencia de la convergencia cuadrtica del mtodo.
pause
%Podemos estimar la velocidad de convergencia r a partir de la grfica log-log
%del error(i+1) vs error(i).
%La velocidad r es justamente la pendiente de esta curva. Por consiguiente:
echo of
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 mtodo de biseccin es aproximadamente la mitad de
la
%pendiente del error en el mtodo de Newton y adems es mucho ms ruidoso!
pause
%Por ltimo veamos el mtodo de la secante.
%En esta tcnica necesitamos dos puntos de arranque diferentes.
%Estos puntos se utilizan para estimar (a travs de una aproximacin en diferencias
finitas)
%la derivada local. sta a su vez, se utiliza en un algoritmo tipo Newton para estimar
un nuevo
%punto en la iteracin.
%Slo conservamos los dos ltimos puntos. Por lo tanto:
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 of
end
echo on
hold of
pause
%Este mtodo demanda un poco ms de iteraciones que el mtodo de Newton,
i
%pero an conserva una velocidad de convergencia superlineal.
pause
%Veamos el error:
echo of
[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('Nmero de iteraciones')
echo on
%donde la convergencia del mtodo de la secante yace entre los dos mtodos
anteriores.
pause
%Para concluir, examinemos la velocidad de convergencia del mtodo de la secante
graficando el
%log(error(i+1)) vs. log(error(i)):
echo of
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 mtodo 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
%razn o relacin dorada dado que satisface la condicin 1/r = 1-(1/r)^2. Este
nmero se
%utiliza en la tcnica de la bsqueda dorada para hallar el mnimo de funciones
unimodales.
%Haremos esto ms adelante.
echo of

Funciones del Ejemplo:


function y= f(x)
%Esta es un funcin no lineal con una raz en x = 2^(1/3) = 1.26.
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 mtodo de Newton para resolver sistemas de
ecuaciones
%no lineales.
%Para este propsito consideraremos una red simple de tuberas. Una red de
tuberas
%es muy similar a una red de resitencias elctricas, con la cada de presin entre
%los empalmes equivalente a la cada de tensin o voltaje entre nodos, y la
resistencia
%al flujo de agua equivalente a la resistencia elctrica de los cables de conexin.
%La diferencia principal es que la red elctrica es lineal y la cada de tensin
%proporcional a la corriente elctrica, mientras que la red de tuberas es no lineal.

%A elevados nmeros de Reynolds, la cada de presin en una tubera es


proporcional al cuadrado
%del caudal volumtrico.
pause
%Examinaremos que sucede al caudal de mi ducha cuando mi hijo abre la canilla del
bao
%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 travs de nuestra
casa.
%Estoy tratando de redisear el sistema de provisin de agua, pero hasta ahora slo
tengo un
%buen ejemplo de como no hay que disear una red de tuberas.
pause
%Cmo debe ser la red? Bsicamente tenemos lo siguiente:
%
%
***(canilla del lavabo)**(3)
%
*
%(1)***(filtros)***(2)*
%
*
%
***(llave de la ducha)**(4)
%
%Los nodos en esta red de tubera son:
%1) La fuente (en este caso el tanque de provisin de agua).
%2) La te colocada despus 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 prdida total de carga a lo largo de cualquier trayectoria que conecta los
mismos nodos en
%una tubera debe ser la misma. Esto significa que la prdida de (1) a (3) y de (1) a
(4) debe
%ser igual a la prdida 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 volumtrico, 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
%
%donde x(1) es el caudal volumtrico en la canilla del lavabo y x(2) el caudal en la
ducha.
%dh es el cambio es el cambio de presin 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 nmeros:
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 estimacin 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 funcin 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 incgnitas 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 of
end
echo on
hold of
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 condicin establezcamos r23=1e7 (esta situacin 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;
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 of
plot(x(1),x(2),'o')
pause(1)
end
echo on
hold of
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: Optimizacin Unidimensional
clear
echo on
%En este ejemplo demostraremos la optimizacin de una funcin utilizando los
mtodos de Newton,
%de interpolacin parablica sucesiva y de bsqueda dorada (Fibonacci modificado).
%El problema de optimizacin implica la bsqueda de un mximo o de un mnimo.
%En este ejemplo lo que buscamos es un mximo.
%
pause
%
%Supongamos que tenemos la siguiente reaccin 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 reaccin. Si la concentracin inicial de B es cero
%y la concentracin inicial de A es Ca0 tenemos la solucin:
%
% Cb = Ca0*k1/(k2-k1)*(exp(-k1*t)-exp(-k2*t))
%
%que inicialmente aumenta y disminuye con el tiempo.
%Tenemos que definir esta funcin en un archivo de funciones de MATLAB, cb.m.
%
pause
%
%Grafiquemos esta funcin:
%Elijamos valores de Ca0, k1 y k2 y hagmosle saber a la funcin Cb los valores que
toman
%estos parmetros:

global ca0 k1 k2
ca0=1;
k1=2;
k2=1;
tt=[0:.1:2];
plot(tt,cb(tt))
xlabel('Tiempo')
ylabel('Concentracin de B')
hold on
pause
%Como puede verse, existe un mximo alrededor de t = 0.7.
%Utilicemos las tres subrutinas de optimizacin discutidas en clase para determinar
este valor
%con ms exactitud.
%
pause
%
%En primer lugar, utilizamos el mtodod de Newton arrancado de t=1.
%Tenemos la frmula:
%
% x(k+1) = x(k) - f'(x(k))/f''(x(k))
%
%Por simplicidad, calcularemos las derivadas numricamente, utilizando algoritmos
en
%diferencias finitas de segundo orden:
%
pause
%
echo of
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 of
echo on
%
pause
%La solucin exacta para el mximo es:
%
texact=log(k2/k1)/(k2-k1)
%
%Por lo tanto podemos calcular la velocidad de progresin a la solucin 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 funcin el mtodo de Newton
converge
%cuadrticamente. Obsrvese que esto funciona mientras podamos determinar la
primera y segunda
%derivada con suficiente seguridad.
%Tambin se requiere comenzar donde la segunda derivada es del signo apropiado,
en este caso
%negativo. Si hubisemos comenzado en t=2 habramos capturado el mnimo para
%t --> infinito.
%
pause
%
%Veamos ahora el mtodo de interpolacin parablica sucesiva. En cada etapa
ajustamos una
%parbola a tres puntos y la utilizamos para estimar donde est el mximo o el
mnimo.
%Comenzamos:
echo of
clear t
t(1)=1;
t(2)=0;
t(3)=.5;
f=cb(t);
i=3;
plot(tt,cb(tt))
xlabel('Tiempo')
ylabel('Concentracin 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 of
echo on
%
pause
%
%Podemos calcular la velocidad de progresin a la solucin exacta:
echo of
erspi=abs(t-texact);
nspi=length(erspi);
loglog(ernm(1:nnm-1),ernm(2:nnm),'b')
hold on
loglog(erspi(1:nspi-1),erspi(2:nspi),'r')
xlabel('e(i)')
ylabel('e(i+1)')
hold of
echo on
%
pause
%
%En este caso la velocidad de progresin es ligeramente super lineal, con una
pendiente
%de 1.324. Esta progresin tambin es un poco ms aleatoria.
%
pause
%
%Finalizamos con el mtodo de Fibonacci o de la bsqueda dorada. Este mtodo
utiliza la
%relacin o razn dorada que es solucin de:
%
% r^2 = 1 - r
%
%o r = 0.6180. Esta bsqueda slo 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 mnimo. Obsrvese que la segunda
derivada
%puede cambiar de signo localmente y el mtodo ser an vlido.
%El mtodo de Newton debera fallar en esta circunstancia.
%
pause
%
%Trabajemos este mtodo. Comenzamos con algn intervalo conocido sobre el cual
la funcin
%es unimodal, digamos [0,1]. Evaluamos la funcin 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
mximo (o el
%mnimo). Entonces procedemos a la prxima etapa. La clave es que el mtodo slo
requiere una
%nueva evaluacin de la funcin en cada etapa.
%
pause
%
%Hagamos esto:
echo of
r=(sqrt(5)-1)/2;
clear t
plot(tt,cb(tt))
xlabel('Tiempo')
ylabel('Concentracin 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;
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 of
echo on
%
pause
%
%Esta tcnica converge an ms lentamente que el mtodo de interpolacin
parablica 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 of
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 of
echo on
pause
%Si comparamos estas tres tcnicas para esta funcin vemos que el mtodo de
Newton es el que
%converge ms rpido pero slo si arrancamos de un valor prximo al valor
verdadero. El mtodo

%de la bsqueda dorada es ms lento pero ms robusto -podramos haber elegido


cualquier
%intervalo conteniendo al mximo (mnimo) y eventualmente haber llegado al valor
correcto-. No
%se puede decir lo mismo de las dos tcnicas superlineales.
echo of

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
%Ejemplo 19: Optimizacin Restringida
clear
echo on
%En este ejemplo mostraremos tres enfoques para la determinacin del mnimo de
una funcin de
%dos variables.
%Utilizaremos el mtodo del gradiente (de la direccin descendente ms
pronunciada)
%y el mtodo simplex tal como est implementado en la subrutina fmins de MATLAB.
%La funcin a minimizar es:
%
% f(x)=exp((x(1)-1)^2+(x(2)-1)^2/4)
%
%Las lneas de nivel de esta funcin son elipses centradas alrededor de (1,1).
%Debemos almacenar esta funcin bajo el nombre fex.m en el directorio apropiado.
%
pause
%
%Grafiquemos las lneas de nivel de esta funcin:
echo of
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 mtodo que utilizaremos es el del gradiente (de la direccin descendente
ms
%pronunciada)
%Elegimos la direccin descendente ms pronunciada como menos el gradiente de la
funcin.
%Luego, buscamos el mnimo en esta direccin utilizando algn algoritmo.
%En este caso usaremos interpolacin parablica sucesiva.
%Comenzamos nuestras iteraciones en el punto (0.5,0.5):
%
pause
%
echo of
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 direccin de bsqueda utilizando una frmula 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);
%Buscamos ahora la raz en esa direccin:
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];
coef=a\ft;
i=i+1;
alpha(i)=-coef(2)/2/coef(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 of
echo on
%
pause
%
%El mnimo es:
x
%determinado en el siguiente nmero de iteraciones:
sdit
%
pause
%
%Comparemos esto con el mtodo simplex implementado en la subrutina de MATLAB
fmins.
%sta es mucho ms fcil de usar ya que MathWorks (la empresa que comercializa
MATLAB)
%ha hecho el trabajo por Ud.
%Tambin usaremos la funcin 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 of
func_evals=options(10)
echo on
%Se ha encontrado el mnimo, pero ha insumido casi 100 evaluaciones de la funcin.
hold of
echo of

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);
%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
evala en el lado
%izquierdo de cada panel.
%Evaluaremos la integral para diferentes discretizaciones con el propsito de
determinar el
%orden de la regla. Aplicaremos cdigo a la funcin f(x)=exp(x).
%
pause
%
%Primero fijamos el intervalo:
a=1
b=3
%y el nmero de evaluaciones de la integral,
m=5
echo of
for i=1:m;
%Seguidamente establecemos el tamao del panel:
n=2^(i-1);
dx=(b-a)/n;
x=[a:dx:b];
%ahora la funcin de ponderacin
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 of
for i=1:m,
%Establecemos el tamao del panel:
n=2^(i-1);
dx=(b-a)/n;
x=[a:dx:b];
%la funcin de ponderacin o de peso:
w=ones(1,n);
w(n+1)=.5;
w(1)=.5;
%y el resultado:
f=exp(x);
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 of
for i=1:m,
%Establecemos el tamao del panel:
n=2^(i-1);
dx=(b-a)/n;
x=[a:dx:b];
%la funcin 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 of
ir arriba
%Ejemplo 21: Estimacin 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 estn igualmente espaciados (no optimizados).
%Para la cuadratura Gaussiana:
%Comenzamos con la regla del punto medio(n=1)
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 estn 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))...
+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 clculo de la integral mucho ms exacto que aquel en el que los nodos no estn
%ptimamente espaciados.
echo of
ir arriba
%Ejemplo 22: Cuadratura Adaptativa
clear
echo on
%Este es un ejemplo de extrapolacin repetida de Richardson.
%El algoritmo se basa en la utilizacin de evaluaciones de una funcin 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 discretizacin
%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, slo depende del nmero de
evaluaciones que se
%hayan efectuado de la funcin.
%
pause
%
%Implementemos esta tcnica. Iremos hasta el quinto nivel de iteracin.
%Comenzamos construyendo las reglas trapezoidales. Operamos sobre la funcin
exp(x) en el
%intervalo [-1,1]. Luego:
n=5; %Niveles de iteracin
a=-1;
b=1;
h=(b-a)/2^n;
t(1,1)=(exp(a)+exp(b))/2;
echo of
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
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
mnimo
%nmero de llamados de la funcin. Recordemos que para 2^k paneles (con k=0,1,2
...n),
%se requieren (2^k)+1 evaluaciones de la funcin; estas evaluaciones se vuelven a
utilizar
%con (2^2k) paneles (en total (2^2k)+1 puntos). Por consiguiente, en cada etapa
slo se
%necesita evaluar la funcin en 2^k nuevos puntos.
%Si estudiamos la estructura de la expresin de arriba, vemos que sta se verifica.
%No se requieren evaluaciones adicionales de la funcin para la extrapolacin
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 mtodo de extrapolacin sucesiva de Richardson.
%Cada regla sucesiva ser de orden h^2 ms alta que aquella utilizada para
calcularla. Por lo
%tanto podemos utilizar la frmula de Simpson de 2n puntos a partir de la frmula:
%S2n = (4*T2n - Tn)/(4-1) y la siguiente frmula de orden superior:
%P2n = (16*S2n - Sn)/(16-1) y as sucesivamente:
echo of
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 rpidamente convergen al valor correcto.
%Resulta de inters 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
semilogy(abs(t(:,1)-(exp(1)-exp(-1))))
hold of
%Por consiguiente, despus de la quinta iteracin tenemos una regla que es del
orden h^12,
%y el error es del orden del error de redondeo, al menos para esta funcin uniforme.
%No podemos ir mucho ms all, dado que estamos limitados por la exactitud en la
doble
%precisin de la computadora.
%En conclusin, la regla de extrapolacin 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 estimacin del error de cuadratura. Un par G7K15 Gauss-Kronod
podra alcanzar
%un ms que elevado nivel de exactitud as como una estimacin del error con un
poco menos de
%la mitad de evaluaciones de la funcin utilizada aqu.
echo of
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 remocin de una singularidad de un integrando utilizando tcnicas
analticas.
%Utilizaremos como ejemplo la funcin cos(x)log(x) y la guardaremos en un archivo
de funcin
%MATLAB bajo el nombre 'f1.m'.
%Esta funcin posee una singularidad integrable en x=0. Queremos integrar la
funcin bajo el
%dominio [0,1]. En primer lugar grafiquemos el integrando:
y=[.0001:.01:1];
plot(y,f1(y))
%Obsrvese que el integrando presenta una dependencia funcional indeseable
alrededor de x=0.
%

pause
%
%Veamos como afecta esta situacin a la exactitud del esquema de cuadratura
Gaussiana.
%En primer lugar calculamos en forma analtica la integral (tambin podramos
obtenerla
%como una serie infinita)
%La integral es igual a -0.946083. Por lo tanto:
answer=-9.460830703672338e-01;
%Comparmosla 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 nmero de puntos
se incrementa.
%Qu sucede si removemos analticamente la singularidad? En este caso
simplemente sustraemos
%la singularidad y la integramos analticamente. Por lo tanto resolvemos
analticamente 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 funcin
%bajo el nombre 'f2.m':
plot(y,f2(y))
%Ciertamente esta funcin presenta un mejor comportamiento en las proximidades
de x=0!
%
pause
%
%Veamos ahora el error de la cuadratura Gaussiana sobre este nuevo integrando:
er2=gauss('f2',a,b)-1-answer
%Obsrvese que tuvimos que sustraer el resultado analtico 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
an ms la
%integral debido a que, mientras que la funcin (cos(x)-1)log(x) se comporta bien en
las
%proximidades del origen, sus derivadas de orden superior son todava 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
%nmero de puntos) obtendramos poco beneficio.
%Obtendramos un resultado exacto si utilizsemos sobre esta funcin un algoritmo
adaptativo
%incrementando el nmero de puntos en la regin de la singularidad, pero hay otra
forma de
%hacer esto!
%
pause
%
%La integral del integrando original puede simplicarse mediante integracin 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 integracin:
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 hubisemos removido la singularidad en forma analtica.
%La moraleja de la historia es que si tenemos alguna duda en la integracin de una
funcin,

%o sustraemos la forma asinttica que es singular o transformamos el integrando en


una forma
%que presente un mejor comportamiento (desde el punto de vista analtico).
%
pause
%
%Como ltimo ejemplo, veamos que hace con la funcin el algoritmo adaptativo.
%No podemos aplicarlo a la primera funcin debido a que 'quad' utiliza la regla de
Simpson,
%que requiere la evaluacin de la funcin en los puntos extremos. Por lo tanto
integraremos
%la segunda funcin. La llamaremos 'f2plot' debido a que le hemos agregado un
poco de grficos.
%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
hold of
%
pause
%
%Como podemos ver, la singularidad de la derivada segunda x=0 ha forzado un gran
nmero de
%evaluaciones! La exactitud del resultado final no es mucho mejor que la regla de
cuadratura
%Gaussiana de 4 puntos.
echo of

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.347854845137
45];
x=mid+xstar*(b-a)/2;

w=wstar*(b-a)/2;
igq(4)=sum(w.*feval(f,x));
ir arriba
%Ejemplo 24: Mapping e Integracin Monte Carlo
clear
echo on
%Este ejemplo muestra la tcnica denominada Integracin Monte Carlo.
%Mediante esta tcnica se integra la funcin exp(xy) sobre el crculo x^2+y^2<1.
%Adems, se ilustra la tcnica de incorporar el dominio, sobre el que realmente se
efecta la
%integracin, en el dominio cuadrado |x|<1,|y|<1 definiendo simplemente que la
funcin sea cero
%fuera del crculo pero dentro del cuadrado. El error es precisamente el desvo
estndar de la
%funcin dividido por la raz cuadrada del nmero 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 grficas. Obsrvese que las grficas muestran que el proceso
disminuye
%lentamente!. Si utilizamos un nmero grande de puntos, debemos advertir esta
situacin!
%
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 integracin. 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 integracin. Luego:

%
pause
%
echo of
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 of
%
pause
%
%Ahora calculamos la integral y el error.
%Obsrvese que la integral es exactamente el valor del promedio veces el rea de
integracin
%(incluyendo la regin 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 funcin, del grado de variacin y del
nmero
%de puntos utilizados en la evaluacin.
%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 (tngase presente que, usualmente, el
valor obtenido
%ser diferente cada vez que corramos el programa!)
echo of
ir arriba
%Ejemplo 25: Ecuaciones Diferenciales Ordinarias
clear

echo on
%En este programa demostraremos la inestabilidad de tcnicas implcitas
%en la integracin de una ecuacin diferencial stif.
%Observaremos el comportamiento de la funcin dy/dt = f(y), donde f = -a*y+b.
%Esta es la ecuacin diferencial que resultara del llenado estacionario de un reactor
%continuo tanque agitado (CSTR) con agua salada si ste inicialmente contena
%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 parmetro a).
%Echemos una mirada a la estabilidad del Mtodo de Euler. Para comenzar
consideremos:
%a=5, b=5 e y(0)=0.
%La solucin exacta de esta EDO es: y=(b/a)*(1-exp(-a*t)). Consecuentemente la
grfica de
%la funcin 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 Mtodo de Euler.
%Recordemos que la regla de Euler ajusta localmente la funcin solucin con la
%recta tangente en el punto [t(k),y(k)] y utiliza dicha recta para predecir su valor
%en t(k+1). Su expresin 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;
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 of
end;

echo on
%Como podemos ver, el procedimiento de integracin permite seguir muy bien la
evolucin
%temporal de la funcin. Esto se debe a que la funcin misma es estable y el tamao
de
%paso suficientemente pequeo de manera que el producto hJ satisface la condicin
de
%estabilidad del mtodo |1+hJ| < 1. Podemos graficar el error:
pause
hold of
plot(t,yem-(b/a)*(1-exp(-a*t)))
%A partir de este grfico vemos que el error arranca en cero, se incrementa en
magnitud y
%decrece nuevamente. El ltimo decrecimiento se debe a que la ecuacin es
estable,
%-la familia de soluciones es convergente-, de aqu que los errores anteriores sean
%eliminados.
%Comparemos este comportamiento con lo que sucedera si utilizsemos un tamao
de
%paso ms grande.
%Elijamos ahora dt = .3, que an 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 of
end;
echo on
%Esta vez el error oscila antes que ste disminuya nuevamente. El mtodo es casi
inestable,
%el producto hJ del orden de -1.5, an es mayor que el valor crtico de -2.

%Si incrementamos el paso un poco ms, ocurrirn cosas peores:


pause
hold of
dt=.4;
clear t;
clear yem;
axis(v)
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 of
end;
echo on
hold of
pause
%Veamos ahora como podemos mejorar las cosas utilizando una tcnica implcita.
%La tcnica ms simple es el Mtodo de Euler Hacia Atrs (Backward Euler), por el
%cual aproximamos la funcin 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 relacin implcita en el BE algoritmo.
%Sin embargo, para un sistema lineal, ste no es el caso. Podemos resolver ybe(k+1)
%explcitamente. 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 of
end;
echo on
hold of
pause
%El error en este caso es aproximadamente el mismo que en el Mtodo de Euler.
%Esto se debe a que elejimos dt suficientemente pequeo (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)
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 of
end;
echo on
hold of
pause
%En este caso el error es ms 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 mtodo implcito BE es absolutamente estable para
toda
%ecuacin diferencial estable, no importa cun grande sea el tamao del paso.
%Esta es la razn por la cual la mayora de las subrutinas comerciales de integracin

%tienen al menos algn carcter implcito a pesar de la dificultad de resolver la


ecuacin
%no lineal determinada por el problema implcito.
%Observemos que, usualmente, esta ecuacin no lineal es muy fcil de resolver
debido a que
%tenemos una excelente estimacin inicial para el valor de y(k+1) a partir de las
frmulas
%explcitas. Por consiguiente, esquemas rpidos tales como el mtodo de Newton
tienen una
%elevada tasa de convergencia y usualmente no nos ponen en dificultad.
hold of
echo of

ir arriba
%Ejemplo 26: Mtodos de Integracin de EDO's
clear
echo on
%Este programa muestra el uso de los siguientes mtodos de resolucin de EDO's:
%1) Euler (Forward Euler)
%2) Euler hacia Atrs (Backward Euler)
%3) Euler-Gauss (Regla del Trapecio)
%4) Runge-Kutta de 2do. orden
%5) Runge-Kutta de 4to. orden
%en la integracin de una funcin arbitraria f(y,t).
%El ejemplo es similar al desarrollado en las ltimas clases, excepto que crearemos
%una funcin de MATLAB que llamaremos "fa" para manejar la funcin f(y,t) en lugar
%de escribirla explcitamente.
%Tambin utilizaremos el mtodo de Newton para resolver las partes implcitas de
los
%mtodos de Euler-Gauss y Backward Euler.
pause
%La ecuacin especfica que integraremos es la correspondiente al oscilador forzado
%sin amortiguamiento: y"=-y + a*cos(w*t).
%La funcin de forzamiento depende de dos parmetros: "a" y "w".
%En razn de pasar estos dos parmetros a la funcin de MATLAB, simplemente los
%declararemos parmetros globales tanto en el programa principal (en el main
script,
%esto es, en este archivo) como en la funcin 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 integracin sea tan general como sea posible.
pause

global a w
a = 1.5;
w = 2;
dt = 0.1;
%Para comenzar, veamos como es esta funcin para este conjunto especfico de
parmetros.
%La respuesta exacta viene expresada a travs de la funcin: 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 Mtodo de Euler clsico:
y(1)=1;
y(2)=0;
t=0;
i=1;
plot(t,y(1),'o')
echo of
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 of
pause
%Como podemos ver, el Mtodo de Euler arranca siguiendo la funcin 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
%Tambin podemos ver el mtodo Backward Euler. En este caso, el mtodo es
implcito,
%por consiguiente tenemos que encontrar la raz de una ecuacin (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 of
while t<20,
dy=1;
ybe=y+dt*fa(y,t); %Comenzamos estimando con el mtodo de Euler explcito.
while sum(abs(dy))>tol,
%Esta es la funcin que debera ser cero:
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 funcin 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 of
pause
%Este mtodo traza la funcin como el mtodo explcito de Euler.
%La magnitud del error permanece acotada, pero todava crece con el tiempo.
%Podemos graficar los dos errores juntos:
plot(erem)

xlabel('t')
ylabel('error')
hold on
plot(erbe,'r')
hold of
%Como podemos ver, el mtodo Backward Euler no es una gran mejora.
%Esto se debe a que la ecuacin diferencial misma no es stif, sino que slo es
%neutralmente estable sin amortiguamiento.
%Cualquier valor finito de dt conducir a inestabilidad numrica.
pause
%Veamos ahora el Mtodo de Gauss-Euler (o regla del trapecio).
%Este mtodo tambin es implcito, por lo tanto, nuevamente, utilizaremos el
mtodo
%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 of
while t<20,
dy=1;
ytr=y+dt*fa(y,t);
while sum(abs(dy))>tol,
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 of
pause
%La regla del trapecio realiza un mejor trabajo de seguimiento de la solucin,
%como uno esperara. El error an crece con el tiempo, sin embargo, debido a la
%naturaleza implcita de la regla es bastante lento.
%Comparemos esta regla con una de las reglas explcitas ms simples, el mtodo 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 of
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 of
pause
%Aqu tambin el mtodo traza la funcin solucin bastante bien con un error
ligeramente
%ms grande.
%Podemos ver esto un poco mejor si graficamos los dos errores simultneamente.
%En primer lugar el del RK de 2do. orden:
plot(er2s)
xlabel('t')
ylabel('error')
pause
%Luego el de Gauss-Euler:
hold on

plot(ertr,'r')
hold of
pause
%A partir de este grfico resulta claro que el error del Mtodo de Euler-Gauss
%es aproximadamente la mitad del que suministra la tcnica de Runge-Kutta de 2do.
orden.
%La discrepancia sera ms grande (y mucho) para un problema stif en el que el
mtodo
%explcito debera fallar, pero el mtodo implcito sera estable.
pause
%Volvamos ahora a nuestra regla final, el mtodo 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 of
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 of
pause
%Este mtodo tambin traza la funcin muy bien, pero ahora el error es muy
pequeo,
%suministrando:
plot(er4s)
xlabel('tiempo')
ylabel('error')
%que es varios rdenes de magnitud ms pequeo que el error en el mtodo
%de R-K de segundo orden!
pause

hold of
echo of
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
%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 integracin. Bsicamente, queremos poner ms puntos en la
regin
%donde la curvatura de la funcin es grande, de la misma manera como se haca 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 poblacin de conejos est representada por y(1) y la poblacin
de
%zorros por y(2).
pause
%Las poblaciones variarn 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 informacin 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 poblacin de conejos:
plot(t,y(:,1),'b')
hold on
pause
%luego la de zorros:
plot(t,y(:,2),'r')
hold of
pause
%Como podemos ver, la funcin es ms que cclica con la poblacin de zorros
%creciendo lentamente al principio y la poblacin de conejos creciendo
drsticamente
%despus que la poblacin de zorros prcticamente ha desaparecido.
%Podemos examinar la evolucin del tamao 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 tamao del
paso donde
%cada una de las funciones tienen un elevado grado de curvatura.
hold of
echo of

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);
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 inclinacin que debera adoptar
%un can 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 propsito seguiremos la trayectoria de la bala disparada por el can.
%Conocemos desde donde sta parte (el lugar donde est ubicado el can) y su
%velocidad inicial (determinada por la cantidad de plvora o propelente utilizado),
%y queremos averiguar que ngulo de elevacin se debe dar al can 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 evolucin en el tiempo de la bala en la funcin cannonball.m.
pause
%En primer lugar especificamos la velocidad inicial(usaremos ingreso manual de
datos).
%Velocidad inicial en m/seg (mdulo):
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 discretizacin (seg.):
dt = input ('ingrese tiempo de discretizacin = ')
%Graficamos la posicin del blanco:
plot(dist,height,'x')
hold on
pause
%Finalmente ingresamos el ngulo de elevacin del can (en radianes). Si
ingresamos el valor 0
%el programa efecta el ajuste en forma automtica.
%Si los valores son distintos de cero, el ajuste lo hacemos en forma manual por
simple inspeccin
%de la grfica:
theta=input('ingrese ngulo de elevacin del can = ');
%
echo of
%
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 mtodo de Runge-Kutta de tercer orden:
t=0;
while dist>y(1),
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 elevacin del can = ');
end;
hold of
echo on
%Este programa ilustra el ajuste manual del shooting method.
%Frecuentemente el ajuste manual es bastante efectivo si hay
%solo un parmetro para jugar.
%Ciertamente esto nos permite tener una buena idea de la funcin
%y obtener una estimacin del valor correcto del parmetro de disparo.
%Una manera ms elegante de hacer esto es utilizar una tcnica
%de determinacin de races.
%Para este propsito 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 integracin en una funcin
%que devuelve la diferencia entre la altura de la bala de can y la del blanco
%a la distancia del blanco.
%Llamaremos a esta funcin deltah(theta).
%La rutina de MATLAB fzero ajustar theta hasta que el valor devuelto
%por esta funcin 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 parmetros de ajuste,
%pero podemos resolver esto mediante un procedimiento de minimizacin 2D
%donde la funcin a minimizarse es la suma de los cuadrados de las desviaciones.
%Si Ud. hace esto asegrese de escalar todo cuidadosamente.
hold of
echo of

Funciones del Ejemplo:

function dh= deltah(theta)


%Esta funcin 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 despus del proceso de integracin debemos
%debemos efectuar una interpolacin para obtener la altura correcta
%de la bala a la distancia horizontal estipulada.
%
global dist v0 dt height
%
%Tenemos las posicin inicial:
y(1)=0;
y(2)=0;
%y la velocidad inicial
y(3)=v0*cos(theta);
y(4)=v0*sin(theta);
plot(y(1),y(2),'o')
%
%Para el procedimiento de integracin usamos el mtodo 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 interpolacin.
%El tiempo que la bala pas por el blanco es un poco menor (debido al paso
temporal de
%integracin) 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
posicin
%del blanco mediante desarollo en serie de Taylor hacia atrs):
delta=-(y(1)-dist)/(y(1)-ylast(1))*dt;

%Calculamos la altura final de la bala utilizando tres trminos del desarrollo hacia
atrs en
%serie de Taylor alrededor del ltimo tiempo calculado, para obtener una medida
ms 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 funcin 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 parmetros:
m=5;
%Masa de la bala (kg)
cd=0.44;
%Coeficiente de arrastre
a=0.03;
%Seccin transversal de la bala (m^2)
rho=1.0;
%Densidad del aire (kg/m^3)
g=9.8; %Aceleracin 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 direccin.
ir arriba

2001-2002 modeladoeningenieria.edu.ar

Vous aimerez peut-être aussi