| | | |

Matemática numérica III

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

2.1 Método de Newton

Consideramos o seguinte problema: dada a função F:D⊂ℝn→ℝn encontrar 𝒙∗∈ℝn tal que

F⁢(𝒙∗)=0. (2.1)

Salvo explicitado ao contrário, assumiremos que F∈C1⁢(D), i.e. F é uma função continuamente diferenciável no domínio computacional D⊂ℝn.

Vamos, denotar por JF⁢(𝒙)=[ȷi,j⁢(𝒙)]i,j=1n,n a matriz jacobiana111Carl Gustav Jakob Jacobi, 1804 - 1851, matemático alemão. Fonte: Wikipédia: Carl Gustav Jakob Jacobi. da F com

ȷi,j⁢(𝒙)=∂fi⁢(𝒙)∂xj, (2.2)

onde F⁢(𝒙)=(f1⁢(𝒙),f2⁢(𝒙),…,fn⁢(𝒙)) e 𝒙=(x1,x2,…,xn).

A iteração básica do método de Newton222Isaac Newton, 1642 - 1727, matemático, físico, astrônomo, teólogo e autor inglês. Fonte: Wikipédia: Isaac Newton. para sistemas de equações consiste em: dada uma aproximação inicial 𝒙(0)∈ℝn,

resolver: (2.3)
JF⁢(𝒙(k))⁢𝜹(k)=−F⁢(𝒙(k)) (2.4)
computar: (2.5)
𝒙(k+1)=𝒙(k)+𝜹(k) (2.6)

para k=0,1,2,… até que um critério de parada seja satisfeito.

Observação 2.1.1.(Convergência)

Para 𝒙(0) suficientemente próximo da solução 𝒙∗, o método de Newton é quadraticamente convergente. Mais precisamente, este resultado de convergência local requer que JF−1⁢(𝒙∗) seja não singular e que JF seja Lipschitz333Rudolf Otto Sigismund Lipschitz, 1832 - 1903, matemático alemão. Fonte: Wikipédia: Rudolf Lipschitz. contínua. Consulte [10, Seção 7.1] para mais detalhes.

Código 12: newton.py
1from numpy.linalg import solve, norm
2
3def newton(f, jac, x0, tol=1e-10, max_iter=100):
4 x = x0.copy()
5 info = 0
6 for i in range(max_iter):
7 # jacobiana
8 J = jac(x)
9 # resíduo
10 F = f(x)
11 # método linear
12 delta = solve(J, -F)
13 # atualização
14 x = x + delta
15 # critério de parada
16 if norm(delta) < tol:
17 info = 1
18 return x, info
19
20 return x, info
Exemplo 2.1.1.

Consideremos a equação de Burgers444Jan Burgers, 1895 - 1981, físico neerlandês. Fonte: Wikipédia: Jan Burgers.

∂u∂t+u⁢∂u∂x=ν⁢∂2u∂x2 (2.7)

com ν>0, condição inicial

u⁢(0,x)=−sen⁡(π⁢x) (2.8)

e condições de contorno de Dirichlet555Johann Peter Gustav Lejeune Dirichlet, 1805 - 1859, matemático alemão. Fonte: Wikipédia: Johann Peter Gustav Lejeune Dirichlet. homogêneas

u⁢(t,−1)=u⁢(t⁢,1)=0. (2.9)

Aplicando o método de Rothe666Erich Hans Rothe, 1895 - 1988, matemático alemão. Fonte: Wikipédia: Erich Rothe. com aproximação de Euler777Leonhard Paul Euler, 1707-1783, matemático e físico suíço. Fonte: Wikipédia: Leonhard Euler. implícita, obtemos

u⁢(t+ht,x)−u⁢(t,x)ht+
u⁢(t+ht,x)⁢ux⁢(t+ht,x)≈ν⁢ux⁢x⁢(t+ht,x), (2.10)

onde ht>0 é o passo no tempo. Agora, aplicamos diferenças finitas para obter

u⁢(t+ht,xi)−u⁢(t,xi)ht
+u⁢(t+ht,xi)⁢u⁢(t+ht,xi+1)−u⁢(t+ht,xi−1)2⁢hx
≈νu⁢(t+ht,xi−1)−2⁢u⁢(t+ht,xi)+u⁢(t+ht,xi+1)hx2, (2.11)

onde, xi=(i−1)⁢hx, i=1,…,nx e hx=1/(nx−1) é o tamanho da malha.

Rearranjando os termos e denotando ui(k)≈u⁢(tk,xi), tk=(k−1)⁢h, obtemos o seguinte sistema de equações não-lineares, que consiste no problema discreto associado: para cada k=0,1,2,…, encontrar ui(k+1), i=1,…,nx, tais que

