You are on page 1of 9

Wiki Loves Monuments: ¡Fotografía un monumento, ayuda a Wikipedia y gana!

Método de bisección
Saltar a: navegación, búsqueda

Unas cuantas iteraciones del método de bisección aplicadas en un intervalo [a1;b1]. El punto rojo es la raíz de la función. En matemáticas, el método de bisección es un algoritmo de búsqueda de raíces que trabaja dividiendo el intervalo a la mitad y seleccionando el subintervalo que tiene la raíz.

Contenido
  

1 Introducción 2 Algoritmo 3 Método de bisección en diferentes lenguajes de Programación o 3.1 C o 3.2 C++ o 3.3 MatLab o 3.4 Python o 3.5 SciLab o 3.6 VB.Net 2005, 2008 y 2010 o 3.7 Java 4 Bibliografía

Si f es una función continua en el intervalo [a. El método de bisección es menos eficiente que el método de Newton.Introducción Este es uno de los métodos más sencillos y de fácil intuición para resolver ecuaciones en una variable. b] como [a. De esta forma. entonces este método converge a la raíz de f.b]. se garantiza la convergencia si f(a) y f(b) tienen distinto signo. m] ó [m. el valor cero sería un valor intermedio entre f(a) y f(b). por lo cual es un poco lento. Si existieran más de una raíz en el intervalo entonces el método sigue siendo convergente pero no resulta tan fácil caracterizar hacia qué raíz converge el método. La bisección converge linealmente. b] y f(a)f(b) < 0. se asegura la existencia de al menos una solución de la ecuación f(a)=0.b] que cumple f(p)=0. por lo que con certeza existe un p en [a. b] según se haya determinado en cuál de estos intervalos ocurre un cambio de signo Con este nuevo intervalo se continúa sucesivamente encerrando la solución en un intervalo cada vez más pequeño.b] y se evalúa f(m) si ese valor es igual a cero. una cota del error absoluto es: en la n-ésima iteración. pero es mucho más seguro para garantizar la convergencia. el cual establece que toda función continua f en un intervalo cerrado [a. verificamos si f(m) tiene signo opuesto con f(a) o con f(b) Se redefine el intervalo [a.b] toma todos los valores que se hallan entre f(a) y f(b). Sin embargo. ya hemos encontrado la raíz buscada En caso de que no lo sea.b] A continuación se verifica que Se calcula el punto medio m del intervalo [a. Esto es que todo valor entre f(a) y f(b) es la imagen de al menos un valor en el intervalo [a. Se basa en el teorema del valor intermedio (TVI). hasta alcanzar la precisión deseada En la siguiente figura se ilustra el procedimiento descrito. Algoritmo Para aplicar el método consideremos tres sucesiones siguientes relaciones: definidas por las . El método consiste en lo siguiente:       Debe existir seguridad sobre la continuidad de la función f(x) en el intervalo [a. De hecho. En caso de que f(a) y f(b) tengan signos opuestos.

b).h no es parte de ANSI C. Permite la obtención de las raíces de una función usando el Método de bisección: #include<stdio. printf("Presiona enter para contiuar.. .b: %f\a". double p. //Esta funcion es Y=(X*X)/3)+9 Reemplazar por la funcion deseada ej: Y=(x*x*x)+(3*x)+6 } // Funcion pausar void pausa() { char c. 2)/3)+(9)). printf("biseccion a.").Donde los valores iniciales vienen dados por: Se puede probar que las tres sucesiones convergen al valor de la única raíz del intervalo: Método de bisección en diferentes lenguajes de Programación C El siguiente código en lenguaje C. c=getchar().h> #include<math. //xr representa el punto intermedio printf("valor a:%f valorb:%f\t". double errorDeseado){ double xr. es una libreria de C de Borland //Funcion Que Queremos hallar double f(double x) { return ((pow(x.h> // #include<conio. double b.f(xr)).. } //biseccion: Retorna el valor de la funcion usando metodo de biseccion //parametros: a= valor menor al punto //parametros: b= valor mayor al punto //parametros: p= el punto que deseamos encontrar //parametros: errorDeseado = margen de error double biseccion(double a. errorAbsoluto. xr=((b+a)/2).h> // NOTA: conio.a.

p. cin>>a. return 0.tol. 0. pausa(). tol. int maxlter. // NOTA: Se recomienda para pausar crear su propia funciona de caracter para continuar. cin>>tol. double tol. int main() { double a. cout<< "por favor digite maxlter: ". double biseccion ( double a. b.b. // introduce un rango amplio // getch(). }else{ a=xr*3. cout<< "por favor digite a: ". double b. // system("pause"). es otra opcion en sistemas windows. return 0. } double f(double x) . errorDeseado).b.146. cout<<"La raiz es: "<< raiz <<endl. imprime las iteraciones por el Método de bisección: para la funcion x^3+4x^2-10 #include <iostream> #include <cmath> using namespace std.maxlter). biseccion(-424.//Cambia A o B por el valor del punto dependiendo de cuales se encuentran en medio de p if(p<xr){ b=xr-1. cin>>maxlter. double f(double x). cout<< "por favor digite b: ".02)). o usar la pausa nativa de OS. int maxlter). } //calcula el error relativo errorAbsoluto=fabs(f(p)-fabs(f(xr))). //Si el margen de error ya es valido retorna la funcion. 7. cin>>b. } C++ El siguiente código en lenguaje C++. system("pause"). }else{ return biseccion(a. raiz=biseccion(a. } } int main(){ printf("%lf\n". raiz. cout<< "por favor digite tol: ". if (errorAbsoluto<errorDeseado){ return xr*0.

disp(['n='. x=c.b). disp(['f(c)='. double b. v=w. num2str(c)]).b)').a).coding: utf-8 -*from math import sin.5>=tol) c=(b+a)/2. num2str(w)]). n=1.acos. double tol.cos. end n=n+1.tol) % Aproxima por el método de la bisección una raíz de la ecuación fun(x)=0 disp('Método de la bisección'). } MatLab function x = biseccion(fun. return c. end while ((b-a)*0. int nolter=0.c). u=feval(fun.atan. } cout<<nolter<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t"<<f(c)<<endl.b.log. nolter++. if sign(u)==sign(w) a = c. int maxlter) { double c. else b=c. w=feval(fun. Python # -*. do { c=(a+b)/2.tan.asin.exp . v=feval(fun. end. } else { a=c. if(f(a)*f(c)<0) { b=c. } while((abs(f(c))>tol)&&(nolter<maxlter)). num2str(n)]).a. u=w.sqrt. disp(['c='.{ return x*x*x+4*x*x-10. } double biseccion(double a. if sign(u)==sign(v) disp('Error la función debe cambiar de signo en (a.

.b)'). v=evstr("LaFuncion(b)"). v=w. disp(['f(c)='. disp(['Valor c='.acosh. Permite la obtención de de las raíces de una función usando el Método de bisección: function x = biseccion(LaFuncion. u=w. disp(sign(u)).a.tolerancia) disp('Método de la bisección'). disp(['************ Paso : '. if sign(u)==sign(v) disp('Error la La función debe cambiar de signo en (a.tanh. else b=c. string(w)]). n=1. if sign(u)==sign(w) a=c. w=evstr("LaFuncion(c)"). disp('************* La Raiz : *************').from math import sinh.b. end while ((b-a)*0. string(n).5>tolerancia) c=(b+a)/2.asinh.cosh.atanh ec=raw_input('De la funcion a resolver: ') x1=floath(input('de el extremo inferior del intervalo aproximado: ')) x2=float(input('de el extremo superior del intervalo aproximado: ')) errordeseado=input('De el error deseado: ') def f(x): return eval(ec) while True: xmed=(x1+x2)/2 if f(xmed)==0. end n=n+1. string(c)]). '************'] ). x=c. end.xmed SciLab El siguiente código para SciLab.0: break if (f(x1)*f(xmed))<0: x2=xmed else: x1=xmed error=abs(x2-x1) if error<errordeseado: break print 'La raiz es'. u=evstr("LaFuncion(a)"). disp(sign(v)).

EvaluaEcua(frmPrincipal.Net 2005.endfunction.Text. frmPrincipal. VB. ByVal b As Double.EvaluaEcua(frmPrincipal. frmPrincipal.txtX_2. ByVal tolerancia As Double) f_a = valorfuncion.txtFuncion.Text) If ((f_a * f_b) < 0) Then c = (a + b) / 2 f_c = valorfuncion.Text) f_b = valorfuncion.EvaluaEcua(frmPrincipal.c) reporte = CStr(i + 1) + "ª" + Chr(9) + "x= " + CStr(c) + Chr(9) + " f(x)= " + CStr(f_c) + Chr(9) +_ " error= " + CStr(er) + Chr(13) + Chr(10) i += 1 If (tolerancia <= er) Then If ((f_c * f_a) < 0) Then reporte += Convert. c. c) er = Math. tolerancia)) End If End If End If Return reporte End Function End Class Java /** * * @author fredy Mosquera Lemus */ public class Biseccion { /** . tolerancia)) End If If ((f_c * f_b) < 0) Then reporte += Convert.Abs(a .ToString(biseccion(b.txtX_1.ToString(biseccion(a.Text.txtFuncion.txtFuncion. 2008 y 2010 Public Class metodos Dim c As Double Dim f_a As Double Dim f_b As Double Dim f_c As Double Dim er As Double Dim reporte As String Public i As Integer Dim valorfuncion As New EvalEcuaciones Public Function biseccion(ByVal a As Double.Text. c.

}else{ c = (a + b) /(double) 2. fb = funcion(b). } /** * Metodo de Biseccion el cual le halla las raices de una funciones en un intervalo * ingresado como parametro de entrada [a.0.* Este metodo crea un funcion a la cual se le aplicara el método de * Biseccion teniendo como parametro de entrada un double x. double b. return c. fc = funcion(c). double fb. }else if((fb * fc) > 0 ){ b = c. en ese intervalo no existen raices"). return (x*x) . el cual * sirve para la construccion de la funcion dentro del metodo * @param x * @return */ private double funcion(double x){ // return Math. fc = funcion(c). c = (a + b) /(double) 2. double fc. if((funcion(a) * funcion(b)) > 0){ System. do{ fa = funcion(a). fb = funcion(b). double fa. . double error){ double c = 0.println("valor de la funcion: "+funcion(c)).3. c = (a + b) /(double) 2. fa = funcion(a). if((fa * fc) > 0){ a = c.out.abs(fc) >= error). b] y un el error con el cual * deseamos hallar nuestra funcion * @param a * @param b * @param error * @return */ public double metodoDeBiseccion(double a. fc = funcion(c). } System. fb = funcion(b).out. fa = funcion(a).println("Error en el intervalo. } }while(Math.sqrt( x*x +1 ) -4.

} } .