El método de bisección es uno de los problemas básicos dentro de las aproximaciones numéricas, "búsqueda de raíces". Consiste en obtener una raíz o solución para ecuaciones de la forma f(x)=0.
Demostración gráfica del método de bisección |
Para empezar, supongamos que tenemos un intervalo cualesquiera [a,b] que encierre la raíz, para esto la función debe de cambiar de signo dentro del intervalo. Esto se verifica comprobando que f(a)*f(b)<0.
Una aproximación de la raíz se obtiene mediante:
p=(a+b)/2
Se comprueba en que subintervalo se encuentra ahora la raíz.
- Si f(a)*f(p)<0 entonces la raíz se encuentra dentro del subintervalo [a,p]. Por lo tanto b=p, y repetimos la búsqueda.
- Si f(a)*f(p)>0 entonces la raíz se encuentra dentro del subintervalo [p,b]. Por lo tanto a=p, y repetimos la búsqueda.
- Si f(a)*f(p)=0 la raíz de la función es p, sin embargo este caso no siempre llega a darse, por lo que generalmente no se tiene en cuenta dentro de los códigos de programación.
Cuando se crean los algoritmos generalmente para métodos como este se tiene en cuenta una tolerancia, con la cual podemos comprobar que el resultado obtenido es lo más próximo a la raíz. Dicho valor se compara con el absoluto de la función del último valor calculado, es decir, debe cumplir que:
|f(p)|<Tolerancia
Mientras más pequeño sea la tolerancia aceptada, más próximo es el resultado a la raíz.
Pseudocódigo
ENTRADA: valores a y b, la tolerancia Tol y un máximo de iteraciones Nmax.
SALIDA: solución aproximada p o mensaje de fracaso.
Paso 1: Tome i=1
Paso 2: Mientras i<Nmax repita los pasos 3 a 6
Paso 3: Tome p=(a+b)/2 (Calculamos p)
Paso 4: Si f(p)<Tol entonces
SALIDA: "La raíz de la función es: ", p (Procedimiento termino con éxito).
PARAR
Paso 5: Tome i=i+1
Paso 6: Si f(a)*f(p)<0 entonces (Actualizamos nuestros valores a y b)
tome b=p
De lo contrario
tome a=p
Paso 7: SALIDA: "Se ha superado el máximo número de iteraciones" (Procedimiento termino sin éxito).
PARAR
Algoritmo en Matlab
%Bisección
clear;
nmax = input('Número de iteraciones: ');
tol = input('Tolerancia: ');
disp('Intervalo');
a = input('a= ');
b = input('b= ');
disp('Ingrese la función');
syms x;
f = input('f(x)=');
stop=0;
i=1;
while(i<nmax)
p = (a+b)/2;
fp = subs(f,x,p);
fa = subs(f,x,a);
if(abs(fp)<tol)
disp('La raíz de la función es');
disp(vpa(p,8));
stop = 1;
break;
end
if(fa*fp<0)
b=p;
else
a=p;
end
i = i+1;
end
if(stop~=1)
disp('Se ha superado el número máximo de iteraciones');
end
El if(stop~=1) es una forma de evitar que el mensaje de error se muestre si se ha encontrado la aproximación de la raíz.
Si tienen alguna duda o comentario no duden en hacérmelo saber en los comentarios.
No hay comentarios:
Publicar un comentario