| | | | |

1.2 Métodos Iterativos

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

Em revisão

1.2.1 GMRES

Em revisão

O GMRES (do inglês, Generalized Minimal Residual Method1111endnote: 11Desenvolvido por Yousef Saad e H. Schultz, 1986. Fonte: Wikipedia.) é um método de subespaço de Krylov1212endnote: 12Alexei Nikolajewitsch Krylov, 1863 - 1945, engenheiro e matemático russo. Fonte: Wikipédia. e é considerado uma das mais eficientes técnicas para a resolução de sistemas lineares gerais e de grande porte (esparsos).

Método de Subespaço de Krylov

Em revisão

A ideia básica é resolver o sistema linear

Ax=b (1.57)

por um método de projeção. Mais especificamente, busca-se uma solução aproximada xmn no subespaço afim x0+𝒦m de dimensão m, impondo-se a condição de Petrov1313endnote: 13Georgi Iwanowitsch Petrov, 1912 - 1987, engenheiro soviético. Fonte: Wikipedia.-Galerkin1414endnote: 14Boris Galerkin, 1871 - 1945, engenheiro e matemático soviético. Fonte: Wikipédia.

bAxmm, (1.58)

onde m também é um subespaço de dimensão m. Quando 𝒦m é um subespaço de Krylov, i.e.

𝒦m(A,r0)=span{r0,Ar0,A2r0,,Am1r0}, (1.59)

temos o método de subespaço de Krylov. Aqui, temos o resíduo

r0=bAx0, (1.60)

sendo x0 uma aproximação inicial para a solução do sistema. Notamos que com isso, temos que a aproximação calculada é tal que

A1bxm=x0+qm1(A)r0, (1.61)

onde qm1 é um dado polinômio de grau m1. No caso particular de x0=0, temos

A1bqm1(A)b. (1.62)

Diferentes versões deste método são obtidas pelas escolhas do subespaço m e formas de precondicionamento do sistema.

GMRES

Em revisão

O GMRES é um método de subespaço de Krylov assumindo m=A𝒦m, com

𝒦m=𝒦m(A,v1)=span{v1,Av1,,Am1v1}, (1.63)

onde v1=r0/r0 é o vetor unitário do resíduo r0=bAx0 para uma dada aproximação inicial x0 da solução do sistema Ax=b.

Vamos derivar o método observando que qualquer vetor x em x0+𝒦m pode ser escrito como segue

x=x0+Vmy (1.64)

onde, Vm=[v1,,vm] é a matriz n×m cujas colunas formam uma base ortogonal {v1,,vm} de 𝒦m e yRm. Aqui, Vm é computada usando-se o seguinte método de Arnoldi1515endnote: 15Walter Edwin Arnoldi, 1917 - 1995, engenheiro americano estadunidense. Fonte: Wikipédia.- Gram1616endnote: 16Jørgen Pedersen Gram, 1850 - 1916, matemático dinamarquês. Fonte: Wikipédia.-Schmidt1717endnote: 17Erhard Schmidt, 1876 - 1959, matemático alemão. Fonte: Wikipédia. modificado [9, Subseção 6.3]:

  1. 1.

    Dado v1 de norma 1

  2. 2.

    Para j=1,,m:

    1. (a)

      wjAvj

    2. (b)

      Para i=1,,j:

      1. i.

        hi,j(wj,vi)

      2. ii.

        wjwjhi,jvi

    3. (c)

      hj+1,jwj

    4. (d)

      Se hj+1,j0, então pare.

    5. (e)

      vj+1wj/hj+1,j

Seja, então, H¯m=[hi,j]i,j=1m+1,m a matriz de Hessenberg1818endnote: 18Karl Adolf Hessenberg, 1904 - 1959, engenheiro e matemático alemão. Fonte: Wikipédia. cujas entradas não nulas são computadas pelo algoritmo acima (Passos 2(a)i-ii). Pode-se mostrar que [9, Proposição 6.5]

J(y) =bAx (1.65)
=bA(x0+Vmy) (1.66)
=βe1H¯my (1.67)

onde, β=r0.

A aproximação GMRES xm é então computada como

