Busqueda de Raices MN
description
Transcript of Busqueda de Raices MN
-
MTODOS NUMRICOS: APLICACIONES DE BSQUEDA DE RAICES DE UNA FUNCIN
Algunas tcnicas para resolver ecuaciones diferenciales describiendo la deflexin de una viga
uniforme, sujeta a una carga que es proporcional a la distancia desde un extremo de la viga,
requieren las races positivas de una funcin f(x). Para mantener los valores funcionales dentro de
un rango razonable, es mejor considerar el problema equivalente a encontrar los ceros de una
funcin g(x).
1) Para la viga voladiza (un extremo fijo y otro libre) los parmetros requeridos son las races
positivas de f(x) = cosh x cos x + 1; para mantener valores funcionales dentro de un rango
razonable, considere los ceros de g(x) = cos x + 1/cosh x. Encuentre los primeros cinco ceros.
Solucin:
Graficas de funciones:
f(x) = cosh x cos x + 1
-
g(x) = cos x + 1/cosh x
Se considerar el intervalo [0,15] del dominio pues es donde se observan se encuentran los
primeros cinco ceros positivos.
Se utilizar el mtodo de la biseccin, de acuerdo a ste se deben utilizar como valores iniciales
intervalos que contengan la raz, A fin de ir ubicando cada raz se utilizarn los intervalos [1,3],
[4,6], [7,9], [10,12], [13,15] para cada cero de la funcin g(x).Se escogen porque se observa en la
grfica que en cada uno de esos intervalos la funcin cambia de signo, adems se encuentran entre
mximos y mnimos para garantizar la convergencia a cada cero de la funcin.
Se program en scilab el mtodo de la biseccin y se aplic a cada intervalo.
En scilab se defini la funcin g(x) de la siguiente manera:
function y=f(x)
y=1./cosh(x) + cos(x);
endfunction
-
El cdigo scilab para el mtodo de la biseccin es:
function xr=biseccion(xai, xbi, tol)
i=1;
ea(1)=100;
if f(xai)*f(xbi) < 0
xa(1)=xai;
xb(1)=xbi;
xr(1)=(xa(1)+xb(1))/2;
printf('It.\t\t Xa\t\t Xr\t\t Xb\t Error \n');
printf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
while abs(ea(i)) >= tol
if f(xa(i))*f(xr(i))< 0
xa(i+1)=xa(i);
xb(i+1)=xr(i);
end
if f(xa(i))*f(xr(i))> 0
xa(i+1)=xr(i);
xb(i+1)=xb(i);
end
xr(i+1)=(xa(i+1)+xb(i+1))/2;
ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1))*100);
printf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f
\n',i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
i=i+1;
end
else
xr=%nan;
printf('No existe una raiz en ese intervalo');
end
endfunction
-
A continuacin se muestran las ejecuciones para cada intervalo, con una tolerancia de 0.1%:
Intervalo [1,3]:
Intervalo [4,6]:
Intervalo [7,9]:
-->biseccion(7,9,0.1);
It. Xa Xr Xb Error
1 7.0000000 8.0000000 9.0000000
2 7.0000000 7.5000000 8.0000000 6.667
3 7.5000000 7.7500000 8.0000000 3.226
4 7.7500000 7.8750000 8.0000000 1.587
5 7.7500000 7.8125000 7.8750000 0.800
6 7.8125000 7.8437500 7.8750000 0.398
7 7.8437500 7.8593750 7.8750000 0.199
8 7.8437500 7.8515625 7.8593750 0.100
-->biseccion(4,6,0.1);
It. Xa Xr Xb Error
1 4.0000000 5.0000000 6.0000000
2 4.0000000 4.5000000 5.0000000 11.111
3 4.5000000 4.7500000 5.0000000 5.263
4 4.5000000 4.6250000 4.7500000 2.703
5 4.6250000 4.6875000 4.7500000 1.333
6 4.6875000 4.7187500 4.7500000 0.662
7 4.6875000 4.7031250 4.7187500 0.332
8 4.6875000 4.6953125 4.7031250 0.166
9 4.6875000 4.6914063 4.6953125 0.083
-->biseccion(1,3,0.1);
It. Xa Xr Xb Error
1 1.0000000 2.0000000 3.0000000
2 1.0000000 1.5000000 2.0000000 33.333
3 1.5000000 1.7500000 2.0000000 14.286
4 1.7500000 1.8750000 2.0000000 6.667
5 1.8750000 1.9375000 2.0000000 3.226
6 1.8750000 1.9062500 1.9375000 1.639
7 1.8750000 1.8906250 1.9062500 0.826
8 1.8750000 1.8828125 1.8906250 0.415
9 1.8750000 1.8789063 1.8828125 0.208
10 1.8750000 1.8769531 1.8789063 0.104
11 1.8750000 1.8759766 1.8769531 0.052
-
Intervalo [10,12]:
Intervalo [13,15]:
Tabla resumen de resultados
primeros ceros de la funcin g(x) = cos x + 1/cosh x con tolerancia de 0.1%
Intervalo [1,3] [4,6] [7,9] [10,12] [13,15]
Raz de la
funcin g(x)
1.8759766 4.6914063 7.8515625 10.9921875 14.1328125
Nmero de
iteraciones
11 9 8 8 8
-->biseccion(13,15,0.1);
It. Xa Xr Xb Error
1 13.0000000 14.0000000 15.0000000
2 14.0000000 14.5000000 15.0000000 3.448
3 14.0000000 14.2500000 14.5000000 1.754
4 14.0000000 14.1250000 14.2500000 0.885
5 14.1250000 14.1875000 14.2500000 0.441
6 14.1250000 14.1562500 14.1875000 0.221
7 14.1250000 14.1406250 14.1562500 0.110
8 14.1250000 14.1328125 14.1406250 0.055
-->biseccion(10,12,0.1);
It. Xa Xr Xb Error
1 10.0000000 11.0000000 12.0000000
2 10.0000000 10.5000000 11.0000000 4.762
3 10.5000000 10.7500000 11.0000000 2.326
4 10.7500000 10.8750000 11.0000000 1.149
5 10.8750000 10.9375000 11.0000000 0.571
6 10.9375000 10.9687500 11.0000000 0.285
7 10.9687500 10.9843750 11.0000000 0.142
8 10.9843750 10.9921875 11.0000000 0.071
-
2) El desplazamiento de una estructura est definida por la siguiente ecuacin para una oscilacin
amortiguada:
y = 8e-kt
cos t
donde k=0,5 y =3.
a) Use el mtodo grfico para hacer una primera estimacin del tiempo requerido para que el
desplazamiento disminuya a 4.
b) Use el mtodo de Newton-Raphson para determinar la raz con error de tolerancia del 0,01%.
c) Repita b) con el mtodo de la secante.
Solucin:
a) Grfica de la funcin:
y = 8e-kt
cos t
Como se desea determinar el tiempo t en el cual el desplazamiento es 4, definimos una funcin f(x)
a la cual le calcularemos el cero correspondiente, de la siguiente manera:
-
f(t) = 8e-kt
cos t-4
Para el mtodo de Newton-Raphson hace falta la derivada de sta funcin:
Derivada de la funcin
f(t) = 8e-kt
cos t-4
En la grfica se puede observar que el primer instante de tiempo en el cual el desplazamiento
disminuye a 4 est en el intervalo [0.0, 0.5], el cual ser el que se aplique para los mtodos de
bsqueda de ceros. Se selecciona ste intervalo porque es donde est contenido el desplazamiento
de cuatro y adems est entre un mximo y un mnimo de tal manera que garantiza tendencia a la
convergencia.
En scilab se defini la funcin f(x) de la siguiente manera:
Y su derivada:
function y=df(x)
k=0.5;
w=3.0;
y=-8*exp(-k*x)*(w*sin(w*x)+k*cos(w*x));
endfunction
function y=f(x)
k=0.5;
w=3.0;
y=8*exp(-k*x)*cos(w*x)-4;
endfunction
-
b) Se program en scilab el mtodo de Newton-Raphson y se aplic con el valor inicial del
intervalo.
A continuacin se muestra la ejecucin para el valor inicial del intervalo, con una tolerancia de
0.01%:
Intervalo [0.1, 0.5]:
Observacin: se comienza en t=0.1 para evitar una divisin por cero en el clculo del error segn el
cdigo del programa.
-->newtonraphson(0.1,0.01);
i X(i) Error aprox (i)
0 0.1000000 100.000
1 0.4149772 75.902
2 0.3166610 31.048
3 0.3151672 0.474
4 0.3151661 0.000
function x=newtonraphson(x0, tol);
i=1;
ea(1)=100;
x(1)=x0;
while abs(ea(i))>=tol;
x(i+1)=x(i)-f(x(i))/df(x(i));
ea(i+1)=abs((x(i+1)-x(i))/x(i+1)*100);
i=i+1;
end
printf(' i \t X(i) Error aprox (i) \n');
for j=1:i;
printf('%2d \t %11.7f \t %7.3f \n',j-1,x(j),ea(j));
end
endfunction
-
c) Se program en scilab el mtodo de la secante y se aplic con el valor inicial del intervalo.
A continuacin se muestra la ejecucin para el intervalo [0.1, 0.5], con una tolerancia de 0.01%:
Intervalo [0.1, 0.5]:
Observacin: se comienza en t=0.1 para evitar una divisin por cero en el clculo del error segn el
cdigo del programa.
-->secante(0.1,0.5,0.01);
i x(i) Error aprox (i)
0 0.1000000
1 0.5000000 100.000
2 0.2915269 71.511
3 0.3142147 7.220
4 0.3151783 0.306
5 0.3151661 0.004
function x=secante(x0, x1, tol)
j=2;
i=1;
x(1)=x0;
x(2)=x1;
ea(i)=100;
while abs(ea(i))>=tol
x(j+1)=(x(j-1)*f(x(j))-x(j)*f(x(j-1)))/(f(x(j))-f(x(j-1)));
ea(i+1)=abs((x(j+1)-x(j))/x(j+1))*100;
j=j+1;
i=i+1;
end
printf(' i \t\t x(i) \t Error aprox (i) \n');
printf('%2d \t %11.7f \t \n',0,x(1));
for k=2:j;
printf('%2d \t %11.7f \t %7.3f \n',k-1,x(k),ea(k-1));
end
endfunction
-
Resumen de resultados
Mtodo aplicado Raz de la funcin f(x) Nmero de iteraciones Error de aproximacin
(%)
Newton-Raphson 0.3151661 4 0.000
Secante 0.3151661 5 0.001
La estructura alcanza un desplazamiento de 4 al instante t=0.3151661.