Está en la página 1de 14

Mtodo de la Biseccin o punto medio

Ing Yamil Armando Cerquera Rojas yacerque@gmail.com Especialista en Sistemas Universidad Nacional Docente Universidad Surcolombiana Neiva - Huila

RACES DE ECUACIONES

Son mltiples los problemas en ciencia e ingeniera que se pueden modelar matemticamente como una ecuacin f(x) = 0, siendo f una funcin dependiente de la variable x. Los valores de x soluciones de dicha ecuacin son llamados ceros de la funcin f denominados generalmente races de la ecuacin o ceros de la funcin. Es bien conocido que existen un sinnmero de ecuaciones de la forma f ( x) = 0 que admiten una solucin expresable en funcin de los coeficientes de la ecuacin, por ejemplo si f es un polinomio de segundo grado. Sin embargo, existen otras ecuaciones que no admiten que su solucin pueda ser expresada a travs de funciones elementales. Si f ( x ) = sin( x ) e , entonces la ecuacin f ( x) = 0 no puede resolverse de forma analtica. Sin embargo, por un sencillo argumento grfico, es fcil comprobar que esta ecuacin tiene infinitas soluciones negativas y ninguna positiva. Estas soluciones son las abcisas de los puntos de corte entre las grficas de las funciones
x

sin(x)

ex

tal como se ilustra en l fig. 1.

Codigo para Matlab x=-8*pi:0.1:0; y1=exp(x); y2=sin(x); plot(x,y1,x,y2); grid on

Fig. 1 Grfica de

sin(x)

contra

Del eje x, consideradas

e x con n intercepciones en la parte negativa x races de la ecuacin f ( x ) = sin( x ) e

En este apartado se estudia una de las tcnicas de modelado o anlisis numrico que permiten abordar este tipo de problemas. Es importante destacar el hecho de que las tcnicas que se estudian son siempre iterativas, es decir, se parte de una aproximacin inicial x0 de la raz real x de f(x) y posteriormente se construye una sucesin de nmeros reales, que se consideran aproximaciones a la raz verdadera,
_

{x n }, n N , y que converja hacia x cuando n .

Descripcin
El mtodo biseccin o de mitad es uno de los mtodos numricos ms sencillos de comprender y muy verstil para encontrar una raz real en un intervalo en el que existe una raz de la ecuacin dada, sin embargo, el nmero de clculos aumenta sustancialmente a medida que se desea mayor exactitud. Su singular ventaja consiste en que funciona incluso con funciones no analticas; sin embargo, slo se debe utilizar el mtodo despus de un anlisis grfico. El teorema de Bolzano estableca condiciones suficientes para la existencia de al menos un cero de una funcin continua. Teorema 1. (Teorema de Bolzano). Sea f (x) continua en cada punto del intervalo cerrado [a; b] y suponga que f(a) y f(b) tienen signos opuestos ( f (a) * f (b)) < 0 . Existe entonces, al menos, un c ( a, b) tal que f (c) = 0 . El procedimiento mitad se basa en el teorema de Bolzano que dice que si se tiene una funcin y = f (x) , de variable real y continua en el intervalo (a, b), y el signo de la funcin en el extremo a es distinto al signo de la funcin en el extremo b del intervalo, existe al menos un valor c dentro de dicho intervalo (a, b) tal que f(c)=0, c es por tanto, la raz buscada, vase la figura.

Fig. 2 Punto medio m y raz c a calcular.

Suponga una ecuacin f ( x) = 0 Para hallar la raz de la funcin en el intervalo (a, b), se divide el intervalo en la mitad.

m = ( a + b) / 2

Puede ocurrir uno de estos tres casos:


Si f(m)=0 entonces m es la raz buscada Si f(a) y f(m) tienen signos contrarios, como en la figura, la raz buscada est en el intervalo (a, m).

Si no se cumple la condicin anterior, f(b) y f(m) tendran signos contrarios y la raz estara en el intervalo (m, b).