xm =x0+Vmym, (1.68)
ym =minyβe1H¯my (1.69)

Observamos que este último é um pequeno problema de minimização, sendo que requer a solução de um sistema (m+1)×m de mínimos quadrados, sendo m normalmente pequeno.

Em resumo, a solução GMRES xm é computada seguindo os seguintes passos:

  1. 1.

    Escolhemos uma aproximação inicial x0 para a solução de Ax=b.

  2. 2.

    Computamos o resíduo r0=bAx0.

  3. 3.

    Computamos o vetor unitário v1=r0/r0.

  4. 4.

    Usamos o método de Arnoldi-Gram-Schmidt modificado para calculamos uma base ortogonal Vm de 𝒦m e a matriz de Hessenberg H¯m associada.

  5. 5.

    Computamos ym=minyβe1H^my.

  6. 6.

    Computamos xm=x0+Vmy.

Observação 1.2.1 (Convergência).

Pode-se mostrar que o GMRES converge em ao menos n passos.

Observação 1.2.2 (GMRES com a ortogonalização de Householder).

No algoritmo acima, o método modificado de Gram-Schmidt é utilizado no processo de Arnoldi. Uma versão numericamente mais eficiente é obtida quando a transformação de Householder1919endnote: 19Alston Scott Householder, 1904 - 1993, matemático americano estadunidense. Fonte: Wikipédia. é utilizada. Consulte mais em [9, Subsetion 6.5.2].

Observação 1.2.3 (GMRES com Reinicialização).

O restarted GMRES é uma variação do método para sistemas que requerem uma aproximação GMRES xm com m grande. Nestes casos, o método original pode demandar um custo muito alto de memória computacional. A ideia consiste em assumir m pequeno e, caso não suficiente, recalcular a aproximação GMRES com x0=xm. Este algoritmo pode ser descrito como segue.

  1. 1.

    Computamos r0=bAx0, β=r0 e v1=r0/β

  2. 2.

    Computamos Vm e H^m pelo método de Arnoldi

  3. 3.

    Computamos

    ym=minyβe1H^my (1.70)
    xm=x0+Vmym (1.71)
  4. 4.

    Se bAxm é satisfatória, paramos. Caso contrário, setamos x0:=xm e voltamos ao passo 1.

A convergência do restarted GMRES não é garantida para matrizes que não sejam positiva-definidas.

Exercícios

Em revisão

E. 1.2.1.

Considere o problema discreto do Exercício 1.1.3.

  1. a)

    Compute a solução com a implementação restarted GMRES

    scipy.sparse.linalg.gmres.

  2. b)

    Por padrão, o intervalo de iterações entre as inicializações é restart=20. Compare o desempenho para diferentes intervalos de reinicialização.

  3. c)

    Compare o desempenho entre as abordagens dos ítens a) e b) frente a implementação do método de eliminação gaussiana disponível em

    scypi.sparse.linalg.spsolve.

E. 1.2.2.

Considere o problema discreto trabalhado no Exemplo 1.1.2.

  1. a)

    Compute a solução com a implementação restarted GMRES

    scipy.sparse.linalg.gmres.

  2. b)

    Por padrão, o intervalo de iterações entre as inicializações é restart=20. Compare o desempenho para diferentes intervalos de reinicialização.

  3. c)

    Compare o desempenho entre as abordagens dos ítens a) e b) frente a implementação do método de eliminação gaussiana disponível em

    scypi.sparse.linalg.spsolve.

E. 1.2.3.

Considere o seguinte problema de Poisson2020endnote: 20Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia:Siméon Denis Poisson. com condições de contorno não homogêneas.

Δu=f(x,y),(x,y)D, (1.72)
u=g,em D (1.73)

Para fixarmos as ideias, vamos assumir o domínio D=(0,1)×(0,1), a fonte

f(x,y)=2π2senπ(x+y) (1.74)

e os valores no contorno

g=senπ(x+y),(x,y)D. (1.75)

Observamos que a solução analítica deste problema é

u(x,y)=senπ(x+y). (1.76)

Empregue o método de diferenças finitas para computar uma aproximação para a solução. Assumimos uma malha uniforme de n2 nodos

