Documente Academic
Documente Profesional
Documente Cultură
%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.
%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
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
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))]';
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
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
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
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).
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
%
%
%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
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
%
%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
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
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
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,
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.
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
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
%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