INGENIERIA INFORMATICA 6505 - Laboratorio de Métodos Numéricos Apellidos: ___________________________ Septiembre 1999 Nombre: _____________________ Grupo: ______________________ 1. (3 puntos) El método de Halley para la resolución de la ecuación f ( x) 0 hace uso de la siguiente fórmula de iteración: f ( x n ) f ( x n ) f ( x n )2 f ( x n ) f ( x n ) 2 En donde f ( x n ) , f ( x n ) y f ( x n ) representan respectivamente el valor de la función, de la derivada x n 1 x n primera y de la derivada segunda en el punto x n . Escriba un programa (preferentemente en Pascal) para encontrar el único cero real del polinomio: f ( x) x 3 2 x 5 mediante el método de Halley. El programa deberá: Pedir una estimación inicial del valor de la raíz de la función ( x0 ), el número máximo de iteraciones (M) y los criterios de convergencia. Indicar si el método ha convergido o no y escribir la solución encontrada, el número de iteraciones que se han realizado y la convergencia alcanzada. Utilizar el algoritmo de Horner para evaluar f ( x n ) , f ( x n ) y f ( x n ) . PROGRAM halley(INPUT, OUTPUT); TYPE Coef = ARRAY [0..10] OF double; (* Lectura de los datos del polinomio *) PROCEDURE lee_coef(VAR n : integer; VAR a : coef); VAR i : integer; BEGIN WRITELN; WRITE('Grado del polinomio: '); READLN(n); FOR i:=n DOWNTO 0 DO BEGIN WRITE('Coeficiente a[',i:2,'] = '); READLN(a[i]) END END; { lee_coef } (************************************* * PROGRAMA PRINCIPAL * ************************************) VAR grado,i : integer; M,iter : integer; a : coef; x0,x1 : double; d,fm,conv,ft : double; f,df,d2f : double; BEGIN WRITELN; WRITELN('*** Iteracion de Halley ***'); WRITELN; (* Polinomio *) WRITELN('Datos del polinomio:'); lee_coef(grado,a); WRITE('Aproximacion inicial: '); READLN(x0); WRITE('Naximo de iteraciones: '); READLN(M); WRITE('Criterio de convergencia: '); READLN(d); WRITE('Valor maximo de la funcion: '); READLN(fm); (* Inicializamos variables *) iter := 0; conv := d + 1.0; ft := fm + 1.0; (* Bucle principal de iteracion *) WHILE (iter < M) AND ((conv > d) OR (ft > fm)) DO BEGIN (* Calcula f(x); f'(x) y f''(x) *) f := a[grado]; df := 0; d2f := 0; FOR i := grado-1 DOWNTO 0 DO BEGIN d2f := x0 * d2f + df; df := x0 * df + f; f := x0 * f + a[i] END; x1 := x0 – f * df / (df * df - f * d2f / 2); ft := abs(f); iter := iter + 1; conv := abs((x1 - x0)/x1); x0 := x1; END; IF (iter >= M) THEN WRITELN('*** No Converge ***') ELSE WRITELN('*** Converge ***'); WRITELN('x = ',x0); WRITELN('f(x) = ',f); WRITELN('Iteraciones = ',iter); WRITELN('Convergencia = ',conv) END. INGENIERIA INFORMATICA 6505 - Laboratorio de Métodos Numéricos Apellidos: ___________________________ Septiembre 1999 Nombre: _____________________ Grupo: ______________________ 2. (2 puntos) Calcule el punto fijo (s) de la siguiente iteración funcional: xn1 p xn (1) definida en el intervalo 0 x y en donde p es un número entero positivo. Nota: El punto fijo s de una iteración funcional x n1 F ( x n ) cumple la propiedad: F (s) s Solución: De acuerdo con la definición (2), el punto fijo de la iteración funcional (1) debe cumplir la siguiente ecuación: s ps s2 p s ; ; s2 s p 0 Resolviendo la ecuación subrayada, tenemos que: s 1 1 1 4p 2 Sólo el valor positivo de la expresión anterior tiene sentido, por lo que la solución final es: s 1 1 1 4p 2 (2) INGENIERIA INFORMATICA 6505 - Laboratorio de Métodos Numéricos Apellidos: ___________________________ Septiembre 1999 Nombre: _____________________ Grupo: ______________________ 3. (3 puntos) Considere el siguiente sistema de ecuaciones lineales: 5x1 x2 x3 7 x1 3x2 1 x1 x2 6 x3 11 Elabore un programa (preferentemente MatLab) que resuelva el sistema anterior mediante el método iterativo de Gauss-Seidel. Tenga en cuenta los siguientes puntos: Utilice el vector x1 x 2 x3 0 como estimación inicial de la solución. El programa deberá solicitar el número máximo de iteraciones (M) y el criterio de convergencia (Delta). Deberá indicar si el método ha convergido o no y escribir el vector solución encontrado, el número de iteraciones que se han realizado y la convergencia alcanzada. El método iterativo de Gauss-Seidel obtiene los elementos del vector en la iteración k a partir de los elementos del vector de la iteración anterior ( k 1) empleando la siguiente fórmula: i 1 xi( k ) (bi n aij x (jk ) j 1 a ( k 1) ) / aii ij x j j i 1 en donde n es el tamaño (número de filas o columnas) del sistema de ecuaciones. Podríamos crear el siguiente procedimiento MatLab: %***************************************** %* * %* Sistemas de ecuaciones lineales * %* Métodos de iterativos. * %* * %* seidel: Algoritmo de Gauss-Seidel. * %* * %* [x,delta,m] = seidel(a,b,Delta,M) * %* * %* Entrada: * %* a: Matriz de coeficientes. * %* b: Matriz columna de términos * %* independientes. * %* Delta: Criterio de convergencia. * %* M: Numero maximo de iteraciones. * %* * %* Salida: * %* x: Matriz columna de soluciones. * %* delta: Convergencia alcanzada. * %* m: Número de iteraciones. * %* * %***************************************** function [x,delta,m] = seidel(a,b,Delta,M) % % Dimension del sistema deecuaciones. filas=size(a,1); % Contruimos la matriz d: d=zeros(filas,filas); for i=1:filas; d(i,i)=1.0/a(i,i); end % Escalamos el sistema de ecuaciones a=d*a; b=d*b; % Comenzamos el proceso iterativo for m=1:M; % Contador de iteraciones for i=1:filas; x(i)=b(i); for j=1:filas; if (i ~= j) x(i)=x(i)-a(i,j)*x(j); end end end r=x-z; z=x; % Calculo de la convergencia delta = norm(r)/norm(x); % Si alcanzada la convergencia, salir if delta <= Delta break end % Inicializamos los vectores columna r y x. r=zeros(filas,1); x=zeros(filas,1); z=zeros(filas,1); % Escalado del sistema de ecuaciones y lo utilizaríamos del siguiente modo: a = [ 5 1 -1; -1 3 0; 1 1 6 ] b = [ -7; 1; 11 ]; [x,delta,m] = seidel(a,b,1.0e-8,50); end INGENIERIA INFORMATICA 6505 - Laboratorio de Métodos Numéricos Apellidos: ___________________________ Septiembre 1999 Nombre: _____________________ Grupo: ______________________ 4. (2 puntos) Dada la siguiente función tabulada en el intervalo [-1,2]: x -1.0000 -0.3679 f (x) -0.7000 -0.4288 0.1000 0.0990 Calcule numéricamente la integral definida 0.6000 0.4186 0.9000 0.4004 1.5000 0.1581 2.0000 0.0366 2 1 f ( x)dx mediante la regla del trapecio. Nota: La regla del trapecio aproxima el valor de una integral definida b f ( x)dx mediante la a expresión: b f ( x)dx a f (x)dx f (x)dx f (x)dx De acuerdo con los datos de la tabla, la integral ba f (a) f (b) 2 2 1 2 0.7 0.1 0.6 1 1 0.7 0.1 f ( x)dx se puede escribir de la forma: f ( x)dx 0.9 0.6 f ( x)dx 1.5 0.9 f ( x)dx 2 f ( x)dx 1.5 Aplicamos la regla del trapecio a cada uno de los sumandos de la derecha y sustituyendo valores obtenemos: (0.7 1.0) 0.3679 0.4288 (0.1 0.7) 0.4288 0.0990 1 2 2 (0.6 0.1) (0.9 0.6) 0.0990 0.4186 0.4186 0.4004 2 2 (1.5 0.9) 0.4004 0.1581 (2.0 1.5) 0.1581 0.0366 2 2 Realizando las operaciones, obtenemos: 2 1 2 f ( x)dx f ( x)dx 0.11951 0.13192 0.12940 0.12285 0.16755 0.04868 0.21705