xi=(i1)h (1.77)
yj=(j1)h (1.78)

com tamanho de malha h=1/(n1), i=1,2,,n e j=1,2,,n. Empregando a fórmula de diferenças central encontramos o seguinte problema discreto associado

ui,1=g(xi,0) (1.79)
u1,j=g(0,yj) (1.80)
1h2ui1,j1h2ui,j1+4h2ui,j
1h2ui+1,j1h2ui,j+1=f(xi,yj) (1.81)
ui,n=g(xi,1) (1.82)
un,j=g(1,yj) (1.83)

Este pode ser escrito na forma matricial

Aw=b (1.84)

onde, A é (n2)2×(n2)2 e assumindo a enumeração

ui,j=wk=i1+(j2)(n2),i,j=2,,n2. (1.85)

Consulte a Figura 1.4.

  1. 1.

    Compute a solução do problema discreto associado usando a seguinte implementação Python do GMRES

    scipy.sparse.linalg.gmres

  2. 2.

    Compare o desempenho com a aplicação do método LU implemento em

    scipy.sparse.linalg.spsolve

E. 1.2.4.

Faça sua própria implementação do método GMRES. Valide-a e compare-a com a resolução do exercício anterior (Exercício 1.2.3).

1.2.2 Método do Gradiente Conjugado

Em revisão

O método do gradiente conjugado é uma das mais eficientes técnicas iterativas para a resolução de sistema linear com matriz esparsa, simétrica e definida positiva. Vamos assumir que o sistema

Ax=b (1.86)

onde, a A é simétrica e definida positiva.

O método pode ser derivado a partir do método de Arnoldi2121endnote: 21Walter Edwin Arnoldi, 1917 - 1995, engenheiro americano estadunidense. Fonte: Wikipédia. [9, Seção 6.7] ou como uma variação do método do gradiente. Este é caminho que será adotado aqui.

Método do Gradiente

Em revisão

A ideia é reformular o sistema Ax=b como um problema de minimização. Vamos começar definindo o funcional

J(y)=12yTAyyTb. (1.87)

O vetor y que minimiza J é a solução de Ax=b. De fato, denotando x a solução de Ax=b, temos

J(y) =12yTAyyTb+12xTAx12xTAx (1.88)
=12(yx)TA(yx)12xTAx (1.89)

O último termo é independente de y e, portanto, J é mínimo quando

12(yx)TA(yx) (1.90)

é minimizado. Agora, como A é definida positiva2222endnote: 22xTAx>0 para todo x0., o menor valor deste termo ocorre quando yx=0, i.e. y=x.

Observamos, também, que o gradiente de J é

J=Ayb (1.91)

i.e., é o oposto do resíduo r=bAy. Com isso, temos que y=x é a única escolha tal que J=0. Ainda, temos que J é o vetor que aponta na direção e sentido de maior crescimento de J. Isso nos motiva a aplicarmos a seguinte iteração2323endnote: 23Iteração do método do máximo declive.

x(0)=aprox. inicial (1.92)
x(k+1)=x(k)αkJ(x(k)) (1.93)

onde, αk>0 é um escalar que regula o tamanho do passo a cada iteração. Lembrando que J=r, temos que a iteração é equivalente a

x(k+1)=x(k)+αkr(k). (1.94)

Notamos que x(k+1) é um ponto na reta {x(k)+αr(k):α} que tem a mesma direção de J(x(k)) e passa pelo ponto x(k). O procedimento de escolher um α(k) entre todos os possíveis, é conhecido como pesquisa linear (em inglês, line search).

A cada iteração, queremos escolher αk de forma que J(x(k+1))J(x(k)). Isso pode ser garantido fazendo a seguinte escolha2424endnote: 24Chamada de pesquisa linear exata. Qualquer outra escolha para α é conhecida como pesquisa linear não exata.

J(x(k+1))=minαJ(x(k)+αr(k)) (1.95)

A fim de resolver este problema de minimização, vamos denotar

g(α)=J(x(k)+αr(k)). (1.96)

Então, observamos que