u1(k+1)=0 (2.12)
1ht⁢ui(k+1)−1ht⁢ui(k)+12⁢hx⁢ui(k+1)⁢ui+1(k+1)
−12⁢hx⁢ui(k+1)⁢ui−1(k+1)−νhx2⁢ui−1(k+1)
+2⁢νhx2⁢ui(k+1)−νhx2⁢ui+1(k+1)=0, (2.13)
unx(k+1)=0, (2.14)

sendo ui(0)=−sen⁡(π⁢xi), i=1,…,nx.

Este problema pode ser reescrito como segue: para cada k=0,1,…, encontrar 𝒘∈ℝnx, tal que

F⁢(𝒘;𝒘(0))=0, (2.15)

onde wi=ui(k+1), wi(0)=ui(k) e

f1⁢(𝒘;𝒘(0))=w1, (2.16)
fi⁢(𝒘;𝒘(0))=1ht⁢wi−1ht⁢wi(0)+12⁢hx⁢wi⁢wi+1
−12⁢hx⁢wi⁢wi−1−νhx2⁢wi−1+2⁢νhx2⁢wi−νhx2⁢wi+1, (2.17)
fnx⁢(𝒘;𝒘(0))=wnx. (2.18)

A matriz jacobiana associada J=[ȷi,j]i,jnx,nx contém

ȷi,j=0,j≠i−1,i,i+1, (2.19)
ȷ1,1=1, (2.20)
ȷ1,2=0, (2.21)
ȷi,i−1=12⁢hx⁢wi−νhx2, (2.22)
ȷi,i=1ht+12⁢hx⁢wi+1−2hx⁢wi−1+2⁢νhx2, (2.23)
ȷi,i+1=12⁢hx⁢wi−νhx2, (2.24)
ȷnx,nx−1=0 (2.25)
ȷnx,nx=1. (2.26)
Código 13: burgers_newton.py
1from numpy import linspace, sin, pi, zeros
2
3# parâmetros
4nu = 0.01
5
6# malha espacial
7N = 100
8L = 1.0
9dx = L/(N+1)
10x = linspace(0, L, N+1)
11
12# malha temporal
13dt = 0.001
14T = 1.0
15nt = int(T/dt)
16
17# c.i.
18t0 = 0.0
19u0 = sin(pi*x)
20
21# track
22U = [u0.copy()]
23nt_track = 100
24
25def f_burgers(u):
26 F = zeros(N+1)
27 F[0] = u[0] # u(0,t) = 0
28 for i in range(1, N):
29 F[i] = (u[i] - u0[i])/dt + u[i]* (u[i+1] - u[i-1])/(2*dx) - nu*(u[i+1] - 2*u[i] + u[i-1])/(dx*dx)
30 F[N] = u[N] # u(1,t) = 0
31 return F
32
33def jac_burgers(u):
34 J = zeros((N+1, N+1))
35 J[0, 0] = 1.0 # u(0,t) = 0
36 for i in range(1, N):
37 J[i, i] = 1/dt + (u[i+1] - u[i-1])/(2*dx) + 2*nu/(dx*dx)
38 J[i, i+1] = u[i]/(2*dx) - nu/(dx*dx)
39 J[i, i-1] = -u[i]/(2*dx) - nu/(dx*dx)
40 J[N, N] = 1.0 # u(1,t) = 0
41 return J
42
43# solução temporal
44u = u0.copy()
45for n in range(nt):
46 u_new, info = newton(f_burgers, jac_burgers, u)
47 u0 = u.copy() # atualizar c.i.
48 u = u_new.copy() # atualizar solução
49
50 if (n+1) % nt_track == 0:
51 U.append(u.copy()) # armazenar solução

Exercícios

E. 2.1.1.

Faça uma implementação pelo método de diferenças finitas com método de Euler implícito para resolver o seguinte problema de Burgers:

ut+u⁢ux=ν⁢ux⁢x,(t,x)∈(0,tf]×(−1,1), (2.27)
u⁢(0,x)=2⁢ν⁢π⁢sen⁡(π⁢x)2+cos⁡(π⁢x),x∈[−1,1], (2.28)
u⁢(t,−1)=u⁢(t⁢,1)=0,t∈[0,tf], (2.29)

Teste seu código para ν=1.,0.1,0.01,0.001,0.0001 e tf=1.0. Dica: a solução analítica é dada por [Wood2006]

u⁢(t,x)=2⁢ν⁢π⁢e−ν⁢π2⁢t⁢sen⁡(π⁢x)2+e−ν⁢π2⁢t⁢cos⁡(π)⁢x. (2.30)