El nuevo intervalo reducido se divide por la mitad y se procede de igual forma. Finalmente, en una cierta etapa del proceso se tendr bien la raz exacta de la funcin f(x), o una secuencia de intervalos cada vez ms reducidos (a1, b1), (a2, b2), .... (ai, bi)... tal que

f (an ) f (bn ) 0

bn a n =

1 (b a ) 2n

Como los puntos extremos de la izquierda a1, a2, ... an, ...forman una sucesin creciente y acotada, y los de la derecha b1, b2, ... bn, ... una sucesin acotada decreciente, existe un lmite comn que es la raz buscada.

= Lim a n = Lim bn
n n

Las condiciones de terminacin del proceso


1. El ordenador trabaja con nmeros de precisin limitada, por lo que se debe colocar un criterio que establezca cuando la funcin f (x) se considera nula. Se dir que f (x) es nula cuando el valor absoluto de f (x) sea menor que una cantidad pequea pero no nula.

f ( x) < 1
2. No se puede programar un proceso indefinido, es preciso, que la rutina repetitiva acabe en un momento dado. El criterio empleado es el siguiente

an bn < 2 m
Siendo 2 cierta cantidad prefijada. La raz se encuentra en el intervalo (an, bn) y m es el punto medio de dicho intervalo. 3. El tercer criterio de terminacin establece, que el proceso de bsqueda de la raz se interrumpir despus de un nmero prefijado de iteraciones, notificndose al usuario que no se ha encontrado la raz de la funcin con las condiciones fijadas en los puntos 1 y 2. Para poder codificar este procedimiento se ha de seguir los siguientes pasos: 1. Se parte de un intervalo (a, b) en el que la funcin f (x) cambia de signo 2. Se calcula m, abscisa mitad del intervalo mediante m=(a+b)/2 3. Se verifican las condiciones de terminacin

4. Si f(a) y f(m) tienen signos contrarios, como se ve en la figura, la raz est en el intervalo (a, m), entonces b toma el valor de m. 5. Si la condicin anterior no es cierta, la raz se encuentra en el intervalo (m, b), por lo que a tomar el valor de m. 6. Se repite el proceso hasta que se cumple una u otra condicin de terminacin
do { m=(a+b)/2; ym=f(m); if(Math.abs(ym)<CERO) break; if(Math.abs((a-b)/m)<ERROR) break; if((f(a)*ym)<0) b=m; else a=m; iter++; }while(iter<MAXITER);

[Fig. 2]

Suponga que tiene una funcin continua en el intervalo [a,b], tal que f ( a ) y f (b) son de signos opuestos f (a) f (b) < 0 . En ese caso se sabe que existe por lo menos una raz en el intervalo [a,b]. En realidad se debe considerar el caso de que tenga un nmero impar de races. Si el nmero de races es par, entonces los extremos del intervalo tienen el mismo signo, y no se tiene evidencia de la existencia de races en el intervalo. Por ejemplo el caso de la figura Fig 2b muestra una funcin con una raz doble que no sera detectado. Obsrvese el hecho de que no alcanza con que la funcin presente distinto signo en los extremos del intervalo, sino que tambin debe ser continua en el mismo tal como se ilustra en la Fig. 2c. Para simplificar se asume que en el intervalo [a,b] existe una raz si la condicin f ( a ) * f (b) < 0 . Partiendo de esta suposicin, se divide el intervalo a la mitad m = (a + b) / 2 , generando dos subintervalos [a,p] y [p,b]. Evalu los productos f (a) f (m) y f (m) f (b) y seleccione como nuevo intervalo aquel para el cual el producto correspondiente es negativo. De esta manera se tiene un intervalo ms pequeo en el cual se encuentra la raz buscada. Se repite este procedimiento en forma iterativa, hasta que haya acotado por izquierda y por derecha la raz buscada (ver figura 4).

[Fig. 4]