g(α) =12(x(k)+αr(k))T×A(x(k)+αr(k))(x(k)+αr(k))Tb
=12x(k)TAx(k)+α2x(k)TAr(k)+α2r(k)TAx(k)
+α22r(k)TAr(k)x(k)Tbαr(k)Tb (1.97)

Agora, usando o fato de A ser simétrica, obtemos

g(α) =J(x(k))+αr(k)TAx(k)+α22r(k)TAr(k)αr(k)Tb (1.98)
=J(x(k))αr(k)Tr(k)+α22r(k)TAr(k) (1.99)

a qual, é uma função quadrática. Seu único mínimo, ocorre quando

0 =g(α) (1.100)
=r(k)Tr(k)+αr(k)Tb. (1.101)

Logo, encontramos

α=r(k)Tr(k)r(k)TAr(k) (1.102)

Com isso, temos a iteração do Método do Gradiente

x(0)=aprox. inicial (1.103)
x(k+1)=x(k)+αkr(k), (1.104)
αk=r(k)Tr(k)r(k)TAr(k) (1.105)
Observação 1.2.4 (Detalhe de Implementação).

Observamos que, a cada iteração, precisamos computar Ar(k) (no cálculo de αk) e Ax(k) (no cálculo do resíduo). Essas multiplicações matriz-vetor são os passos computacionais mais custosos do método. Podemos otimizar isso usando o fato de que

r(k+1)=r(k)αkAr(k). (1.106)

Exercícios

Em revisão

E. 1.2.5.

Faça sua implementação do método do gradiente.

E. 1.2.6.

Use a implementação feita no Exercício 1.2.5 nos seguintes itens.

  1. a)

    Compute a solução do problema discreto do Exemplo 1.1.2 pelo Método do Gradiente. Quantas iterações são necessárias para obter um resíduo com norma 1014?

  2. b)

    Compute a solução do problema discreto do Exercício 1.2.3 pelo Método do Gradiente. Quantas iterações são necessárias para obter um resíduo com norma 1014?

  3. c)

    Compare a aplicação do método GMRES2525endnote: 25scipy.sparse.linalg.gmres e do método LU2626endnote: 26scipy.sparse.linalg.spsolve nos itens anteriores.

E. 1.2.7.

Considere o Exercício 1.2.3.

  1. a)

    Use sua implementação do método do gradiente para computar uma solução aproximada, cuja norma do resíduo 1014.

  2. b)

    Compare o desempenho com a aplicação da implementação GMRES

    scipy.sparse.linalg.gmres

Método do Gradiente Conjugado

Em revisão

O método do gradiente consiste em uma iteração da forma

x0=aprox. inicial, (1.107)
x(k+1)=x(k)+αkp(k), (1.108)

com p(k)=r(k). Ou seja, a nova aproximação x(k+1) é buscada na direção de p(k). Aqui, a ideia é usar uma melhor direção para buscar a solução.

O método do gradiente conjugado é um método de gradiente que busca encontrar a solução de Ax=b pela computação do mínimo do seguinte funcional2727endnote: 27Compare com o funcional J dado em (1.87).

J(y)=12y,yAb,y, (1.109)

onde, , denota o produto interno padrão e

x,yA:=xTAy (1.110)

é o produto interno induzido por A, lembrando que A é positiva definida2828endnote: 28Mostre que ,A é de fato um produto interno.. Associada a este produto interno, temos a norma

xA:=x,xA, (1.111)

chamada de norma da energia. O produto interno associado é também conhecido como produto interno da energia. Com isso, definimos que dois vetores x e y são conjugados, quando eles são ortogonais com respeito ao produto interno da energia, i.e. quando

x,yA=0. (1.112)

Aqui, a ideia é desenvolver um método iterativo em que o erro a cada passo seja conjugado a todas as direções de busca anteriores. Consulte o desenvolvimento detalhado do método em [11, Seção 7.7].