Dica: u⁢(t,x)=2⁢ν⁢π⁢e−ν⁢π2⁢t⁢sen⁡(π⁢x)2+e−ν⁢π2⁢t⁢cos⁡(π)⁢x.

E. 2.1.2.

Faça uma implementação pelo método de diferenças finitas com método de Euler implícito para resolver o seguinte problema de Burgers:

ut+u⁢ux=ν⁢ux⁢x,(t,x)∈(0,tf]×(−1,1), (2.31)
u⁢(0,x)=−sen⁡(π⁢x),x∈[−1,1], (2.32)
u⁢(t,−1)=u⁢(t⁢,1)=0,t∈[0,tf], (2.33)

Teste seu código para ν=1.,0.1,0.01,0.001,0.0001 e tf=1.0. Dica> a solução analítica é dada por [Basdevant1986]

u⁢(t,x)=−∫−∞∞sen⁡(π⁢(x−η))⁢f⁢(x−η)⁢e−η24⁢ν⁢t⁢𝑑η∫−∞∞f⁢(x−η)⁢e−η24⁢ν⁢t⁢𝑑η, (2.34)

onde f⁢(y)=exp⁡(cos⁡(π⁢y)2⁢π⁢ν) e ν=0.01/π.

E. 2.1.3.

Faça uma implementação pelo método de diferenças finitas com método de Euler implícito para resolver o seguinte problema de Burgers:

ut+u⁢ux=ν⁢ux⁢x,(t,x)∈(0,tf]×(−1,1), (2.35)
u⁢(0,x)=2⁢sign⁡(x),x∈[−1,1], (2.36)
u⁢(t,−1)=ua,u⁢(t⁢,1)=ub,t∈[0,tf], (2.37)

Teste seu código para ν=1.,0.1,0.01,0.001,0.0001 e tf=1.0. Dica: é conhecida a seguinte solução analítica para ν=1 [Benton1972]:

u⁢(t,x)=2⁢G⁢(t,x)−G⁢(t,−x)G⁢(t,x)+G⁢(t,−x), (2.38)

onde

G⁢(t,x)=12⁢et−x⁢erfc⁡2⁢t−x2⁢t. (2.39)

2.1.1 Método tipo Newton

Em revisão

Existem várias modificações do Método de Newton888Isaac Newton, 1642 - 1727, matemático, físico, astrônomo, teólogo e autor inglês. Fonte: Wikipédia: Isaac Newton. que buscam reduzir o custo computacional. Há estratégias para simplificar as computações da matriz jacobiana999Carl Gustav Jakob Jacobi, 1804 - 1851, matemático alemão. Fonte: Wikipédia: Carl Gustav Jakob Jacobi. e para reduzir o custo nas computações das atualizações de Newton.

Atualização cíclica da jacobiana

Em revisão

Geralmente, ao simplificarmos a matriz jacobina JF ou aproximarmos a atualização de Newton δ(k), perdemos a convergência quadrática do método (consulte a Observação 2.1.1). A ideia é, então, buscar uma convergência pelo menos super-linear, i.e.

‖e(k+1)‖≈ρk⁢‖e(k)‖, (2.40)

com ρk→0 quando k→∞. Aqui, e(k):=x∗−x(k). Se a convergência é superlinear, então podemos usar a seguinte aproximação

ρk≈‖δ(k)‖‖δ(k−1)‖ (2.41)

ou, equivalentemente,

ρk≈(‖δ(k)‖‖δ(0)‖)1k (2.42)

Isso mostra que podemos acompanhar a convergência das iterações pelo fator

βk=‖δ(k)‖‖δ(0)‖. (2.43)

Ao garantirmos 0<βk<1, deveremos ter uma convergência superlinear.

Vamos, então, propor o seguinte método tipo Newton de atualização cíclica da matriz jacobiana.

  1. 1.

    Escolha 0<β<1

  2. 2.

    J:=JF⁢(x(0))

  3. 3.

    J⁢δ(0)=−F⁢(x(0))

  4. 4.

    x(1)=x(0)+δ(0)

  5. 5.

    Para k=1,… até critério de convergência:

    1. (a)

      J⁢δ(k)=−F⁢(x(k))

    2. (b)

      x(k+1)=x(k)+δ(k)

    3. (c)

      Se ‖δ(k)‖/‖δ(0)‖>β:

      1. i.

        J:=JF⁢(x(k))

E. 2.1.4.

Implemente uma versão do método tipo Newton apresentado acima e aplique-o para simular o problema discutido no Exemplo 2.1.1 para ν=1.,0.1,0.01,0.001,0.0001. Faça uma implementação com suporte para matrizes esparsas.


Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
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.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |