Método de bisección

Método de bisección
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

Introducción

Este es uno de los métodos más sencillos y de fácil intuición para resolver ecuaciones en una variable. Se basa en el teorema del valor intermedio (TVI), el cual establece que toda función continua f en un intervalo cerrado [a,b] toma todos los valores que se hallan entre f(a) y f(b). Esto es que todo valor entre f(a) y f(b) es la imagen de al menos un valor en el intervalo [a,b]. En caso de que f(a) y f(b) tengan signos opuestos, el valor cero sería un valor intermedio entre f(a) y f(b), por lo que con certeza existe un p en [a,b] que cumple f(p)=0. De esta forma, se asegura la existencia de al menos una solución de la ecuación f(a)=0.

El método consiste en lo siguiente:

  • Debe existir seguridad sobre la continuidad de la función f(x) en el intervalo [a,b]
  • A continuación se verifica que \scriptstyle f(a)\cdot f(b) <0
  • Se calcula el punto medio m del intervalo [a,b] y se evalúa f(m) si ese valor es igual a cero, ya hemos encontrado la raíz buscada
  • En caso de que no lo sea, verificamos si f(m) tiene signo opuesto con f(a) o con f(b)
  • Se redefine el intervalo [a, b] como [a, m] ó [m, 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, hasta alcanzar la precisión deseada

En la siguiente figura se ilustra el procedimiento descrito.

El método de bisección es menos eficiente que el método de Newton, pero es mucho más seguro para garantizar la convergencia. Si f es una función continua en el intervalo [a, b] y f(a)f(b) < 0, entonces este método converge a la raíz de f. De hecho, una cota del error absoluto es:

 \frac{\left|b-a\right|}{2^n}

en la n-ésima iteración. La bisección converge linealmente, por lo cual es un poco lento. Sin embargo, se garantiza la convergencia si f(a) y f(b) tienen distinto signo.

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.

Algoritmo

Para aplicar el método consideremos tres sucesiones a_n \le p_n \le b_n\, definidas por las siguientes relaciones:

p_n = \frac{a_n+b_n}{2},
\quad a_{n+1} = \begin{cases}
a_n & \mbox{si } f(a_n)\cdot f(p_n) <0 \\
p_n & \mbox{si } f(a_n)\cdot f(p_n) > 0\end{cases},
\quad b_{n+1} = \begin{cases}
b_n & \mbox{si } f(b_n)\cdot f(p_n) < 0 \\
p_n & \mbox{si } f(b_n)\cdot f(p_n) > 0\end{cases}

Donde los valores iniciales vienen dados por:

a_0 := a,\quad b_0:=b

Se puede probar que las tres sucesiones convergen al valor de la única raíz del intervalo:

\lim_{n \to \infty} a_n = \lim_{n \to \infty} p_n = \lim_{n \to \infty} b_n

Método de bisección en diferentes lenguajes de Programación

C

El siguiente código en lenguaje C, Permite la obtención de de las raíces de una función usando el Método de bisección:

#include<stdio.h>
#include<math.h>
// #include<conio.h>                // NOTA: conio.h no es parte de ANSI C, es una libreria de C de Borland
//Funcion Que Queremos hallar
double f(double x)
{
   return ((pow(x, 2)/3)+(9)); //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;
     printf("Presiona enter para contiuar...");
     c=getchar();
}
 
//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, double b, double p, double errorDeseado){
   double xr, errorAbsoluto; //xr representa el punto intermedio
   printf("valor a:%f valorb:%f\t",a,b);
   xr=((b+a)/2);
   printf("biseccion a,b: %f\a",f(xr));
   //Cambia A o B por el valor del punto dependiendo de cuales se encuentran en medio de p
   if(p<xr){
      b=xr-1;
   }else{
      a=xr*3;
   }
   //calcula el error relativo
   errorAbsoluto=fabs(f(p)-fabs(f(xr)));
   //Si el margen de error ya es valido retorna la funcion.
   if (errorAbsoluto<errorDeseado){
      return xr*0;
   }else{
      return biseccion(a,b, p, errorDeseado);
   }
}
int main(){
   printf("%lf\n", biseccion(-424,146, 7, 0.02)); // introduce un rango amplio
   // getch();        // NOTA: Se recomienda para pausar crear su propia funciona de caracter para continuar, o usar la pausa nativa de OS.
   pausa();           // system("pause"); es otra opcion en sistemas windows.
   return 0;
}

C++

El siguiente código en lenguaje C++, 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;
double f(double x);
double biseccion ( double a, double b, double tol, int maxlter);
int main()
{
    double a, b, tol, raiz;
    int maxlter;
    cout<< "por favor digite a:  ";
    cin>>a;
    cout<< "por favor digite b:  ";
    cin>>b;
    cout<< "por favor digite tol:  ";
    cin>>tol;
    cout<< "por favor digite maxlter:  ";
    cin>>maxlter;
    raiz=biseccion(a,b,tol,maxlter);
    cout<<"La raiz es: "<< raiz <<endl;
    system("pause");
    return 0;
}
 
 double f(double x)
 {
        return x*x*x+4*x*x-10;
 }
 double biseccion(double a, double b, double tol, int maxlter)
 {
        double c;
        int nolter=0;
        do
        {
            c=(a+b)/2;
            if(f(a)*f(c)<0)
            {
               b=c;
            }
            else
            {
               a=c;
            }
            cout<<nolter<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t"<<f(c)<<endl;
            nolter++;
         }
         while((abs(f(c))>tol)&&(nolter<maxlter));
         return c;
 }
 
===MatLab===
 
<source lang="matlab">
function  x = biseccion(fun,a,b,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');
u=feval(fun,a);
v=feval(fun,b);
n=1; 
if sign(u)==sign(v)
   disp('Error la función debe cambiar de signo en (a,b)');
end 
while ((b-a)*0.5>=tol)
   c=(b+a)/2; w=feval(fun,c);
   disp(['n=', num2str(n)]);
   disp(['c=', num2str(c)]);
   disp(['f(c)=', num2str(w)]);
if sign(u)==sign(w)
        a = c; u=w;
else
        b=c; v=w;
end
        n=n+1;
end;
x=c;

Python

# -*- coding: utf-8 -*-
from math import sin,cos,tan,asin,acos,atan,sqrt,log,exp
from math import sinh,cosh,tanh,asinh,acosh,atanh
 
ec=raw_input('De la funcion a resolver: ')
x1=float(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.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',xmed

SciLab

El siguiente código para SciLab, Permite la obtención de de las raíces de una función usando el Método de bisección:

function  x = biseccion(LaFuncion,a,b,tolerancia)
disp('Método de la bisección');
u=evstr("LaFuncion(a)");
v=evstr("LaFuncion(b)");
n=1; 
disp(sign(u));
disp(sign(v));
if sign(u)==sign(v)
   disp('Error la La función debe cambiar de signo en (a,b)');
end 
while ((b-a)*0.5>tolerancia)
   c=(b+a)/2; 
   w=evstr("LaFuncion(c)");
   disp(['************ Paso :  ', string(n), '************'] );
   disp(['Valor c=', string(c)]);
   disp(['f(c)=', string(w)]);   
if sign(u)==sign(w)
        a=c; 
        u=w;
else
        b=c;
        v=w;
end
        n=n+1;
end;
disp('************* La Raiz : *************');
x=c;
endfunction;

Metodo de la Biseccion en VB.Net 2005

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, ByVal b As Double, ByVal tolerancia As Double)
        f_a = valorfuncion.EvaluaEcua(frmPrincipal.txtFuncion.Text, frmPrincipal.txtX_1.Text)
        f_b = valorfuncion.EvaluaEcua(frmPrincipal.txtFuncion.Text, frmPrincipal.txtX_2.Text)
        If ((f_a * f_b) < 0) Then
            c = (a + b) / 2
            f_c = valorfuncion.EvaluaEcua(frmPrincipal.txtFuncion.Text, c)
            er = Math.Abs(a - c)
            reporte = CStr(i + 1) + "ª" + Chr(9) + "x= " + CStr(c) + Chr(9) + " f(x)= " + CStr(f_c) + Chr(9) + " eror= " + CStr(er) + Chr(13) + Chr(10)
            i += 1
            If (tolerancia <= er) Then
                If ((f_c * f_a) < 0) Then
                    reporte += Convert.ToString(biseccion(a, c, tolerancia))
                End If
                If ((f_c * f_b) < 0) Then
                    reporte += Convert.ToString(biseccion(b, c, tolerancia))
                End If
            End If
        End If
        Return reporte
    End Function
End Class

Bibliografía

  • Richard L Burden, J. Douglas Faires (2000), "Numerical Analysis, (7th Ed)", Brooks/Cole. ISBN 0-534-38216-9.

Wikimedia foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Mira otros diccionarios:

  • Método de la secante — Dos primeras iteraciones del método de la secante. En análisis numérico el método de la secante es un método para encontrar los ceros de una función de forma iterativa. Es una variación del método de Newton Raphson donde en vez de calcular la… …   Wikipedia Español

  • Método de la regla falsa — En cálculo numérico, el método de regula falsi (regla falsa) o falsa posición es un método iterativo de resolución numérica de ecuaciones no lineales. El método combina el método de bisección y el método de la secante. Contenido 1 El método 2… …   Wikipedia Español

  • Método de Newton — En análisis numérico, el método de Newton (conocido también como el método de Newton Raphson o el método de Newton Fourier) es un algoritmo eficiente para encontrar aproximaciones de los ceros o raíces de una función real. También puede ser usado …   Wikipedia Español

  • Resolución numérica de ecuaciones no lineales — En análisis numérico un algoritmo de búsqueda de raíces es un método numérico o algoritmo para encontrar las soluciones aproximadas de una ecuación dada por la expresión f(x) = 0 para una función matemática f dada. A la solución x de la ecuación… …   Wikipedia Español

  • Raíz de una función — Saltar a navegación, búsqueda Si busca la raíz enésima de un número, vea Función raíz. En matemática, se conoce como raíz (o cero) de una función (definida sobre un cierto cuerpo algebraico) f (x) a todo elemento x perteneciente al dominio de… …   Wikipedia Español

  • Función cuantil — En probabilidad la función cuantil de una distribución de probabilidad es la inversa de la función de distribución.[1] Dada una función de distribución continua y estrictamente monótona, , la función cuantil, F −1, devuelve un valor x tal… …   Wikipedia Español

  • Análisis numérico — El análisis numérico o cálculo numérico es la rama de las matemáticas que se encarga de diseñar algoritmos para, a través de números y reglas matemáticas simples, simular procesos matemáticos más complejos aplicados a procesos del mundo real. El… …   Wikipedia Español

  • Radiografía periapical — Saltar a navegación, búsqueda La radiografía periapical es una de las técnicas utilizadas en la radiografía intrabucal. La radiografía intrabucal es una técnica exploratoria consistente en la colocación, dentro de la boca, de placas radiográficas …   Wikipedia Español

  • Algoritmo divide y vencerás — En la cultura popular, divide y vencerás hace referencia a un refrán que implica resolver un problema difícil, dividiéndolo en partes más simples tantas veces como sea necesario, hasta que la resolución de las partes se torna obvia. La solución… …   Wikipedia Español

  • Estadimetría — Saltar a navegación, búsqueda La estadimetría es un método aproximado de medición de distancias usando instrumentos topográficos ópticos como el teodolito o el equialtímetro (comúnmente llamado nivel óptico) y en otros tiempos, la plancheta, etc …   Wikipedia Español

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”