Método de la Bisección

Bisección

Ceros de Funciones

Problema:

Dada $f:\mathbb{R}\rightarrow \mathbb{R}$, encontrar $ x^ {*}$ tal que

$$ f(x^ {*})=0 $$

Método de la Bisección

El método de la Bisección está basado en el siguiente teorema:

Teorema del valor intermedio : Si $ f:\mathbb{R}\rightarrow \mathbb{R} $ es una función continua en un intervalo $ [a, b] $, Entonces para cada $u$ tal que $f ( a ) < u < f ( b )$, entonces existe almenos un $ x_0 \in (a,b) $ tal que $$f(x_0) = u.$$

De esta manera si tenemos una función $f$ y un intervalo $[a, b]$ en el que $$f(a)f(b)<0$$ es decir donde $$f ( a ) < 0 < f ( b )\ \ \text{ o }\ \ f ( a ) > 0 > f ( b ),$$ entonces existe almenos un $x^* \in (a,b)$ tal que $$f(x^*) = 0$$

El método:

Supongamos que tenemos un intervalo $[a_0, b_0]$ tal que $f(a_0)f(b_0)<0$ definimos

  • $m_0:=\frac{a_0+b_0}{2}$ se induce una bisección al intervalo $[a_0, b_0]$: $[a_0, m_0]$ y $[m_0, b_0]$
  • verificamos en cuál de estos se cumple la condición: $$f(a_0)f(m_0)<0$$ $$f(m_0)f(b_0)<0$$ es decir, en cuál de los intervalos se encuentra el cero de $f$.
  • Redefinimos el intervalo $[a_0, b_0]$
In [1]:
f  =@(x) x.^5+x.^4-5*x.^2+2*x.-10
f =

@(x) x .^ 5 + x .^ 4 - 5 * x .^ 2 + 2 * x - 10

In [2]:
fplot(f,[0 2])
In [3]:
function [x_0,N] =Bisec(a_0,b_0,f,eps)
x_0=(a_0+b_0)/2;
N=1;
    while abs(f(x_0))>eps  %Tolerancia
       m_0=(a_0+b_0)/2;
       
        if f(a_0)*f(m_0)<0
            b_0=m_0;
            x_0=m_0;
        end

        if f(m_0)*f(b_0)<0
            a_0=m_0;
            x_0=m_0;
        end
                
        N=N+1;
    end
end
In [4]:
a=0;
b=2;
f
[x_0,N] =Bisec(a,b,f,.00001)
f(x_0)
f =

@(x) x .^ 5 + x .^ 4 - 5 * x .^ 2 + 2 * x - 10

x_0 =  1.6662
N =  21
ans =   5.8576e-006
In [5]:
k=14;
epss=logspace(-k,-1,10*k+1);
N=zeros(1,length(eps));
t=zeros(1,length(eps));

a=0;
b=2;
f;
for i=1:length(epss)
    [x_0,n] =Bisec(a,b,f,epss(i));
    
    N(i)=n;
    zer(i)=abs(f(x_0));
end
In [9]:
subplot(1,2,1), semilogx(epss,N,'-o')
title('Numero de iteraciones contra tolerancia')
xlabel('\epsilon')
ylabel('N ')

subplot(1,2,2), loglog(epss,zer,'-o')
title('Valor de la funcion en x^{*} contra tolerancia')
xlabel('\epsilon')
ylabel('f(x^{*})')