Práctica 4: Iteración de punto fijo para ecuaciones no lineales

Anuncio
Práctica 4: Iteración de punto fijo para ecuaciones
no lineales
1.
Construcción de funciones
Ya hemos visto que podemos construir una función, digamos mifuncion(x,y)
creando un fichero .m con el mismo nombre y encabezamiento function
[...]=mifuncion(x,y). Es un procedimiento muy válido para funciones
más o menos complicadas, pero en ocasiones no nos trae cuenta generar un
nuevo fichero .m para definir, digamos, f (x, y) = cos(xy). Para ello existe la
opción de definir una función dentro del propio script, usando el comando
inline, por ejemplo:
f = inline(’cos(x.*y)’, ’x’,’y’);
El segundo y tercer argumentos, especificando las variables, no son obligatorios (Matlab trata de “adivinar” las variables de la función), pero son
recomendables.
A partir de la versión 7 Matlab incorpora una forma equivalente, pero
más eficiente, de definir las funciones en linea:
f = @(x, y) cos(x.*y);
2.
Iteración de punto fijo
El método de la iteración de punto fijo para resolver una ecuación no
lineal
f (x) = 0
pasa por transformarla en una equivalente,
x = g(x) ,
y ejecutar la iteración
x(k+1) = g(x(k) )
a partir de un cierto x(0) hasta que se satisfaga el criterio de parada elegido
o se alcance el número de iteraciones máximo admitido.
Una posible implementación del algoritmo de punto fijo en su variante
más sencilla puede ser por medio de la función puntofijo con la siguiente
estructura:
Práctica de ordenador IV
2
function [x,xvect,nit]=puntofijo(g,x0,maxiter,tolerancia)
% Implementa la iteracion de punto fijo
% g = expresion de la funcion de iteracion
% x0 = valor inicial
% Como criterios de parada se usan:
% maxiter = cantidad max de iteraciones admitidas
% tolerancia = margen para error absoluto
% En la salida:
% x = resultado de la ultima iteracion
% xvect = vector de los resultados de todas las iteraciones
% nit = cantidad de iteraciones realizadas
nit=0; xvect=x0; x=x0;
% Inicializando
err=tolerancia+1;
% Garantiza al menos 1 ejecucion
while (nit < maxiter & err > tolerancia),
nit=nit+1;
xn=g(x);
xvect=[xvect;xn];
% Agregamos el valor nuevo
err=abs(xn-x);
% Calculamos error absoluto
x=xn;
end
if nit == maxiter,
disp(’Alcanzado el max de iteraciones admisible’)
end
Analice el código anterior para entender su funcionamiento.
Observaciones: la ejecución se detiene tan pronto como |x(k+1) − x(k) | se
hace menor que el valor de tolerancia o se alcance el número máximo de
iteraciones admisibles maxiter.
Para llamar la función g tenemos dos opciones:
Si g fue definida por medio de inline o ’@g’, basta incluir su nombre
en el argumento de puntofijo.
Si g fue definida por medio de un fichero .m o es una función ya
implementada en Matlab, debemos utilizar ’@g’ (por ejemplo, @cos)
en el argumento de puntofijo.
En esta práctica usaremos la función puntofijo para estudiar la convergencia de la iteración de punto fijo.
3.
Trabajo de laboratorio
Realice las siguientes tareas consecutivamente, almacenando los códigos
en los ficheros script que considere necesarios:
Andrei Martı́nez Finkelshtein
Práctica de ordenador IV
3
1. Aproxime los puntos fijos (si existen) de g(x) = cos(sen(x)), tomando
tolerancia=10^(-15). Dibuje además una gráfica de la función y de
la recta y = x que muestre claramente los puntos fijos que haya.
2. Estudiemos la aplicación de la iteración de punto fijo al cálculo de las
raı́ces de la función
f (x) = −x2 + x + sen(x + 0,15) .
Para ello:
a) Dibuje la gráfica de f y localice la raı́z de menor valor absoluto.
b) Aplique la iteración de punto fijo a g(x) = x − f (x) para aproximar esa raı́z con tolerancia=10^(-15). Dibuje la gráfica de los
valores x(k) . ¿Hay convergencia después de 100 iteraciones?
c) Aplique lo que hemos estudiado en clase para seleccionar el valor
del parámetro α en
g(x) = x − αf (x)
para mejorar las propiedades de convergencia. Vuelva a aplicar la
iteración de punto fijo y compare los resultados.
d ) Estudie si la misma iteración de punto fijo permite hallar la menor
raı́z positiva de f .
e) Aplique el algoritmo ∆2 de Aitken para acelerar la convergencia
de la sucesión de aproximaciones obtenida. Compare la velocidad
de convergencia en cada caso.
Sugerencia: para implementar la fórmula de Aitken es conveniente utilizar la función diff de MATLAB. Utilice la ayuda para
conocer la sintaxis y el objetivo de dicha función.
Andrei Martı́nez Finkelshtein
Descargar