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