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

").h> #include<math.h no es parte de ANSI C. xr=((b+a)/2). 2)/3)+(9))..h> // NOTA: conio. . printf("Presiona enter para contiuar. c=getchar().. double errorDeseado){ double xr. double p. Permite la obtención de las raíces de una función usando el Método de bisección: #include<stdio. es una libreria de C de Borland //Funcion Que Queremos hallar double f(double x) { return ((pow(x. double b.b: %f\a".a.h> // #include<conio. //xr representa el punto intermedio printf("valor a:%f valorb:%f\t".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. //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. errorAbsoluto.b). } //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. printf("biseccion a.f(xr)).

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

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

disp(['Valor c='.acosh.cosh.b. x=c.b)'). disp(sign(v)). end. n=1. string(n). if sign(u)==sign(w) a=c. disp(['f(c)='.tolerancia) disp('Método de la bisección'). end n=n+1.xmed SciLab El siguiente código para SciLab. v=evstr("LaFuncion(b)"). u=w.a. v=w. else b=c.from math import sinh.asinh. . w=evstr("LaFuncion(c)").5>tolerancia) c=(b+a)/2. string(c)]). string(w)]).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. disp(['************ Paso : '. end while ((b-a)*0. disp('************* La Raiz : *************'). if sign(u)==sign(v) disp('Error la La función debe cambiar de signo en (a. u=evstr("LaFuncion(a)").tanh. Permite la obtención de de las raíces de una función usando el Método de bisección: function x = biseccion(LaFuncion. disp(sign(u)). '************'] ).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'.

EvaluaEcua(frmPrincipal. tolerancia)) End If End If End If Return reporte End Function End Class Java /** * * @author fredy Mosquera Lemus */ public class Biseccion { /** . ByVal b As Double.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.Text.txtFuncion. c. c) er = Math.txtFuncion.Abs(a .txtFuncion.txtX_2.Text.txtX_1. ByVal tolerancia As Double) f_a = valorfuncion.Text) If ((f_a * f_b) < 0) Then c = (a + b) / 2 f_c = valorfuncion. frmPrincipal. tolerancia)) End If If ((f_c * f_b) < 0) Then reporte += Convert.Net 2005. 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.ToString(biseccion(a.Text) f_b = valorfuncion.Text. frmPrincipal.ToString(biseccion(b.endfunction.EvaluaEcua(frmPrincipal.EvaluaEcua(frmPrincipal. VB. c.

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

} } .

Sign up to vote on this title
UsefulNot useful