UNIVERSIDADE DO MINHO Licenciatura em Ciências da Computação Análise Numérica Exame de recurso Duração: 2 horas (+30 minutos de tolerância) EXAME COM CONSULTA 2 de Fevereiro de 2009 1. No formato duplo da norma IEEE, um número x normalizado expressa-se na forma x = ± (1.b1 b2 · · · b52 )2 × 2E onde bi = 0 ou bi = 1 para cada i = 1, · · · , 52 e −1022 ≤ E ≤ 1023. a) Com este formato, o maior número que se pode representar [no Matlab este número é realmax] é ¡ ¢ 2 − 2−52 × 21023 = 21024 − 2971 mas, no Matlab, a condição realmax == 2ˆ1024 − 2ˆ971 produz o valor lógico 0. Porquê? b) Determine os valores do expoente E e dos bits bi (i = 1, · · · , 52) na representação do número racional x = 415 , em formato duplo da norma IEEE 32 (nota: deve explicar o processo que usou para resolver esta questão). a) No Matlab calcule os valores de √ p = √1011 + 2 q = 1011 − 1 A=p−q B = (p2 − q 2 ) / (p + q) C = 3/ (p + q) Na sua folha de respostas, escreva o valores de p, q, A, B e C obtidos em ”format long”. b) Qual dos números A, B e C lhe parece que tem mais algarismos correctos? Justifique a sua escolha (note-se que, em aritmética exacta, é A = B = C mas no Matlab estes números coincidem em apenas alguns algarismos significativos). 2. Suponha que de uma certa função f se conhecem apenas os valores yi = f (xi ) nos nós xi = i × h, com h = 0.1 e i = 0 : 10 e que pretende usar um polinómio interpolador de grau não superior a 3 para aproximar o valor de f (0.89). a) Seja p3 o polinómio que interpola f nos nós x0 = 0, x1 = 0.1, x2 = 0.2 e x3 = 0.3, e seja q3 o polinómio que interpola f nos nós x7 = 0.7, x8 = 0.8, x9 = 0.9 e x10 = 1.0. Qual dos valores p3 (0.89) e q3 (0.89) será, em princı́pio, uma melhor aproximação para f (0.89)? Porquê? ¯ ¯ b) Admitindo que max ¯f (iv) (x)¯ ≤ 2, use a expressão do erro do polinómio x∈[0,1] interpolador para encontrar majorantes para os erros |f (0.89) − p3 (0.89)| e |f (0.89) − q3 (0.89)|. 3. Considere o polinómio a seguir definido r(x) = x5 − 4.4x4 + 7.05x3 − 7.062x2 + 6.05x − 2.662. a) Partindo da aproximação inicial x0 = 1, use o método de Newton-Raphson para iterar até que duas aproximações sucessivas coincidam em todos os algarismos das representações dadas em ”format long”. Na sua folha de respostas, escreva apenas os valores obtidos nas duas primeiras e nas duas últimas iterações. Determine o número de iterações necessárias. b) Com x0 = 2, repita o procedimento anterior. Por que que razão o número de iterações em a) foi bastante maior? 4. Considere as matrizes seguintes · ¸ · ¸ · ¸ ² 1 1 0 ² 1 A= , L= eU= . 1 1 ²−1 1 0 1 − ²−1 Uma vez que se tem A = L · U , para determinar a solução do sistema Ax = b, podemos resolver, Ly = b e U x = y. a) Para resolver o sistema, no caso de ser ² = 2−52 e b = [10, 1]t , defina no Matlab as matrizes L e U e use a função ST riangular desenvolvida nas aulas teórico-práticas para encontrar as soluções de Ly = b e U x = y. ¡ 9 ²−10 ¢t b) Tendo em conta que a solução exacta é x = ²−1 , ²−1 , parece-lhe que o erro da solução obtida na alı́nea anterior é grande ou pequeno? Use a teoria do condicionamento de sistemas de equações lineares para explicar o erro cometido na aproximação calculada. c) Uma vez que podemos escrever A = P · L · U com · ¸ · ¸ · ¸ 1 0 1 1 0 1 L= ,U = eP = , ² 1 0 1−² 1 0 podemos usar esta decomposição para resolver o mesmo sistema. Será de esperar uma aproximação melhor do que a obtida em a)? Porquê? questão 1.a 1.b cotação 1.5 2 2.a 1.5 2.b 3.a 2 2 3.b 4.a 2 2 4.b 5.a 2 2 5.b 5.c 1.5 1.5 Total 20 Resolução 1. a) Como é dito no próprio enunciado, o número ¡ ¢ realmax = 2 − 2−52 × 21023 é o maior número que se pode representar no formato duplo da aritmética IEEE. A tentativa de representar qualquer número maior do que realmax produzirá um ”Inf ” (recordemos que o sistema reserva uma representação especial para números cujo expoente é superior a 1023). A representação do número 21024 produz Inf e, de acordo com as regras da aritmética IEEE, a representação de 21024 − 2971 também produz Inf . Portanto, as representações de realmax e Inf são diferentes, logo, no Matlab, a condição realmax == 21024 − 2971 dá o valor lógico 0. b) Uma forma possı́vel de resolver esta questão é usar a função dec2bin do Matlab que produz a representação binária a partir da representação decimal de um número inteiro não-negativo; no Matlab, À dec2bin(415) dá a sequência binária 110011111. Assim, no formato da aritmética IEEE, tem-se (para simplificar, não se representam os últimos bits que são todos iguais a 0) 415 = (1.10011111 · · · )2 × 28 . A divisão por uma potência de 2 é muito simples em binário, basta subtrair ao expoente do dividendo o expoente do divisor (a mantissa não se altera). Portanto, sendo 32 = 25 , temos 415 = (1.10011111 · · · )2 × 23 . 32 Concluindo, E=3 b1 = b4 = b5 = b6 = b7 = b8 = 1, e os restantes bits são nulos (o bit 1 à esquerda do ponto é o chamado bit implı́cito e não é representado). Para se chegar ao mesmo resultado também se poderiam usar as funções desenvolvidas nas aulas teóricopráticas para a conversão de representações de números fraccionários. Na norma IEEE, o expoente E é dado pela representação binária de E +1023 (enviesamento), neste caso pela sequência (10000000010)2 = 1026. a) Em ”format long” obtêm-se, no Matlab, os seguintes resultados p = 3.162277660200002e + 005 q = 3.162277660152568e + 005 A = 4.743400495499373e − 006 B = 4.743392363976824e − 006 C = 4.743416490240710e − 006 b) Como se pode observar, os valores p e q coincidem em muitos dos primeiros algarismos significativos pelo que ocorre cancelamento subtractivo no cálculo da diferença A = p − q. Analogamente, por ser p2 ≈ q 2 , ocorre cancelamento subtractivo na diferença p2 − q 2 (no cálculo de B). Deve ser enfatizado que o problema que ocorre em qualquer uma destas subtracções fica a dever-se ao facto de não serem exactas as representações de p e q e pequenos erros relativos nestas quantidades produzirem um enorme erro relativo na diferença. Em particular, para A = p − q, temos, com os valores aproximados pe = p(1 + εp ) e qe = q(1 + εq ), que o valor calculado da diferença é dado por e = (e A p − qe) (1 + ε− ) = p(1 + εp ) (1 + ε− ) − q(1 + εq ) (1 + ε− ) onde εp , εp e ε− são pequenas quantidades de valor absoluto inferior à unidade de erro de arredondamento, digamos ². Escrevendo, para simplificar, 1 + εp = (1 + εp ) (1 + ε− ) 1 + εq = (1 + εq ) (1 + ε− ) onde |εp | e |εq | são quantidades da ordem de grandeza de ², tem-se para o erro absoluto na diferença, ¯ ¯ ¯e ¯ ¯A − A¯ = |pεp − qεq | ≤ |pεp | + |qεq | . Este erro absoluto não é grande mas para o erro relativo na diferença obtemos ¯ ¯ ¯A ¯ e ¯ − A ¯ |pεp | + |qεq | ¯≤ ¯ ¯ A ¯ |p − q| que é tanto maior quanto mais próximos estiverem p e q. Se fossem exactas as representações de p e q, terı́amos simplesmente e = (p − q) (1 + ε− ) A e o erro relativo seria pequeno de acordo com ¯ ¯ ¯A ¯ ¯ e − A¯ ¯ ¯ ≤ |ε− | ≤ ². ¯ A ¯ Por outro lado, no cálculo de C não ocorre cancelamento subtractivo uma vez que o denominador é a soma de duas quantidades positivas; portanto, C é o valor que tem mais algarismos correctos. a) Será, em princı́pio, o polinómio q3 aquele que melhor aproxima a função no ponto 0.89 por ser o polinómio interpolador em nós que estão mais próximos daquele ponto. No caso do polinómio p3 , o ponto x = 0.89 nem sequer pertence ao intervalo dos nós de interpolação que são x0 = 0, x1 = 0.1, x2 = 0.2 e x3 = 0.3. A expressão do erro do polinómio interpolador que vai ser usada na alı́nea b) reflecte justamente a forma como o erro depende das diferenças x − xk . b) A expressão do erro do polinómio interpolador pn que interpola uma função f em n+1 nós x0 , · · · , xn é f (x) − pn (x) = f (n+1) (ξx ) Wn (x) (n + 1)! onde ξx é um ponto que pertence a um intervalo que contem o ponto x e os nós de interpolação xk (k = 0, · · · , n) e Q Wn (x) = nk=0 (x − xk ) é o polinómio nodal. Usando esta expressão no caso presente (n = 3) e admitindo que ¯ ¯ max ¯f (iv) (x)¯ ≤ 2, x∈[0,1] podemos escrever 2 (0.89 − 0) (0.89 − 0.1) (0.89 − 0.2) (0.89 − 0.3) ≈ 2.4×10−2 , 4! 2 |f (0.89) − q3 (0.89)| ≤ (0.89 − 0.7) (0.89 − 0.8) (0.89 − 0.9) (0.89 − 1.0) ≈ 1.6×10−6 4! o que mostra que, tal como se disse antes, o erro |f (0.89) − q3 (0.89)|, do polinómio q3 , será, em princı́pio (dizemos assim porque os valores calculados são majorantes, não os erros efectivamente cometidos), menor do que o erro |f (0.89) − p3 (0.89)|, do polinómio p3 . |f (0.89) − p3 (0.89)| ≤ a) No Matlab, podemos definir a função polinomial r = inline(0 xˆ5 − 4.4 ∗ xˆ4 + 7.05 ∗ xˆ3 − 7.062 ∗ xˆ2 + 6.05 ∗ x − 2.6620 ) e a sua derivada dr = inline(0 5 ∗ xˆ4 − 17.6 ∗ xˆ3 + 21.15 ∗ xˆ2 − 14.124 ∗ x + 6.050 ). Começando com À x = 1 e repetindo o comando À x = x − r(x) / dr(x) obtemos x = 1.05042016806723 x = 1.07528955732180 ··· x = 1.09999998496103 x = 1.09999998496103 (na 1a iteração) (na 2a iteração) (na 22a iteração) (na 23a iteração) Nota importante: dependendo da fórmula utilizada para o cálculo das iterações, pode acontecer que não se chegue a dois valores consecutivos iguais; esta ”gralha” do enunciado foi tida em conta na correcção dos exames. Por exemplo, se o polinómio r e a derivada dr forem forem definidos na forma dos vectores dos coeficientes À r = [1, −4.4, 7.05, −7.062, 6.05, −2.662] À dr = [5, −17.6, 21.15, −14.124, 6.05] e usarmos a função polyval do Matlab (que implementa o método de Horner) para calcular o valor dos polinómios em cada ponto, com x = 1 e repetindo o comando À x = x − polyval(r, x) / polyval(dr, x) obtemos x = 1.05042016806723 x = 1.07528955732180 ··· x = 1.09999998741312 x = 1.10000000192645 (na 1a iteração) (na 2a iteração) (na 22a iteração) (na 23a iteração) b) Com x = 2 obtem-se sucessivamente x = 2.50561797752810 x = 2.31986365460309 ··· x = 2.20000000000000 x = 2.20000000000000 (na 1a iteração) (na 2a iteração) (na 7a iteração) (na 8a iteração) O método de Newton tem convergência quadrática no caso de raı́zes simples (isto quer dizer que ek+1 ≈ C · e2k onde ek representa o erro na k-ésima aproximação e C uma constante). Este comportamento foi verificado no caso da raiz igual a 2, que é simples, mas não no caso da raiz 1.1, que é dupla. De facto, tem-se r(x) = (x2 + 1)(x − 1.1)2 (x − 2.2) A convergência do método de Newton para a raiz dupla x = 1.1 é apenas linear, por esta razão foram necessárias mais iterações. a) Definidas no Matlab as matrizes L e U tais que A = L · U , a solução de Ax = b pode ser obtida à custa da resolução do dois sistemas triangulares. De facto, tem-se L(U x) = b e com Ux = y resolvemos, em primeiro lugar, o sistema Ly = b e depois o sistema U x = y. Executando no Matlab À y = ST riangular(L, b); x = ST riangular(U, y) obtemos a ”solução” −8.00000000000000 10.00000000000000 b) O erro na primeira componente é catastrófico. O valor exacto 2−529 −1 é praticamente igual a −9 mas, no seu lugar, obtivemos −8. Isto acontece porque o método usado é numericamente instável. Explicaremos isto usando o importante conceito de número de condição de um sistema de equações Ax = b que é definido por ° ° cond(A) = kAk · °A−1 ° . Pequenos erros (iniciais ou de arredondamento) serão mais ou menos ampliados dependendo da grandeza de cond(A). No caso presente, o sistema inicial é bem condicionado (isto pode ser comprovado executando no Matlab À cond(A) que dá um valor próximo de 2.6) mas o mesmo não é verdade para os sistemas triangulares já que tem cond(L) = cond(U ) ≈ 2 × 1031 . Com tais números de condição, qualquer pequeno erro de arredondamento será ampliado de forma catastrófica e produzirá uma solução errada. Uma análise mais detalhada dos erros, permite concluir que a solução do primeiro sistema obtida com y = ST riangular(L, b) apresenta um pequeno erro relativo na segunda componente já que o número (correspondente à solução exacta) 1 − 10 × 252 não tem representação exacta no sistema. Este pequeno erro relativo será ampliado pelo número de condição cond(U ) na resolução do sistema triangular superior. Dizemos que, neste caso, o método é numericamente instável porque ele transforma um sistema bem condicionado num sistema mal condicionado. c) De acordo com o que explicámos antes sobre os números de condição dos sistemas de equações, será de esperar uma solução sem erros muito grandes, se usarmos esta factorização A = P · L · U . Com efeito, neste caso, temos cond(L) = 1 cond(U ) = cond(A) e, como se pode concluir, não pioramos o condicionamento do sistema inicial. De facto, esta decomposição equivale afinal ao método de eliminação de Gauss com pivotação parcial que neste caso produz a solução correcta (isto é, com pequenos erros de arredondamento).