Grupo : Denise Ramos; Elaine Makyama; Fabricio Cazzaniga; Jordana Ayer; Juliana Rios; Mariana Albertini.
Capítulo 4. Estimação de Erros e
Refinamento Iterativo
Se x é uma aproximação para a solução x de Ax = b e o vetor residual r = b - A x tem a propriedade de r pequeno, nem sempre x x− será pequeno.
Exemplo 1:
O sistema linear Ax = b dado por
1 2 10001 2 1 2 3 3 0001 . = . x x
tem uma única solução x = (1,1)1. Uma aproximação ruim x = (3,0)1 tem o vetor residual r = b - A x = 3 3 0001 1 2 10001 2 3 0 0 0 0002 . − . = . ,
assim r ∞ = 0 0002. . Embora a norma do vetor residual seja pequena, a aproximação x =(3,0) não é boa, de fato x x− ∞ =2 .
A dificuldade neste exemplo é explicada notando que a solução do sistema representa a interseção das retas
l1: x1 + 2x2 = 3
l2: 1.0001x1 + 2x2 = 3.0001.
O ponto (3,0) está em l1 e as retas são quase paralelas. Isto implica que (3,0) também está perto da reta l2 mesmo que difira significantemente do ponto de interseção (1,1).
Figura 1:
Neste exemplo, podíamos esperar que a aproximação fosse precisa já que as retas são quase coincidentes.
Geralmente, não podemos confiar na geometria do sistema para dar uma indicação de quando os problemas podem ocorrer, no entanto, obtemos esta informação considerando a norma da matriz e sua inversa.
4.1. Teorema 1
Suponha que x é uma aproximação da solução de Ax = b, A é uma matriz não singular, e R é o vetor residual de x . Então para qualquer norma natural,
x x− ≤ r A−1 e (1) x x x A A r b − ≤ −1 , com x ≠ 0 e b ≠ 0. PROVA:
x x− = A r−1 ≤ A−1 r e ainda, se b = Ax, temos b ≤ A x , e
x x x A A b r − ≤ −1 .
A inequação do teorema 1 implica que a quantidade A e A A−1
providenciam uma indicação de uma conexão entre o vetor residual e a precisão da aproximação. Em geral, o erro relativo x x− x é de maior interesse e, pela inequação (1) , este erro é limitado pelo produto de A A−1 com o resíduo relativo para esta aproximação,
r
b . Qualquer norma conveniente pode ser usada para esta aproximação; a única restrição é que isto é usado em toda parte.
4.1.1. Definição 1
Norma infinita de um vetor é:
v
∞=
max
vi onde vi v e i = 1, ...,n
,
∈
Norma infinita de uma matriz é:A
∞=
max
aij onde j = 0,...,m
i =1n
4.1.2. Definição 2
O número condicional de uma matriz não singular A relativa à forma natural •
é K(A) = A A−1
Com esta notação, e as inequações do teorema 1 tornam-se
x x K A r A − ≤ ( ) e x x x K A r b − ≤ ( ) .
Para qualquer matriz não singular A e norma natural • ,
1= I = A A⋅ −1 ≤ A A⋅ −1 =K A( ) .
A matriz A é bem-comportada (matriz bem-condicionada) se K(A) é próxima a um e não bem-comportada (mal-condicionada), quando K(A) é significantemente maior que um. O comportamento nesta instância refere-se à segurança relativa que um vetor residual implica numa solução aproximadamente precisa.
Exemplo 2:
Uma matriz para o sistema considerado no exemplo 1 foi
A = 1 2
10001 2. ,
onde A ∞ = 3 0001. . Esta norma não poderia ser considerada grande. No entanto, A− = − − 1 10000 10000 5000 5. 5000 , então A − ∞ = 1 20000 ,
e, para a norma infinita , K(A) = (20000)(3.0001) = 60002. O tamanho do número condicional para este exemplo nos impediria de fazer rápidas decisões sobre precisão baseadas no resíduo de uma aproximação.
4.2. Número Condicional
Apesar de na teoria o número condicional de uma matriz depender totalmente das normas da matriz e de sua inversa, na prática, o cálculo da inversa é objeto do erro de arredondamento e é dependente da precisão com cada cálculo realizado. Se as operações envolvem aritmética com t dígitos significativos de precisão, o número condicional aproximado da matriz A é a norma da matriz vezes a norma da aproximação para a inversa de A, que é obtida usando dígito_t aritmético. De fato, este número condicional também depende do método usado para calcular a inversa de A.
Assumindo que a solução aproximada de um sistema linear Ax = b está sendo determinada usando dígito_t aritmético e eliminação Gaussiana, pode ser mostrado que o vetor residual r para a aproximação x tem a propriedade
(2) r ≈10−t A x .
Para esta aproximação, uma estimativa para o número condicional efetivo no dígito_t aritmético pode ser obtido sem ter que inverter a matriz A. Na verdade, a aproximação assume que todas as operações necessárias para determinar o residual são feitas em dupla precisão aritmética (que é dígito_2t). Esta técnica não aumenta muito o esforço computacional e elimina muitas perdas de precisão envolvidas com subtração de números aproximadamente iguais que ocorrem no cálculo de residual.
A aproximação para o dígito_t número condicional K(A) vem da consideração do sistema linear.
Ay = r.
A solução deste sistema pode ser facilmente aproximada, desde que os multiplicadores para o método de eliminação Gaussiana já foram calculados. Na verdade y , a solução aproximada de Ay = r satisfaz
(3) y A r A≈ −1 = −1(b Ax− )=A b A Ax x x−1 − −1 = − ;
então y é uma estimativa do erro na aproximação da solução do sistema original. A equação (2) implica que
(
)
y ≈ − =x x A r−1 ≤ A−1 r ≈ A−1 A A x−1 =10−t x K A( ) .
Isto dá a aproximação para o número condicional envolvida com a solução do sistema Ax = b usando a eliminação Gaussiana e o tipo do dígito_t da aritmética descrito
(4) K A y
x
t
( )= 10 .
Exemplo 3:
O sistema linear dado por 3 3330 15920 10 333 2 2220 16 710 9 6120 15611 51791 16852 1 2 3 15913 28 544 8 4254 . . . . . . . . . . − = x x x tem a solução exata x=(1,1,1)t.
Usando a eliminação Gaussiana e dígito_5 de arredondamento aritmético leva sucessivamente às matrizes de argumento
3 3330 15920 10 333 15913 0 10596 16501 10580 0 74514 6 5250 7444 9 . . . . . − − − − e
3 3330 15920 10 333 15913 0 10596 16501 10580 0 0 5 0790 4 7000 . . . . − − − − −
A solução aproximada para o sistema é x = (1.2001, 0.99991, 0.92538)t.
O vetor residual correspondendo a x é computado na dupla precisão para ser r = b - A x = 15913 28 544 8 4254 3 3330 15920 10 333 2 2220 16 710 9 6120 15611 51791 16852 12001 0 99991 0 92538 0 00518 0 27413 018616 . . . . . . . . . . . . . . . . − − = − − ; então r ∞ = 0 27413. .
A estimativa para o número condicional dado na discussão anterior é obtida pela primeira solução do sistema Ay = r para y :
3 3330 15920 10 333 2 2220 16 710 9 6120 15611 51791 16852 1 2 3 0 00518 0 27413 018616 . . . . . . . . . . . − = − − y y y .
Isto implica que y = (-0.20008, 8.9987*10-5, 0.074607)t. Usando a estimativa na
Equação (4), temos (5) K A y x ( ) ( . ) . ≈ ∞ = = ∞ 10 10 0 20008 12001 16672 5 5 .
Para determinar a solução exata do número condicional de A, devemos construir A-1. Usando dígito_5 de arredondamento aritmético para os cálculos temos a aproximação:
A− − − − − − − − − − = − − − − − 1 4 1 1 5 4 4 5 1 1 11701 10 14983 10 8 5416 10 6 2782 10 12124 10 3 0662 10 8 6631 10 13846 10 19689 10 . * . * . * . * . * . * . * . * . * ,
o teorema 7.10 implica que A−
∞ = ∞ =
1 10041. e A 15934.
Como consequência, a matriz A mal-condicionada tem
K A( ) ( .= 10041 15934)( )=15999 .
A estimativa em (5) é fechado para K(A) e requer consideravelmente menos esforço computacional.
Desde que a solução real x(1, 1, 1)t é conhecido para este sistema, podemos calcular ambos x x x − = = − ∞ ∞ ∞ 0 2001 0 2001 1 0 2001 . e x - x . . .
Os limites de erro dados no teorema (1) para esses valores são
(
)(
)
x x K A r A − ≤ = = ∞ ∞ ∞ ( ) 15999 0 27413. . 15934 0 27525e
(
)(
)
x x x K A r b − ≤ = = ∞ ∞ ∞ ∞ ( ) 15999 0 27413. . 15913 0 27561.Na equação (3), usamos a estimativa y x x≈ − onde y é a solução aproximada
para o sistema Ay = r. Em geral, x + y é uma aproximação mais precisa para a solução do sistema linear Ax = b que a aproximação original x . O método usando esta suposição é chamada refinamento iterativo, ou melhoramento iterativo, e consiste de iterações realizadas no sistema no qual o lado direito é o vetor residual para aproximações sucessivas até que uma precisão satisfatória resulte.
Se o processo é aplicado usando dígito_t aritmético e se K A q
∞( ) 10 , então ≈
depois de K iterações do refinamento iterativo a solução tem aproximação do menor t e K (t - q) dígitos corretos. Se o sistema é bem-condicionado, uma ou duas iterações indicará que a solução é precisa. Há uma possibilidade de crescimento significante no sistema mal-condicionado que K t
∞ 10 . Naquela situação, a precisão crescida poderá ser usada para os
cálculos.
4.3. Algoritmo
INPUT: O número de equações(n), as entradas aij, 1≤ i, j ≤ n da matriz A, as
entradas bi , 1≤ i ≤ n de B; o número máximo de iterações N; a tolerância TOL; o número de
OUTPUT: a aproximação xx=(xx1,..., xxn)' ou a mensagem que o número de
iterações foi excedida e uma aproximação COND para K∞(A).
Passo 0: resolver o sistema Ax = b para x1,...,xn pela eliminação Gaussiana
salvando os multiplicadores mij, j = i+1,i+2,...,n, e i=1,2,...,n-1 e trocas de filas.
Passo 1: K = 1.
Passo 2: enquanto (N ≥ K) faça os passos 3 - 8.
Passo 3: para i = 1,2,...,n (Calcule r.) ri = bi - Σ
j x
n j
=1aij
Passo 4: resolver o sistema linear Ay = r usando eliminação Gaussiana com a mesma que no passo 0.
Passo 5: para i = 1,2,..., n faça xxi = xi + yi.
se k=1 então COND= y xx t ∞ ∞ 10 . Passo 6: se x xx− ∞< TOL então OUTPUT (xx);
OUTPUT (COND);
STOP. (procedimento terminado com sucesso) Passo 7: k = k+1.
Passo 9: OUTPUT ('Máximo número de iterações foi excedido'); OUTPUT (COND);
STOP. (procedimento terminado sem sucesso)
OBS: Se o dígito-t aritmético for usado, uma condição de parada recomendada para o procedimento no passo 6 é fazer iterações até yi( )k ≤10 , para cada i = 1,2,...,n. −t
Exemplo 4:
No exemplo 3 achamos a aproximação para o problema que tem sido considerado, usando dígito_5 aritmético e eliminação Gaussiana, para ser
x( )1 =( .12001 0 99991 0 92538, . , . )t
e a solução para Ay = r(1) para se
y( )1 = −( .0 20008 8 9987 10 0 074607, . * −5, . )t,
Pelo passo 5 do algoritmo, isto implica que x( )2 =x( )1 +y( )1 =( .10000 10000 0 99999, . , . )t
e o erro real nesta aproximação é
x x− = ∞ − ( ) * 2 5 1 10 .
Usando a sugerida técnica de parada para o algoritmo, computamos r( )2 = −b Ax( )2 e resolvemos o sistema Ay(2) = r(2), que dá
y( )2 =( .15002 10 2 0951 10* −9, . * −10, .10000 10* −5)t. Desde que y( )2 10 5 ∞ − ≤ , concluímos que x( )3 =x( )2 +y( )2 =( .10000 10000 10000, . , . )t
é preciso.
Através desta seção tem sido assumido que no sistema linear Ax = b, A e b pode ser representado exatamente. Realisticamente, as entradas aij e bj poderá ser alterada ou
perturbada por muitos δa e bij δ j, causando um sistema linear (A + δA)x = b + δb
para ser resolvido no lugar de Ax = b. Normalmente, se δA e b são pequenos (na ordem δ
de 10-t, o dígito_t aritmético pode produzir uma solução x para cada x x− é
correspondentemente pequeno. No entanto, no caso de um sistema mal-condicionado, vimos que mesmo se A e b são representados exatamente, erros de arredondamento podem causar x x− grande. O seguinte teorema relata as perturbações dos sistemas lineares para o
número condicional de uma matriz.
4.4. Teorema 2
Suponha que A é não singular e δA
A−
1
1
A solução x para (A + δA) x = b + δb aproxima a solução x de Ax = b com erro
estima (6) x x x K A K A A A b b A A − ≤ − + ( ) ( ) 1 δ δ δ
A estimativa na desigualdade (6) afirma que se a matriz A é bem-condicionada então pequenas mudanças em A e b produzem correspondentemente pequenas mudanças na
solução x. Por outro lado, se A é mal-condicionado, então pequenas mudanças em A e b podem produzir grandes mudanças em x.
O teorema é independente do procedimento numérico particular usado para resolver Ax = b. Isto pode ser mostrado, por meio da análise do erro atrasado de Wilkinson, que se a eliminação Gaussiana com pivoteamento é usada para resolver Ax = b no dígito_t aritmético, a solução numérica x é a solução real do sistema linear
(
A dA)
b, onde dA f(n)10 max i,j,k a 1 t ij (k) + = ∞ ≤ − .Wilkinson achou na prática que f(n)≈n e, na pior das hipóteses,
f n( )≤101. (n3+3n2).
4.5. Programa
//Objetivo do programa : Encontrar a aproximacao xx = (xx1,...,xxn) ou a // mensagem de que o numero de iteracoes foi excedido // e uma aproximacao COND para K(A)
// O programa foi desenvolvido em Linguagem C
//Dificuldades : 1)Implementar a resolucao do sistema Ay = r, usando o metodo // de eliminacao de Gauss, devido ao numero de iteracoes; // 2)Implementar o calculo do maximo valor absoluto dos vetores // y, xx e do vetor denominado "sb", que e a subtracao do vetor // xx de x.
#include <stdio.h> #include <conio.h>
#include <math.h> #include <stdlib.h>
#ifdef __cplusplus
double max (double value1, double value2);
double max(double value1,double value2) {
return ( (value1 > value2) ? value1 : value2); }
#endif
void gauss(); //Metodo de eliminacao de gauss static char temp[10];
double A[11][11]; double X,Y,XX,SB,COND,TOL,B[11],xx[11],x[11],y[11],r[11],sb[11]; int aux,i,j,n,t,s,k,K,N; //programa principal void main() { int i,j; clrscr();
printf ("Digite a ordem n da matriz quadrada A (max. 10): "); gets(temp);
printf ("\n\n"); n = atoi(temp); for (i=1; i<=n;i++) {
for (j=1; j<=n; j++) {
printf ("Entre com valor de A[%d][%d]==> ",i,j); gets (temp);
A[i][j]=atof(temp); }
printf ("Entre com o valor de b[%d]===> ",i); gets (temp);
B[i]=atof(temp); }
printf ("Entre com o numero de digitos de precisao t:"); scanf ("%d",&t);
printf ("Entre com o numero maximo de iteracoes:"); scanf ("%d",&N);
printf ("Entre com a tolerancia:"); scanf ("%d",&TOL);
gauss(); //para resolver o sistema Ax = b K=1;
do{
for (i=1;i<=n;i++) //calculo de r {
s=0;
for (j=1;j<=n;j++) s = s + (A[i][j]*x[j]); r[i] = B[i] - s;
}
aux = 1; //variavel de controle gauss(); //para resolver Ay=r
for (i=1;i<=n;i++) xx[i]=x[i]+y[i]; //calculo da aproximacao xx if (K==1) { Y = y[1]; XX = xx[1]; for (j=1;j<=n;j++) { sb[j] = x[j] - xx[j]; //subtrai xx de x
Y = max(abs(Y),abs(y[j+1])); //pega o maximo valor, em modulo, do vetor y XX = max(abs(XX),abs(xx[j+1])); //pega o maximo valor, em modulo, de xx }
COND = (Y/XX)*(pow(10,t)); //calcula o valor da aproximacao COND para K(A) }
SB = sb[1]; for (j=1;j<=n;j++)
//calcula o maximo valor, em modulo, da subtracao x - xx if (SB < TOL) //se tal valor for menor que a tolerancia,
{ //retorna o valor da aproximacao xx e da aproximacao COND para K(A) clrscr();
printf ("Os valores de xx sao: \n"); for (j=1; j<=n; j++)
{
printf ("\nxx[%d]= %.4f",j,xx[j]); }
printf("\nO valor de COND e %d. ",&COND); getchar();
}
K++; //incrementa K
for (j=1;j<=n;j++) x[j]=xx[j]; }while(N>=K);
if (SB >= TOL) //se tal valor for maior que a tolerancia,
{ //retorna mensagem de que numero de iteracoes foi excedido e clrscr(); //o valor da aproximacao COND para K(A)
printf("\nMaximo numero de iteracoes foi excedido!"); printf("\nO valor de COND e %d. ",&COND);
getchar(); }
//resolve o sistema Ax=b e Ay=r, pelo metodo de eliminacao de Gauss void gauss() { int l; double m; for (k=1;k<=n-1;k++) { for (i=k+1;i<=n;i++) { m=A[i][k]/A[k][k]; A[i][k]=0; for (j=k+1;j<=n;j++) { A[i][j]=A[i][j]-(m*A[k][j]); }
if (aux==1) r[i]=r[i]-m*r[k]; //se for o sistema Ay=r else B[i]=B[i]-m*B[k]; //se for o sistema Ax=b }
}
if (aux==1) //se for o sistema Ay=r {
y[n]=r[n]/A[n][n]; for (l=n-1;l>=1;l--) {
for (j=l+1;j<=n;j++) { y[l]=y[l]+A[l][j]*y[j]; } y[l]=(r[l]-y[l])/A[l][l]; } }
else //se for o sistema Ax=b { x[n]=B[n]/A[n][n]; for (l=n-1;l>=1;l--) { x[l]=0; for (j=l+1;j<=n;j++) { x[l]=x[l]+A[l][j]*x[j]; } x[l]=(B[l]-x[l])/A[l][l]; } } }