Si existieran ms de una raz en el intervalo (fig 2a), entonces se puede dar el caso de que una de ellas queda aislada, o bien en algn momento del procedimiento iterativo aparecern los dos productos f (a) f (m) y f ( p) f (m) con el mismo signo. En ese caso se debe detener las iteraciones y buscar otro intervalo para comenzar de nuevo el procedimiento. Tambin es til verificar que f (mi ) f (mi 1 ) 0 Para descartar casos como el de la fig 2c. n Luego de n iteraciones el tamao del intervalo es: (b a ) / 2 Donde a y b corresponden a los extremos del intervalo original. Si se toma como tolerancia del error al nmero , el nmero de iteraciones necesarias para satisfacer este error es:

(b a) ba n log 2 n 2
Un inconveniente de este mtodo es que la convergencia es lenta, aunque es simple y robusto, adems de fcil de implementar.

Explicacin General del mtodo:


El mtodo de la biseccin se basa en el hecho de que, cuando un intervalo [a,c] tiene una raz, el signo de y (x) en los extremos es distinto, o sea, f (a ) * f (b) < 0 . El primer paso de este mtodo consiste en bisectar el intervalo [a, b] en dos mitades: [a, c] y [c, b], donde; c = ( a + b ) / 2. Si se verifican los signos de f (a ) f (c) y f (b) f (c) , se sabe en que mitad del intervalo se encuentra la raz.

De hecho, si 0 < f (a) f (c) , el intervalo [a, c], que incluye x = a y x = c, contiene a la raz; de lo contrario, la raz esta en el otro intervalo, [c,b]. A continuacin, se bisecta de nuevo el intervalo que contiene a la raz. Al repetir este procedimiento, el tamao del intervalo que contiene a la raz se har cada vez ms pequeo. En cada paso se toma el punto medio del intervalo como la aproximacin ms actualizada a la raz. La iteracin se detiene cuando el tamao de la mitad del intervalo es menor que una tolerancia dada o error que se estime. El tamao del intervalo despus de n pasos de iteracin es
(b0 a 0 ) / 2 n ,

donde a0 y b0 son valores iniciales de los extremos, de modo que el numerador es el tamao de intervalo inicial. La ecuacin anterior representa el mximo error que existe cuando se aproxima la raz con el n-simo punto medio. Por tanto, si la tolerancia del error es t, el nmero de pasos de iteracin necesarios es el entero n ms pequeo que satisface t < (b0 a 0 ) / 2 n . De forma equivalente, n < log[(b0- a0)/ t ]/log(2) donde t es la tolerancia. Con este mtodo, lo que se busca es determinar la raz de una ecuacin, o sea, su interseccin con el eje de las x o su solucin, por lo que se debe tener en cuenta que no todas las ecuaciones tienen una sola solucin, y que no todas tienen solucin, as que se debe tener una idea de la forma de la curva de la ecuacin antes de comenzar a aplicar el mtodo. Procedimiento: Primero hay que saber que lo que hace el mtodo de biseccin es, como su nombre lo dice, ir partiendo en dos la distancia entre 2 puntos para obtener un punto central, se hace de la siguiente manera: Se tiran 2 puntos cualesquiera que sean sobre el eje de las x, y entre los cuales se piense que puede estar la raz, y si no est, el mismo mtodo lo sealara. Despus de seleccionar esos 2 puntos que se llaman A y C, se obtiene un tercer termino llamado B, B es el promedio de la distancia entre A y C, por lo que B=(A+C)/2.

Una vez que se tienen los 3 valores se procede a acomodarlos en 3 columnas llamadas A, B y C, que servirn mas adelante. Luego se sustituyen los valores de cada uno de los valores en la ecuacin original, como se ve en la grafica, cada punto tiene su funcin: a tiene f ( a ) , B tiene f (b) y c tiene f (c) , y se anota el resultado de la sustitucin de cada cantidad en otras 3 columnas llamadas precisamente f (a) , f (b) , y f (c) . Algoritmo: 1. Elija valores Iniciales para a y b de forma tal que la funcin cambie de signo sobre el intervalo. Esto se puede verificar asegurndose de que: f (a) * f (b) < 0 2. La primera aproximacin a la raz se determina con la formula: xn = ( a + b) / 2 3. Realizar las siguientes evaluaciones para determinar en que subintervalo se encuentra la raz: f(a)*f(xn ) < 0 Entonces b = xn f(a)*f(xn) > 0 Entonces a = xn f(a)*f(xn) = 0 Entonces xn Es la Raz 4. Calcule la nueva aproximacin: xn+1 = ( a + b) / 2 5. Evaluar la aproximacin relativa Si ( xn+1 xn ) / xn+1 < tolerancia (Falso) Repetir el paso 3, 4 y 5 (Verdadero) Entonces xn+1 Es la Raz Ejercicio 1:

Suponga que tiene la siguiente ecuacin: f ( x) = x 3 + 6 x 2 + 2 x + 8 , y que los dos puntos iniciales que se seleccionar para iniciar las iteraciones son, a = 13 y b=5
a
b

f (a) f (b) f (m)


32

-13.00 5.00 -4.00 -1201 293

Despus, ya con todos los valores acomodados en su respectiva columna se pone atencin a las 3 columnas con las f (x) y se ve entre cuales existe un cambio de signo, en este caso, entre f (a) y f (m) , lo que indica que la raz esta entre esos 2 puntos, si no hay ningn cambio de signo entre ninguna de las 3 columnas, como ya se haba dicho antes, el mtodo indica que no esta entre los 2 primeros puntos que se seleccionaron, y no tiene caso continuar, por lo que si desde el principio no hubo cambio de signo es mejor escoger un nuevo par de datos para a y b . Como se determin que el cambio de signo estaba entre a y m, entonces en las columnas de las f(x) se baja el resultado que tiene f (a ) porque tiene cambio de signo, y el resultado de f (c ) se elimina, y en vez de bajarlo se sustituye por el de f (b) , y lo mismo se hace con tres primeras columnas, el valor de A se baja, el de C se elimina y es sustituido por el de B. A B m f (a ) -13 -4 5 -1201 -13

f (b) f (m)
32.000 293 32

-4 -1201 -189.625

Como se puede ver en esta nueva tabla, los espacios de b y f (b) estn vacos, para llenarlos solamente es necesario repetir el proceso que ya se realiz, para el valor de b se vuelve a utilizar la frmula b=(a+c)/2 y luego se sustituye ese valor en la ecuacin original para obtener f (b) , y despus se vuelve a ver donde hay cambio de signo, se elimina el valor de la columna donde no haya, y se bajan los valores donde si haya, el caso es que los espacios de B y f (b) vayan quedando vacos cada vez. El proceso se repetira idealmente hasta que el valor absoluto en la columna de f (b) quede un 0, pero realmente eso nunca pasa, por lo que antes de empezar el proceso se puede fijar un valor al que se desea llegar, cercano a 0, como por ejemplo un 0.001, y cuando en la columna de f (b) , quede un numero igual o menor a 0.001, se termina el proceso y la raz que se estaba buscando es ultimo valor que quede en la columna de B. Aqu se sigue con la tabla de arriba para que quede un poco mas claro el procedimiento.

f(A)

f(B)

f(C)

-13.00000 -4.00000 5.0000 -1201.000000

32.000000 293.00000

-13.00000 -8.50000 -4.0000 -1201.000000 -189.625000 32.00000 -8.50000 -6.25000 -4.0000 -189.625000 -14.265625 32.00000 -6.25000 -5.12500 -4.0000 -6.25000 -5.68750 -8.1250 -6.25000 -5.96875 -5.6875 -5.96875 -5.82812 -5.6875 -14.265625 -14.265625 -14.26562 -2.82418 20.732420 32.00000 6.733640 20.73242 -2.824188 2.182000 6.73364 6.73364

Ejercicio 2: Calcular y = 2 . Se usar para la biseccin un intervalo que es una especia de ensayo y error. Se conoce que 2 es un valor entre 1 y 2. Si se hace x = 1, se tendr que x2 es mas grande que 2, por esto este x es grande. Si se hace x=1, se tendr que x2 es menor que 2, este x es menor al resultado real. Continuando este camino nos aproximamos que 1 1 , 1 1 , 1 3 ..... 2 4 8 Programa en Matlab.
M=2 a=1 b=2 k = 0; while b-a > eps x = (a + b)/2; if x^2 > M b=x else a=x end k = k + 1; end

