Exame de Recurso - NECC

Propaganda
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).
Download