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