2 es:

b = 1.50000000000000 a = 1.25000000000000 a = 1.37500000000000 b = 1.43750000000000 a = 1.40625000000000 b = 1.42187500000000 a = 1.41406250000000 b = 1.41796875000000 b = 1.41601562500000 b = 1.41503906250000 b = 1.41455078125000 ..... b = 1.41421356237311 a = 1.41421356237299

a = 1.41421356237305 a = 1.41421356237308 a = 1.41421356237309 b = 1.41421356237310 b = 1.41421356237310 Ejercicio 3. La funcin f ( x) = e x + 4 x 3 5 tiene una raz en x = 1.05151652 . Empezando con x1 = 1 y x 2 = 2 , usar ocho iteraciones del mtodo de la biseccin para aproximar la raz. Tabular el error despus de cada iteracin y tambin las estimaciones del error mximo. El error real siempre es menos que la estimacin del error mximo? Los errores reales continan disminuyendo? Solucin De forma general, para hallar una raz de f ( x) = 0 , dado que f es continua en el intervalo [x1 , x 2 ] , donde el signo de f ( x1 ) es opuesto al signo de f ( x 2 ) , esto es f ( x1 ) f ( x 2 ) < 0 , se usar el siguiente algoritmo del mtodo de la biseccin: mientras x 2 x1 > 2 * tolerancia f ( x3 ) > 0 + error

x3 = ( x1 + x 2 ) / 2 si ( f ( x3) * f ( x1) < 0) x 2 = x3 sino x1 = x3 fin_si fin_mientras


A continuacin se presenta la tabla con los valores obtenidos para las ocho iteraciones correspondientes:
N (Iteracin)

x1

x2

x3

f ( x3 )

max

real

1 2 3 4 5 6 7 8

1.000000 2.000000 1.500000 1.000000 1.500000 1.250000 1.000000 1.250000 1.125000 1.000000 1.125000 1.062500

8.723130 0.500000 -0.448483 3.099005 0.250000 -0.198485 3.694997 0.125000 -0.073483 0.143442 0.062500 -0.010983

1.000000 1.062500 1.031250 -0.256598 0.031250 0.020267 1.031250 1.062500 1.046875 -0.059688 0.015625 0.004642 1.046875 1.062500 1.054688 0.041094 0.007813 0.003171

1.046875 1.054688 1.0500781 -0.009492 0.003906 0.000735

Para ocho iteraciones se obtiene x3 = 1.05781 , que es el valor de x3 ms prximo al valor exacto. El error mximo y el error real para cada iteracin vienen dados como sigue: x x1 max = 2 real = x x N 2 Se nota que el error real es siempre de menor magnitud que el error mximo, x x es decir, se cumple que: x N x 2 n 1 ; N 1 . 2 Adems, los errores reales disminuyen con cada iteracin ya que cada una de ellas es una mejor aproximacin que la anterior al valor exacto de la raz. Ejemplo 4: Otra forma de programarlo con MatLab. Toca tener guardado el archivo correspondiente a la funcin, que para este caso ser f.m
k = 0; while abs(b-a) > eps*abs(b) x = (a + b)/2; if sign(f(x)) == sign(f(b)) b = x; else a = x; end k = k + 1; end

Ejemplo 5
/* Mtodo de intervalo Medio o Biseccin */ #include <vcl.h> #pragma hdrstop #pragma argsused #include <stdio.h> #include <conio.h> #include <math.h> void Lee_Datos(void); double Funcion(double X); double a, b, Error; int Max_Iter; int main(void) { double Error_Aprox, Prod; double Xr, Xn; int Ciclos = 0; Lee_Datos(); if ( Funcion(a)*Funcion(b) > 0 ) printf("\n No existe Raiz en el intervalo ????"); else { Xr = ( a+b )/2; printf("\n-------------------------------------------"); Error_Aprox = 1;