Código 3: Algoritmo do gradiente conjugado
1import numpy as np
2import scipy as sp
3from scipy.linalg import norm
4
5def mgc(A, b, x, tol=1e-14):
6  n, = b.shape
7  r = b - A*x
8  p = r
9  nu = np.dot(r,r)
10  for it in np.arange(n):
11    q = A*p
12    mu = np.dot(p,q)
13    alpha = nu/mu
14    x = x + alpha*p
15    r = r - alpha*q
16    nu0 = np.dot(r,r)
17    beta = nu0/nu
18    p = r + beta*p
19    nu = nu0
20    if (norm(r) < tol):
21      print(it)
22      return x
23  raise ValueError("Falha de convergencia.")

Exercícios

Em revisão

E. 1.2.8.

Use o Código 3 na resolução dos seguintes itens.

  1. 1.

    Compute a solução do problema discreto do Exemplo 1.1.2 pelo método do gradiente conjugado. Quantas iterações são necessárias para obter um resíduo com norma 1014?

  2. 2.

    Compute a solução do problema discreto do Exercício 1.2.3 pelo método do gradiente conjugado. Quantas iterações são necessárias para obter um resíduo com norma 1014?

  3. 3.

    Compare a aplicação do método GMRES2929endnote: 29scipy.sparse.linalg.gmres e da implementação SciPy do método do gradiente conjugado3030endnote: 30scipy.sparse.linalg.cg

E. 1.2.9.

Considere o Exercício 1.2.3.

  1. a)

    Use sua implementação do método do gradiente conjugado Código LABEL:lst:algGC para computar uma solução aproximada, cuja norma do resíduo 1014.

  2. b)

    Compare o desempenho com a aplicação de sua implementação do método do gradiente (Exercício 1.2.5).

  3. c)

    Compare o desempenho com a aplicação da implementação GMRES

    scipy.sparse.linalg.gmres

1.2.3 Precondicionamento

Em revisão

Precondicionamento refere-se a modificar o sistema linear original de forma que a computação de sua solução possa ser feita de forma mais eficiente. No lugar do sistema original

Ax=b (1.113)

resolvemos o sistema equivalente

MAx=Mb, (1.114)

onde M=P1 e a matriz P é chamada de precondicionador do sistema. De forma geral, a escolha do precondicionador é tal que PA, mas com inversa fácil de ser computada. Além disso, uma característica esperada é que MA tenha esparsidade parecida com A.

Precondicionamento ILU

Em revisão

A ideia é tomar P igual a uma fatoração LU incompleta (ILU, do inglês, Incomplete LU). Incompleta no sentido que entradas de L e de U sejam adequadamente removidas, buscando-se uma boa esparsidade e ao mesmo tempo uma boa aproximação LU para A.

ILU(0)

Em revisão

O precondicionamento ILU(0) impõe que as matrizes L e U tenham o mesmo padrão de esparsidade da matriz A.

Refer to caption
Refer to caption
Refer to caption
Refer to caption
Figura 1.5: Representação das matrizes ILU(0).
Exemplo 1.2.1.

ex:possoinDnhIlu0 Consideramos o sistema linear Ax=b associado ao problema discreto trabalhado no Exercício 1.2.3. Para uma malha n×n=8×8, obtemos as matrizes representadas na Figura 1.5.

Observamos que a matriz LU contém duas diagonais com elementos não nulos a mais que a matriz original A. Estes elementos são chamados de fill-in.

Código 4: Algoritmo ILU(0)
1import scipy.sparse as sp
2
3def ilu0(A):
4  n,n = A.get_shape()
5  LU = A.copy()
6  nz = A.nonzero()
7  for i in range(1,n):
8    for k in [_ for _ in range(i) if (i,_) in zip(nz[0],nz[1])]:
9      LU[i,k] = LU[i,k]/LU[k,k]
10        LU[i,j] = LU[i,j] - LU[i,k]*LU[k,j]
11
12  return LU

Exercícios

Em revisão

E. 1.2.10.

Considere o problema discreto do Exercício 1.2.3.

  1. a)

    Compute a solução com o método GMRES com precondicionamento ILU(0).

  2. b)

    Compare com a resolução com o método GMRES sem precondicionamento.

  3. c)

    Compare com a resolução com o método CG sem precondicionamento.

  4. d)

    O precondicionamento ILU(0) é eficiente para o método CG?


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!