ALGORÍTMICA NUMÉRICA - Julio 2016 La duración del examen será de 1h 30m Todos los problemas tienen el mismo peso en la nota final del examen. Las notas y el procedimiento para la revisión del examen se comunicará a través de Moodle. La fecha estimada para la publicación de las notas es el lunes, 11 de julio. Prob 1: Se quiere simular una función f(x) por un polinomio de grado dos atendiendo a las siguientes consideraciones: a) Caso 1: Se considera el polinomio p(x) de grado 2 que interpola los siguientes datos de la función f(x): p(0)=f(0)= 0, p(1)=f(1)=10.5 y p’(0)= f’(0)=0.5. Se pide: - Dar la expresión de Newton generalizada del polinomio p(x). - Si la función f(x) tienen la expresión f ( x ) 10 x 0.5 0.5 e , dar una cota del error cometido al simular f(x) por p(x) en el intervalo [0,1]. 2 x b) Caso 2: Se han registrado los valores de la función f(x) en varios puntos según figura en la siguiente tabla: xk f(xk) 1 10.5 2 43 3 99.5 - Calcular el polinomio q(x) de grado dos que pasa por (0,0) (q(0)=0) y con la restricción adicional de q’(0)= 0.5, que mejor ajusta los datos de la tabla (en sentido de mínimos cuadrados). el - Utilizando el polinomio q(x) ¿cuál es el valor aproximado de f(1)? ¿Cuántas cifras decimales significativas garantiza dicha estimación? SOLUCIÓN a) Caso 1: La función pedida es un polinomio p(x) de grado dos, que tiene que verificar: p (0) 0, p '(0) 0.5, p(1) 10.5. Para dar la Fórmula de Newton generalizada de dicho polinomio, construimos la tabla de diferencias divididas generalizada con los datos: xk x0 0 p( xk ) 0 x0 0 x1 1 0 10.5 p .,. p 0,0 p '(0) 0.5 p 0,1 10.5 p .,.,. p 0,0,1 10 Por tanto, la Fórmula Newton generalizada del polinomio pedido es: p ( x) p 0 p 0, 0 x p 0, 0,1 x 2 0.5 x 10 x 2 . ALGORÍTMICA NUMÉRICA Julio 2016 Atendiendo a los resultados vistos en teoría, el error de interpolación E(x) tiene la siguiente expresión: en el intervalo [0,1]: E ( x) f ( x) p ( x) f 0, 0,1, x x 2 ( x 1) 1 f '''( x ) x 2 ( x 1), x [0,1]. 3! Acotamos ahora los términos que aparecen en la expresión anterior: f '''( x) 0.5e x 0.5e, x [0,1] (1). x 2 ( x 1) 22 1 , x [0,1] (2). 32 3 De (1) y (2), volviendo a la expresión de E(x), se obtiene la cota del error E ( x) 0.5e 22 1 0.0335, 3! 32 3 x [0,1]. b) Caso 2: La función pedida es un polinomio q(x) de grado dos, que tiene que verificar q (0) 0 y q '(0) 0.5. Imponiendo estas restricciones en un polinomio general de grados 2 q ( x ) ax 2 bx c , se obtienen c=0 y b=0.5. Por tanto la forma general de la función aproximante es q ( x) 0.5 x ax 2 . Se trata ahora de calcular el parámetro a de forma que q ( x) 0.5 x ax 2 ajuste los mejor posible los datos de la tabla (en el sentido mínimos cuadrados). Esto es, calcular a tal que minimice la función F ( a ) p ( xk ) f ( xk ) 0.5 xk axk 2 f ( xk ) . 3 2 k 1 3 2 k 1 Derivando dicha expresión respecto de a, igualando a cero y sustituyendo los valores de xk y f ( xk ) dados, se obtiene: F ( a ) 0 0.5 xk axk 2 f ( xk ) xk 2 0 a 10.816 3 k 1 Por tanto el polinomio pedido es q ( x ) 0.5 x 10.816 x 2 . Se aproxima f (1) q (1) 0.5 10.816 =11.3163. Por tanto el error relativo es error _ rel f (1) q (1) 10.5 11.3163 0.0777 f (1) 10.5 De lo que se concluye que dicha aproximación garantiza 1 cifra decimal significativa log10(err_rel)=1). (- ALGORÍTMICA NUMÉRICA Julio 2016 Prob 2: Dada la ecuación sen ( x ) 1 2 x , se pide: a) Demostrar que la ecuación anterior tiene al menos una raíz en [0, /2]. b) Si empleamos el método de Newton para calcular la raíz, demostrar que el método es convergente para cualquier x0 [0, / 2] . 6 c) Si se quiere aproximar la raíz con un error menor que 10 calcular el número de iteraciones que hay que hacer con el método de Newton si partimos de un x0 dentro del intervalo [0, /2]. d) Si partimos de x0=(3· /2 demostrad calculando x1 que el método de Newton sigue convergiendo en ese caso. ¿Contradice este resultado lo demostrado en el apartado b)? Solución: a) La ecuación dada es equivalente a la ecuación que está en la , siendo forma La función , es continua en y cumple: por teorema de Bolzano sabemos que existe al menos un , es decir, existe al menos una raíz tal que de la ecuación: en b) El método de Newton converge siempre que Si siendo: se cumple que Por otro lado, y Para x en el intervalo [0,/2] se cumple que: Sustituyendo, se obtiene: Hemos demostrado que el método de Newton converge para cualquier ALGORÍTMICA NUMÉRICA Julio 2016 c) Cota del error en el método de Newton: Para calcular el número de iteraciones n que hay que hacer para aproximar la raíz s con un error menor que , se debe cumplir: que se cumple para n>=5. Es decir, con 5 o más iteraciones aproximamos la raíz de la ecuación usando el método de Newton, con un error menor que Nota: dependiendo del valor de M encontrado en el apartado anterior, el número de iteraciones podría variar ligeramente. d) Si e iniciamos el método con este valor, obtenemos: A partir de estamos en el intervalo donde tenemos asegurada la convergencia como se ha demostrado en el apartado b) No existe contradicción porque el teorema afirma que si es seguro que hay convergencia pero si no se cumple no podemos afirmar nada. ALGORÍTMICA NUMÉRICA Julio 2016 Prob 3: Sea el sistema x 1.18885... 0.001x 1.23 y 1.23 , cuya solución exacta es x 1.19 y 0. y 0.99903... a) Resolved el sistema dado usando eliminación de Gauss SIN pivotaje usando 3 CIFRAS SIGNIFICATIVAS en todos los cálculos. Indicad los pasos dados y los resultados intermedios del proceso de eliminación, así como los resultados finales tal como se guardarían en la máquina con la precisión especificada. SIN PIVOTAR: m = 1/0.001 = 1000 y hacemos Fila2 = Fila2 - m· Fila1: -1.19 - 1000·1.23 = -1.19 - 1230 = -1231.19 -> -1230 ( con 3 cifras) 0 - 1000·1.23 = 0 - 1230 = -1230 El sistema triangular resultante queda: 0.001 0 1.23 1230 1.23 1230 que equivale a 0.001x 1.23 y 1.23 1230 y 1230. Despejando y en la 2ª ecuación => y = 1. La 1ª ecuación queda 0.001x + 1.23 = 1.23 --> 0.001x = 0 La solución de la y es aceptable pero la de la x es muy mala. --> x=0 b) Volver a resolver el sistema (con la misma precisión) pero ahora usando eliminación de Gauss con PIVOTAJE PARCIAL. ¿Son ahora correctos los resultados (para la precisión usada)? ¿Creéis que este comportamiento es debido al mal condicionamiento de la matriz del sistema? Justificar. PIVOTANDO: el sistema a resolver queda 1 0.0010 1.19 1.23 0 1.23 m = 0.001/1 = 0.001 y hacemos ahora Fila2 = Fila2 - 0.001· Fila1: 1.23 + 0.00119 = 1.23119 -> 1.23 (con tres cifras) 1.23 - 0.001·0 = 1.23 El sistema triangular resultante queda: 1 0 1.19 1.23 0 1.23 La 2ª ecuación nos da y = 1. que equivale a x 1.19 y 0 1.23 y 1.23 De la 1ª ecuación sale x =1.19·y = 1.19 Ambas soluciones son ahora correctas para la precisión usada (3 cifras). ALGORÍTMICA NUMÉRICA Julio 2016 La razón de este comportamiento no es el mal condicionamiento de la matriz. Una matriz mal condicionamiento no nos permitiría eludir el problema cambiando el orden en la resolución de las ecuaciones. c) En este ejercicio se han realizado los cálculos con 3 cifras decimales significativas. Si nuestra máquina usa una representación en coma flotante en base 2, ¿cuántos bits tendríamos que dedicar a la mantisa para tener una precisión similar? 3 cifras decimales significativas corresponden a una precisión del orden de 10 3 3 10 Como 10 2 =1/1024, necesitaríamos usar 10 bits de mantisa para una precisión similar. De forma similar podemos ver que una cifra decimal equivale a log2(10)=3.33 cifras binarias (bits). Las 3 cifras decimales corresponden a 3 x 3.33 10 bits En dicha representación, ¿con qué exponente y mantisa se codificaría el número 0.001? Expresar la mantisa primero en decimal y luego dar su expresión binaria. Multiplicamos por 2 el numero hasta hacerlo >=1. 0.001 x 2 = 0.002 < 1 ... 0.001 x 512 = 0.512 < 1 0.001 x 1024 = 1.024 >1, por lo tanto 0.001 = 1.024 · 2^-10 => mantisa = 1.024 , en el intervalo [1,2) como debe ser => exponente e=-10 La mantisa en decimal es 1.024. 1.024 = Escrita en binario: 1 + 2^-6 + 2^-7 + 2^-11 + ... Con los bits (10) de los que disponemos para la mantisa 1.024 se guardaría como 1.0000011000 ALGORÍTMICA NUMÉRICA. EXAMEN COMPUTATIONAL Julio 2016 - La duración del examen será de 1h 30m Todos los problemas tienen el mismo peso en la nota final del examen. Las notas y el procedimiento para la revisión del examen se comunicará a través de Moodle. La fecha estimada para la publicación de las notas es el lunes, 11 de julio. Ejercicio 1 Matlab dispone de la función log1p(x) (“valor bueno”) que, teóricamente, es igual a log(1+x). Se van a comparar los resultados de ambas cuando x ≈ 0. a) Evaluar ambas expresiones para unos valores x=10-1, 10-2,…, 10-16 b) Calcular el error relativo entre ambas expresiones y el número de cifras decimales/significativas en las que coinciden. c) Dibujar una gráfica con los valores de x en el eje horizontal y las cifras en el vertical con la escala más adecuada (−1) n +1 a n y el valor obtenido compararlo con log(1+a) y con d) Sea a = 10 evaluar ∑ n n =1 log1p(a). Hacerlo volcando los resultados con la función fprintf usando notación científica con 10 decimales (%.10e). 100 -8 Ejercicio 2 Dada la función f ( x) = a ln x + b cos x + ce y la tabla de datos: xi 0.24 0.95 1.73 2.23 2.99 f(xi) 0.23 -1.10 0.27 -0.29 1.00 x a) Plantear un problema de interpolación eligiendo un número de nodos mínimo para resolver dicho problema y que use obligatoriamente los nodos xi=0.24 y xi=2.99. Dar la expresión de la matriz H del sistema resultante y los valores de los coeficientes a, b y c. b) Dibujar en una misma gráfica en el intervalo [0.2:0.01:3], la función interpoladora f(x) (‘b’) obtenida en el apartado anterior y los datos usados en el problema de interpolación (‘rs’). c) Calcular la mejor aproximación a todos los datos de la tabla en el sentido de mínimos cuadrados usando la forma de la función f(x). Construir la matriz H del sistema sobredeterminado. Resolver el sistema y dar los valores de los coeficientes a, b y c. d) Calcular el vector residuo y el error del ajuste del aparatado anterior (suma de los residuos al cuadrado). ALGORÍTMICA NUMÉRICA. EXAMEN COMPUTATIONAL Julio 2016 Ejercicio 3 a) Implementar un script o una function de Matlab (utilizando el comando for o el comando while) que realice la siguiente iteración: 1 1 n = 0,1, 2,.... xn +1 = 1 + x + x 2 n n x = 7 0 4 hasta calcular x100 . Asignar a una variable s este valor. Guardar los valores xn en un vector llamado aprox_x. Dibujar la gráfica de aprox_x. (con el atributo ‘.’). ¿El método converge o diverge? En su caso, ¿a qué valor converge? b) A partir del vector aprox_x calcular los errores relativos de xn con respecto a s . Dibujar la gráfica de los errores relativos. c) ¿Cuántas iteraciones son necesarias para que xn alcance 15 cifras significativas de precisión? ¿Cuántas iteraciones son necesarias por cada cifra significativa de precisión? Dibujar la gráfica que muestre estos resultados. SOLUCIONES Ejercicio 1 x = 10.^-[1:16]; ok = log1p(x); apr = log(1+x); e_r = abs( (apr-ok) ./ ok ); cifras = -log10(e_r); semilogx(x,cifras) a = 1e-8; n = 1:100; vector = (-1).^(n+1) .* a.^n ./n; valortercero = sum(vector); valorbueno = log1p(a) valorsegunod = log(1+a) fprintf('valor bueno %.10e\n',valorbueno) fprintf('valor segundo %.10e\n',valorsegundo) fprintf('valor tercero %.10e\n',valortercero) Ejercicio 2 a) y b) Se da la solución de los tres posibles problemas a plantear y su solución xadicional(1)=0.95 xadicional(2)=1.73 xadicional(3)=2.23 yadicional(1)=-1.10 yadicional(2)=0.27 yadicional(3)=-0.29 ALGORÍTMICA NUMÉRICA. EXAMEN COMPUTATIONAL Julio 2016 for i=1:1:3 i xi = [0.24 xadicional(i) 2.99]'; fi= [0.23 yadicional(i) 1.00]'; H=[log(xi), cos(xi), exp(xi)] C=inv(H)*fi; a=C(1) b=C(2) c=C(3) x=[0.2:0.01:3]; b_x=[log(x);cos(x);exp(x)]; f_x=C'*b_x; subplot(2,2,i) plot(xi,fi,'rs',x,f_x,'b') str = sprintf(' Nodo adicional %d %f',i,xadicional(i)); title (str) end c) y d) xi = [0.24 0.95 1.73 2.23 2.99]'; fi= [0.23 -1.10 0.27 -0.29 1.00]'; H=[log(xi), cos(xi), exp(xi)] C=H\fi; a=C(1) b=C(2) c=C(3) residuo=fi - (H*C) Error = sum (residuo.^2) f_x=C'*b_x; subplot(2,2,4) plot(xi,fi,'rs',x,f_x,'b') str = sprintf(' Ajuste todos nodos'); title (str) Gráficas del problema ALGORÍTMICA NUMÉRICA. EXAMEN COMPUTATIONAL Julio 2016 Nodo adicional 1 0.950000 Nodo adicional 2 1.730000 2 1.5 1 1 0 0.5 -1 -2 0 1 2 3 0 0 Nodo adicional 3 2.230000 1 0 0 -5 -1 0 1 2 3 -2 0 1 Ejercicio 3 clear all aprox_x=zeros(1,101); aprox_x(1)=7/4; for k=1:100 aprox_x(k+1)=1+1/aprox_x(k)+1/(aprox_x(k)^2); end s=aprox_x(101), plot(aprox_x,'b.') s= 1.8393 Como se puede observar en la gráfica, el método converge al valor s= 1.8393 Erel=abs(aprox_x-s)/abs(s); semilogy(Erel,'b.') 2 3 Ajuste todos nodos 5 -10 1 2 3 ALGORÍTMICA NUMÉRICA. EXAMEN COMPUTATIONAL Julio 2016 Como se puede observar en la gráfica, son necesarias unas 65 iteraciones para alcanzar las 15 cifras significativas de precisión. Ncifras=floor(-log10(Erel)); plot(Ncifras,'b.') Como se puede observar en la gráfica, cada 5 iteraciones se alcanza una cifra más de precisión.