Metodo de Biseccion - Escuela de Ingeniería Electrónica

Anuncio
INSTITUTO TECNOLÓGICO DE COSTA RICA
ESCUELA DE INGENIERÍA ELECTRÓNICA
Métodos Numéricos
(CM3201)
Método de la Bisección
Profesor: Ing. Marvin Hernández C.
II semestre 2006
MÉTODO DE BISECCIÓN PARA CALCULO DE RAICES
Es un método cerrado o de intervalos que se utiliza para calcular las raíces de
ecuaciones, cuya característica es que las funciones cambian de signo en la
vecindad de la raíz. Para esta técnica se requiere proporcionar dos valores
iniciales para la raíz.
Definición :
En general, si f(x) es real y continua en el intervalo que va desde X L a XU, y f(XL) y
f(XU) tienen signos opuestos, es decir,
f ( X L ) * f ( XU )  0
entonces hay al menos una raíz real entre XL y XU.
Los métodos de búsqueda incremental aprovechan esta característica localizando
un intervalo en el que la función cambie de signo. Entonces, la localización del
cambio de signo (y, en consecuencia, de la raíz) se logra con más exactitud al
dividir el intervalo en varios subintervalos. Se investiga estos subintervalos para
encontrar el cambio de signo. El proceso se repite y la aproximación a la raíz
mejora cada vez más en la medida que los subintervalos se dividen en intervalos
cada vez más pequeños .
En numero de iteraciones para el cálculo del valor de XR (valor para el cual la
función f(XR) = 0) mas preciso; se definirá mediante el criterio de error relativo
porcentual a, donde:
Xr nuevo  Xr anterior
a 
*100%
Xr nuevo
ó
a 
XU  X L
* 100%
XU  X L
Cuando a es menor que un valor previamente prefijado s, termina el cálculo
Algoritmo
El algoritmo para el método de bisección se puede resumir en los siguientes
pasos :
Paso 1 :
Elija valores iniciales inferior, XL, y superior Xu, que encierran la raíz, de forma
tal que la función cambie de signo en el intervalo. Esto se verifica comprobando
que f(XL)* f(XU) < 0.
Paso 2:
Una aproximación de la raíz XR se determina mediante :
X R
X L  XU
XL
Paso 3:
Realice las siguientes evaluaciones para determinar en qué subintervalo está la
raíz :
a)
Si f(XL)* f(XU) < 0, entonces la raíz se encuentra dentro del subintervalo
inferior o izquierdo. Por lo tanto, haga XU = XR y vuelva al paso 2.
b)
Si f(XL)* f(XU) > 0, entonces la raíz se encuentra dentro del subintervalo
superior o derecho. Por lo tanto, haga XL = XR y vuelva al paso 2.
c)
Si f(XL)* f(XU) = 0, entonces la raíz es igual a XR; termina el cálculo.
Programa
Para desarrollar el programa se utilizó el Software MATLAB y las herramientas
para implementar los m-files.
Programa para ejecutar el método de bisección, evaluando la función
particular Paracaídas.
Ejemplo1
Se desea determinar el coeficiente de arrastre c necesario para que un
paracaidista de masa m = 68 . 1Kg tenga una velocidad de 40 m/s después de una
caída libre de t = 10 s. La aceleración de la gravedad es 9.8m/s2 .
Solución :
El problema se resuelve determinando la raíz de la ecuación (1)
f (c ) 
g *m
(1  e ( c / m )*t )  V  (1)
c
Al sustituir los parámetros en(1) se obtiene :
f (c ) 
667 .38
(1  e 0.146843 c )  40
c
La raíz de la ecuación 1 se define para los valores de c, que hagan f(c) = 0
A continuación se muestra el código de programación para ejecutar el método
iterativo de bisección para obtener la raíz de la ecuación 1, donde f(c) = 0.
Ejemplo1
xl = input('Limite inferior del intervalo : ');
xu = input('Limite superior del intervalo : ');
es = input('Criterio de terminacion : ');
imax = input('Numero de iteraciones propuesto : ');
Biseccion (xl, xu, es, imax);
function Biseccion = f(xl, xu, es, imax)
ea = 0;
xr = 0;
iter = 0;
xrold = 0;
while (1)
xrold = xr;
xr = ( xl + xu ) / 2;
iter = iter + 1;
if xr ~= 0
ea = abs (( xr - xrold) / xr ) * 100 ;
end
test = Paracaidista (xl) * Paracaidista (xr);
if test < 0
xu = xr;
elseif test > 0
xl = xr;
else
ea = 0;
end
if (ea < es)||( iter >= imax), break, end
end
Biseccion = xr
Iteraciones = iter
Evaluacion = abs(Paracaidista (xr))
end
function Paracaidista = f (c)
p = (( 667.38 / c ) * ( 1 - exp ( -0.146843 * c ))) - 40 ;
Paracaidista = p;
Resultados
Para este caso el algoritmo de Bisección, tiene 2 criterios de paro que están
definidos por :
-
-
a es menor que un valor previamente prefijado s
El numero de iteraciones que el usuario quiere que se realicen para el
cálculo del valor de la raíz
Se define que, el paro se realice cuando se presente cualquiera de las 2
condiciones anteriores. Si se requiere bastante precisión se puede escoger un s
bastante pequeño ó bien dar un numero de iteraciones suficientemente grande.
Caso 1 : s = 0.5 , Iteraciones = 10
Caso 2 : s = 0.00001 , Iteraciones = 10
Caso 3 : s = 0.00001 , Iteraciones = 3
Note que a medida que se disminuye el número de iteraciones ó el criterio s , el
valor de c para la raíz se hace más impreciso, lo cual se puede observar en el
resultado de la evaluación de f(c). Si s ó el número de iteraciones se aumenta,
el valor de c se vuelve más preciso, tal como se muestra en el caso 4.
Caso 4 : s = 0.000001 , Iteraciones = 2000
Gráfica de la función
Para, calcular raíces de otras funciones, lo único que hay que hacer es definir
otra función que cumpla con los requisitos dados en la definición. El programa de
bisección sería el mismo function Biseccion = f(xl, xu, es, imax); y lo único que habría
que redefinir es la función a la cual se le van a calcular las raíces test = Paracaidista
(xl) * Paracaidista (xr);
Para este caso a test se le asignaría otra función f previamente definida
test = f (xl) * f (xr);
Donde f puede ser
definición anterior
un polinomio; o cualquier función que cumpla con la
Ejemplo 2 :
Hallar la raíz de f(x)= x2-2 en el intervalo [0,2].
Como f(x) es continua en el intervalo dado y f(0) f(2)<0, podemos asegurar que
existe una raiz, y como f(x) es diferenciable con derivada continua siendo f’(x) >
0 en [0,2], la raíz es única.
El valor teórico para la raíz es : X  2  1.4114...
Ejemplo2
xl = input('Limite inferior del intervalo : ');
xu = input('Limite superior del intervalo : ');
es = input('Criterio de terminacion : ');
imax = input('Numero de iteraciones propuesto : ');
Biseccion1 (xl, xu, es, imax);
function Biseccion1 = f(xl, xu, es, imax)
ea = 0;
xr = 0;
iter = 0;
xrold = 0;
while (1)
xrold = xr;
xr = ( xl + xu ) / 2;
iter = iter + 1;
if xr ~= 0
ea = abs (( xr - xrold) / xr ) * 100 ;
end
test = Polinomio (xl) * Polinomio (xr);
if test < 0
xu = xr;
elseif test > 0
xl = xr;
else
ea = 0;
end
if (ea < es)||( iter >= imax), break, end
end
Biseccion = xr
Iteraciones = iter
Evaluacion = abs(Polinomio (xr))
end
function Polinomio = f (c)
p = exp(2*log(abs(c)))-2;
Polinomio = p;
Resultados
Caso 1 : s = 0.5 , Iteraciones = 10
Caso 2 : s = 0.000005, iteraciones = 1000
Gráfica de la función
Descargar