Método de dicotomía · c)Haceren+1 = en=2 yn= n+ 1 yvolveralpasob). ... % distintos en a y b %...
Click here to load reader
Transcript of Método de dicotomía · c)Haceren+1 = en=2 yn= n+ 1 yvolveralpasob). ... % distintos en a y b %...
Método de dicotomía
a0
!
b0x0 a1
!
b1x1 a2 b2
x2
En cada iteración se descarta la mitad del intervalo que no contiene a la raíz(en la que f no cambia de signo).
Se construye así una sucesión de intervalos encajados
[a, b] = [a0, b0] ⊃ [a1, b1] ⊃ [a2, b2] ⊃ · · · ⊃ [ak, bk] ⊃ . . . ,
que siempre contienen al punto α.
El intervalo donde se encuentra la raíz es cada vez más pequeño y, su puntomedio se acerca cada vez más a la solución buscada.
Si el intervalo inicial es [a, b], tras la n-ésima subdivisión se tendrá el cerolocalizado en un intervalo [an, bn]. Por tanto si elegimos su punto medio xn =
(an+ bn)/2 como aproximación del cero de f en [a, b], cometemos un error nosuperior a en = (bn − an)/2. En consecuencia, si queremos aproximar la raízcon un error no superior a ε, bastará con terminar este proceso cuando en ≤ ε.
Algoritmo de dicotomía (variante 1)
a) Elegir ε > 0. Tomar n = 0, a0 = a, b0 = b y e0 = (b0 − a0)/2.
b) Dados n ≥ 0, [an, bn] tal que f(an)f(bn) < 0 y en = (bn − an)/2, tomar
xn =an+ bn
2.
b.1) Si |en| ≤ ε, parar y devolver xn como aproximación de la solución.
b.2) Si f(an)f(xn) < 0, hacer an+1 = an , bn+1 = xn.
b.3) Si f(xn)f(bn) < 0, hacer an+1 = xn, bn+1 = bn.
c) Hacer en+1 = en/2 y n = n+1 y volver al paso b).
Algoritmo de dicotomía (variante 2) (considerando la posibilidad de quepuede ser directamente f(xn) ≈ 0 para algún n).
a) Elegir ε > 0 y tol > 0. Tomar n = 0, a0 = a, b0 = b y e0 = (b0 − a0)/2.
b) Dados n ≥ 0, [an, bn] tal que f(an)f(bn) < 0 y en = (bn − an)/2, tomar
xn =an+ bn
2.
b.1) Si |en| ≤ ε o bien |f(xn)| < tol, parar y devolver xn como aproximaciónde la solución.
b.2) Si f(an)f(xn) < 0, hacer an+1 = an , bn+1 = xn.
b.3) Si f(xn)f(bn) < 0, hacer an+1 = xn, bn+1 = bn.
c) Hacer en+1 = en/2 y n = n+1 y volver al paso b).
Algoritmo de dicotomía (pseudo-código ) (correspondiente a la versión 2)
a) Datos de entrada: a, b, ε(> 0) y tol(> 0).Hacer n = 0 y e = (b− a)/2.
b) Dados n, a, b y e, calcular x =a+ b
2
b.1) Si |e| ≤ ε o bien |f(x)| < tol, parar y devolver x como aproximación dela solución.
b.2) Si f(a)f(x) < 0, hacer b = x.
b.3) Si no, hacer a = x
c) Hacer x =a+ b
2, e = e/2 y n = n+1 y volver al paso b).
Programa dicotomia1 (la función tiene que estar definida en una M-funciónde nombre fdic.m)
function [x] = dicotomia1(a,b,epsi,tol)%% dicotomia1(a,b,eps,tol) devuelve una aproximacion del% unico cero de la M-función fdic entre a y b% La función fdic debe ser continua y tener signos% distintos en a y b% Metodo utilizado: biseccion% Argumentos:% a,b : extremos de un intervalo con un cero de fcn% epsi : se detiene el algoritmo si |x-sol_exacta|<epsi% tol : se detiene el algoritmo si |f(x)|<tol%% La funcion fdic debe ser una M-funcion, en un fichero fdic.m%
% Inicio y preparacion de las iteraciones%
fa = fdic(a);fb = fdic(b);if ( fa*fb > 0 )
error(’La funcion debe cambiar de signo en el intervalo’);end
e = (b-a)*0.5;x = (a+b)*0.5;
% Nucleo de las iteraciones%while abs(e)>epsi
fx = fdic(x);if ( abs(fx)<tol )
returnendif (fa*fx > 0)
a = x;fa = fx;
elseb=x;fb = fx;
endx = (a+b)*0.5;e = e*0.5;
end
Para usar el programa anterior hay que tener la función f(x), que define laecuación f(x) = 0 programada, necesariamente, como una M-función en unfichero de nombre fdic.m.
Por ejemplo, para aproximar la solución de la ecuación x ex − 2 = 0, que estáen el intervalo [0,1], habría que escribir, en un fichero de nombre fdic.m elsiguiente código:
function [y] = fdic(x)y = x.*exp(x)-2;
y luego, por ejemplo, desde la ventana de comandos, usar la función dicotomia1:
>> dicotomia1(0,1,1.e-6,1.e-8)
Cuando usábamos la función fzero para aproximar la misma solución escribía-mos:
>> fezero( @fdic , [0,1] )
O bien, podríamos definir la función f(x) = x ex−2 como una función anónima:
>> fun = @(x) x.*exp(x)-2;>> fezero( fun , [0,1] )
ya que la función fzero admite que se le envíe la expresión de f(x) comoargumento.
Queremos poder hacer lo mismo con nuestra función dicotomia, es decir poderenviar el nombre de la función como argumento de dicotomia. Para ello, hayque escribirla en una forma ligeramente diferente:
Programa dicotomia2 (el nombre de la función entra como argumento)
function [x] = dicotomia2(fun,a,b,epsi,tol)%% dicotomia1(fun,a,b,eps,tol) devuelve una aproximacion del% unico cero de la función fun entre a y b% La función fun debe ser continua y tener signos% distintos en a y b%% Metodo utilizado: biseccion%% Argumentos:% fun : un handle a una función% a,b : extremos de un intervalo con un cero de fcn% epsi : se detiene el algoritmo si |x-sol_exacta|<epsi% tol : se detiene el algoritmo si |f(x)|<tol%
% Cuando el nombre de la funcion viene como argumento,% no se puede evaluar directamente.% Es necesario utilizar la función feval como aqui:%
fa = feval(fun,a);fb = feval(fun,b);if ( fa*fb > 0 )
error(’La funcion debe cambiar de signo en el intervalo’);end
e = (b-a)*0.5;x = (a+b)*0.5;
% Nucleo de las iteraciones%while abs(e)>epsi
fx = feval(fun,x);if ( abs(fx)<tol )
returnendif (fa*fx > 0)
a = x;fa = fx;
elseb=x;fb = fx;
endx = (a+b)*0.5;e = e*0.5;
end
Con esta segunda versión del programa dicotomia, la función f(x) ya notendría que llamarse obligatoriamente fdic y se podría usar de las siguientesdistintas formas:
>> dicotomia2(@fdic,0,1,1.e-6,1.e-8)
(si estuviera en un fichero de nombre fdic.m) o bien
>> mifun = @(x) x.*exp(x)-2;>> dicotomia2(mifun,0,1,1.e-6,1.e-8)
(si fuera una función anónima)
Ejercicio: Utilizar el programa dicotomia2 con varias ecuaciones, utilizandodistintos intervalos y distintos valores para los parámetros de los test de parada,eps y tol. Comparar con los resultados obtenidos utilizando la función fzero,observando el número de cifras decimales que coinciden.
Método de Regula Falsi
Se divide el intervalo utilizando el punto de corte con el eje OX de la secanteque pasa por los puntos (a, f(a)) y (b, f(b)).
Ecuación de la recta que pasa por los puntos (a, f(a)) y (b, f(b))
y =(f(b)− f(a)
)x+
(f(a)b− f(b)a
)
Punto de corte con el eje OX
c =f(b)a− f(a)bf(b)− f(a)
Algoritmo de Regula Falsi (pseudo-código)
a) Datos de entrada: a, b, ε(> 0) y tol(> 0).Hacer n = 0.
b) Dados n, a y b, calcular x =f(b)a− f(a)bf(b)− f(a)
b.1) Si |b − a| ≤ ε o bien |f(x)| < tol, parar y devolver x como aproximaciónde la solución.
b.2) Si f(a)f(x) < 0, hacer b = x.
b.3) Si no, hacer a = x
c) Hacer x =f(b)a− f(a)bf(b)− f(a)
y volver al paso b).
Ejercicios
1. Tomando como punto de partida el programa dicotomia2.m, escribir unprograma RegulaFalsi1.m que implemente el algoritmo anterior. Comprobarsu buen funcionamiento con varios ejemplos que planteen las distintasposibilidades que pueden darse.
2. Se desea comparar el número de iteraciones que, con las mismas condicio-nes de precisión exigida, realizan el método de dicotomía y el de RegulaFalsi. Para ello:
a) Modificar convenientemente el programa dicotomia2.m para que devuel-va, además de la solución, el número de iteraciones realizadas. Guardareste programa con el nombre dicotomia.m (esta es la última y definitivaversión)
function [x,Niter] = dicotomia(fun,a,b,eps,tol)
b) Modificar convenientemente el programa RegulaFalsi1.m para que de-vuelva, además de la solución, el número de iteraciones realizadas. Guar-dar este programa con el nombre RegulaFalsi.m (esta es la última ydefinitiva versión)
function [x,Niter] = RegulaFalsi(fun,a,b,eps,tol)
c) Diseñar un conjunto de ejemplos para la comparación: comparar ambosprogramas con distintas funciones e intervalos (funciones con mayor ymenor pendiente, intervalos que contienen un cero más o menos cercadel centro o de alguno de sus extremos, . . . )