El método de bisección, conocido también como de corte binario, de partición de intervalos o de Bolzano, es un método de búsqueda incremental en el que el intervalo se divide siempre a la mitad.
grafico
\begin{equation} x_{raiz} = \frac{x_{inferior} + x_{superior}}{2} \end{equation}Algoritmo
la raiz verdadera está en el intervalo [x_inferior, x_superior]
calcular x_raiz
si f(x_inferior)*f(x_raiz) < 0
la raiz verdadera está en el intervalo [x_inferior, x_raiz]
calcular x_raiz
si f(x_inferior)*f(x_raiz) > 0
la raiz verdadera está en el intervalo [x_raiz, x_superior]
calcular x_raiz
si f(x_inferior)*f(x_raiz) = 0
se encontró la raiz verdadera
Encontrar la raiz de
\begin{equation*} y = x^{3} + 4 x^{2} - 10 \end{equation*}la raíz posiblemente se encuentre en $[x_{l}, x_{u}] = [1,2]$
Intervalo actual
\begin{equation*} [x_{l_{0}}, x_{u_{0}}] = [1, 2] \end{equation*}Raíz aproximada
\begin{equation*} x_{r_{0}} = \frac{x_{l_{0}} + x_{u_{0}}}{2} = \frac{1 + 2}{2} = 1.5 \end{equation*}Siguiente intervalo
\begin{equation*} [x_{l_{1}}, x_{u_{1}}] = \left \{ \begin{array}{llcll} si & f(x_{l_{0}}) \cdot f(x_{r_{0}}) = f(1) \cdot f(1.5) < 0 & \longrightarrow & [x_{l_{0}}, x_{r_{0}}] = [1, 1.5] & \checkmark \\ si & f(x_{l_{0}}) \cdot f(x_{r_{0}}) = f(1) \cdot f(1.5) > 0 & \longrightarrow & [x_{r_{0}}, x_{u_{0}}] = [1.5, 2] & \end{array} \right . \end{equation*}Error relativo
\begin{equation*} e_{r} = ? \end{equation*}Intervalo actual
\begin{equation*} [x_{l_{1}}, x_{u_{1}}] = [1.5, 2] \end{equation*}Raíz aproximada
\begin{equation*} x_{r_{1}} = \frac{x_{l_{1}} + x_{u_{1}}}{2} = \frac{1 + 1.5}{2} = 1.25 \end{equation*}Siguiente intervalo
\begin{equation*} [x_{l_{2}}, x_{u_{2}}] = \left \{ \begin{array}{llcll} si & f(x_{l_{1}}) \cdot f(x_{r_{1}}) = f(1) \cdot f(1.25) < 0 & \longrightarrow & [x_{l_{1}}, x_{r_{1}}] = [1, 1.25] & \\ si & f(x_{l_{1}}) \cdot f(x_{r_{1}}) = f(1) \cdot f(1.25) > 0 & \longrightarrow & [x_{r_{1}}, x_{u_{1}}] = [1.25, 1.5] & \checkmark \end{array} \right . \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{x_{r_{1}} - x_{r_{0}}}{x_{r_{1}}}\bigg| \times 100\% = \bigg|\frac{1.25 - 1.5}{1.25}\bigg| \times 100\% = 20\% \end{equation*}Intervalo actual
\begin{equation*} [x_{l_{2}}, x_{u_{2}}] = [1.25, 1.5] \end{equation*}Raíz aproximada
\begin{equation*} x_{r_{2}} = \frac{x_{l_{2}} + x_{u_{2}}}{2} = \frac{1.25 + 1.5}{2} = 1.375 \end{equation*}Siguiente intervalo
\begin{equation*} [x_{l_{3}}, x_{u_{3}}] = \left \{ \begin{array}{llcll} si & f(x_{l_{2}}) \cdot f(x_{r_{2}}) = f(1.25) \cdot f(1.375) < 0 & \longrightarrow & [x_{l_{2}}, x_{r_{2}}] = [1.25, 1.375] & \checkmark \\ si & f(x_{l_{2}}) \cdot f(x_{r_{2}}) = f(1.25) \cdot f(1.375) > 0 & \longrightarrow & [x_{r_{2}}, x_{u_{2}}] = [1.375, 1.5] & \end{array} \right . \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg|\frac{x_{r_{2}} - x_{r_{1}}}{x_{r_{2}}}\bigg| \times 100\% = \bigg|\frac{1.375 - 1.25}{1.375}\bigg| \times 100\% = 9.09\% \end{equation*}Intervalo actual
\begin{equation*} [x_{l_{3}}, x_{u_{3}}] = [1.25, 1.375] \end{equation*}Raíz aproximada
\begin{equation*} x_{r_{3}} = \frac{x_{l_{3}} + x_{u_{3}}}{2} = \frac{1.25 + 1.375}{2} = 1.3125 \end{equation*}Siguiente intervalo
\begin{equation*} [x_{l_{4}}, x_{u_{4}}] = \left \{ \begin{array}{llcll} si & f(x_{l_{3}}) \cdot f(x_{r_{3}}) = f(1.25) \cdot f(1.3125) < 0 & \longrightarrow & [x_{l_{3}}, x_{r_{3}}] = [1.25, 1.3125] & \\ si & f(x_{l_{3}}) \cdot f(x_{r_{3}}) = f(1.25) \cdot f(1.3125) > 0 & \longrightarrow & [x_{r_{3}}, x_{u_{3}}] = [1.3125, 1.375] & \checkmark \end{array} \right . \end{equation*}Error relativo
\begin{equation*} e_{r} = \bigg| \frac{x_{r_{3}} - x_{r_{2}}}{x_{r_{3}}} \bigg| \times 100\% = \bigg|\frac{1.3125 - 1.375}{1.3125}\bigg| \times 100\% = 4.76\% \end{equation*}Seudocódigo para calcular la raíz
function raiz(x_l, x_u)
x_r = (x_l + x_u)/2
return x_r
end function
Seudocódigo para determinar el siguiente intervalo
function intervalo_de_raiz(f(x), x_l, x_u)
x_r = raiz(x_l, x_u)
if f(x_l)*f(x_r) < 0
x_u = x_r
end if
if f(x_l)*f(x_r) > 0
x_l = x_r
end if
return x_l, x_u
end function
In [1]:
def raiz(x_l, x_u):
x_r = (x_l + x_u)/2
return x_r
def intervalo_de_raiz(f, x_l, x_u):
x_r = raiz(x_l, x_u)
if f(x_l)*f(x_r) < 0:
x_u = x_r
if f(x_l)*f(x_r) > 0:
x_l = x_r
return x_l, x_u
Seudocódigo
function biseccion(f(x), x_inferior, x_superior)
x_raiz_actual = raiz(x_inferior, x_superior)
error_permitido = 0.000001
while(True)
x_raiz_anterior = x_raiz_actual
x_inferior, x_superior = intervalo_de_raiz(f(x), x_inferior, x_superior)
x_raiz_actual = raiz(x_inferior, x_superior)
if x_raiz_actual != 0
error_relativo = abs((x_raiz_actual - x_raiz_anterior)/x_raiz_actual)*100
end if
if error_relativo < error_permitido
exit
end if
end while
mostrar x_raiz_actual
end function
o también
function biseccion(f(x), x_inferior, x_superior)
x_raiz_actual = raiz(x_inferior, x_superior)
for 1 to maxima_iteracion do
x_raiz_anterior = x_raiz_actual
x_inferior, x_superior = intervalo_de_raiz(f(x), x_inferior, x_superior)
x_raiz_actual = raiz(x_inferior, x_superior)
end for
mostrar x_raiz_actual
end function
In [2]:
def biseccion(f, x_inferior, x_superior):
print("{0:2s}\t{1:12s}\t{2:12s}\t{3:12s}\t{4:16s}".format(' i', 'x inferior', 'x superior', 'raiz', 'error relativo %'))
x_raiz_actual = raiz(x_inferior, x_superior)
i = 0
print("{0:2d}\t{1:12.10f}\t{2:12.10f}\t{3:12.10f}\t{4:16s}".format(i, x_inferior, x_superior, x_raiz_actual, '????????????????'))
error_permitido = 0.000001
while True:
x_raiz_anterior = x_raiz_actual
x_inferior, x_superior = intervalo_de_raiz(f, x_inferior, x_superior)
x_raiz_actual = raiz(x_inferior, x_superior)
if x_raiz_actual != 0:
error_relativo = abs((x_raiz_actual - x_raiz_anterior)/x_raiz_actual)*100
i = i + 1
print("{0:2d}\t{1:12.10f}\t{2:12.10f}\t{3:12.10f}\t{4:16.13f}".format(i, x_inferior, x_superior, x_raiz_actual, error_relativo))
if (error_relativo < error_permitido) or (i>=20):
break
print('\nx =', x_raiz_actual)
In [3]:
def f(x):
y = x**3 + 4*x**2 - 10
return y
In [4]:
intervalo_de_raiz(f, 1, 2)
Out[4]:
In [5]:
intervalo_de_raiz(f, 1, 1.5)
Out[5]:
In [6]:
intervalo_de_raiz(f, 1.25, 1.5)
Out[6]:
In [7]:
biseccion(f, 1, 2)
In [8]:
from math import sin, cos
def g(x):
y = sin(10*x) + cos(3*x)
return y
In [9]:
intervalo_de_raiz(g, 14, 15)
Out[9]:
In [10]:
intervalo_de_raiz(g, 14.5, 15)
Out[10]:
In [11]:
intervalo_de_raiz(g, 14.75, 15)
Out[11]:
In [12]:
biseccion(g, 14, 15)
In [13]:
biseccion(g, 12, 16)