printf("\n Ciclo a b Xn Error"); printf("\n-------------------------------------------"); printf("\n%3d%10.4f%10.4f%10.4f",Ciclos,a,b,Xr); while ( Ciclos <= Max_Iter && Error < Error_Aprox) { Prod = Funcion(a)*Funcion(Xr); if (Prod == 0) printf(" La raiz es %lf",Xr); else if (Prod < 0) b = Xr; else a = Xr; Xn = ( a+b )/2; Ciclos += 1; Error_Aprox = fabs((Xn-Xr)/Xn); printf("\n%3d%10.4f%10.4f%10.4f%10.4f",Ciclos,a,b,Xn,Error_Aprox); Xr = Xn; } if ( Ciclos< Max_Iter) { printf("\n-------------------------------------------"); printf("\n\n La Raz de la Ecuacin es => %lf",Xn); printf("\n Se encontr en %d Iteraciones",Ciclos); } else printf("\n No se encontr raz en %d Iteraciones",Ciclos); } getch(); return 0; } void Lee_Datos(void) { clrscr(); printf("\nDar el valor de Xi ........... "); printf("Dar el valor de Xf ........... "); printf("Cual es el Error Permitido ... "); printf("Cual es el Mximo de Ciclos .."); }

scanf("%lf",&a); scanf("%lf",&b); scanf("%lf",&Error); scanf("%d",&Max_Iter);

double Funcion(double X) { return (pow((1+X),10)-1)/(X*pow((1+X),10)) - 5; }

Raz simple
Como en caso del procedimiento de aproximaciones sucesivas, se crea una clase base abstracta denominada Ecuacin con una funcin miembro denominada puntoMedio que describa el procedimiento numrico.
public abstract class Ecuacion { protected static final double CERO=1e-10; protected static final double ERROR=0.001; protected final int MAXITER=200;

public double puntoMedio(double a, double b) throws RaizExcepcion{ double m, ym; int iter=0; do{ m=(a+b)/2; ym=f(m); if(Math.abs(ym)<CERO) break; if(Math.abs((a-b)/m)<ERROR) break; if((f(a)*ym)<0) b=m; else a=m; iter++; }while(iter<MAXITER); if(iter==MAXITER){ throw new RaizExcepcion("No se ha encontrado la raz"); } return m; } } abstract public double f(double x);

class RaizExcepcion extends Exception { public RaizExcepcion(String s) { super(s); } }

Cuando se cumple el tercer criterio de terminacin, es decir, se supera el nmero de iteraciones MAXITER prefijada de antemano, se lanza (throw) una excepcin que indica que la raz buscada no se ha encontrado. Para lanzar la excepcin, se ha de crear un objeto de la clase derivada RaizExcepcion de la clase base Exception. Como la clase Ecuacin es abstracta, la clase derivada de sta Funcion1 define la funcin f(x) particular cuyas raz deseamos conocer en un determinado intervalo. Sea por ejemplo, la funcin estudiada en la seccin anterior

f ( x) = x cos( x)
Como s ha visto esta funcin tiene una raz en el intervalo (0, / 2) . La funcin cambia de signo en dicho intervalo, f (0) = 1, y, f ( / 2) = / 2 .
public class Funcion1 extends Ecuacion{ public double f(double x){ return(x-Math.cos(x)); } }

Para hallar la raz de esta ecuacin creamos un objeto de la clase derivada Funcion1, y llamamos desde ste a la funcin que describe el procedimiento numrico puntoMedio. Ya que la funcin puntoMedio puede lanzar una excepcin, la llamada a dicha funcin se debe de efectuar en un bloque try ...

catch. De este modo, se notifica al usuario que el procedimiento numrico ha sido incapaz de hallar la raz de dicha ecuacin, mediante el mensaje "No se ha encontrado la raz" que se extrae del objeto ex de la clase RaizExcepcion mediante la funcin getMessage.
Ecuacion e=new Funcion1(); try{ System.out.println("solucin1 "+e.puntoMedio(0.5, 0.9)); }catch(RaizExcepcion ex){ System.out.println(ex.getMessage()); }

También podría gustarte