| | | |

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:Dnn encontrar 𝒙n tal que

F(𝒙)=0. (2.1)

Salvo explicitado ao contrário, assumiremos que FC1(D), i.e. F é uma função continuamente diferenciável no domínio computacional Dn.

Vamos, denotar por JF(𝒙)=[ȷi,j(𝒙)]i,j=1n,n a matriz jacobiana3434endnote: 34Carl 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 Newton3535endnote: 35Isaac 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 JF1(𝒙) seja não singular e que JF seja Lipschitz3636endnote: 36Rudolf Otto Sigismund Lipschitz, 1832 - 1903, matemático alemão. Fonte: Wikipédia. contínua. Consulte [8, 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 Burgers3737endnote: 37Jan Burgers, 1895 - 1981, físico neerlandês. Fonte: Wikipédia: Jan Burgers.

ut+uux=ν2ux2 (2.7)

com ν>0, condição inicial

u(0,x)=sen(πx) (2.8)

e condições de contorno de Dirichlet3838endnote: 38Johann 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 Rothe3939endnote: 39Erich Hans Rothe, 1895 - 1988, matemático alemão. Fonte: Wikipédia. com aproximação de Euler4040endnote: 40Leonhard Paul Euler, 1707-1783, matemático e físico suíço. Fonte: Wikipédia: Ronald Fisher. implícita, obtemos

u(t+ht,x)u(t,x)ht+
u(t+ht,x)ux(t+ht,x)νuxx(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,xi1)2hx
νu(t+ht,xi1)2u(t+ht,xi)+u(t+ht,xi+1)hx2, (2.11)

onde, xi=(i1)hx, i=1,,nx e hx=1/(nx1) é o tamanho da malha.

Rearranjando os termos e denotando ui(k)u(tk,xi), tk=(k1)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)
1htui(k+1)1htui(k)+12hxui(k+1)ui+1(k+1)
12hxui(k+1)ui1(k+1)νhx2ui1(k+1)
+2νhx2ui(k+1)νhx2ui+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))=1htwi1htwi(0)+12hxwiwi+1
12hxwiwi1νhx2wi1+2νhx2wiνhx2wi+1, (2.17)
fnx(𝒘;𝒘(0))=wnx. (2.18)

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

ȷi,j=0,ji1,i,i+1, (2.19)
ȷ1,1=1, (2.20)
ȷ1,2=0, (2.21)
ȷi,i1=12hxwiνhx2, (2.22)
ȷi,i=1ht+12hxwi+12hxwi1+2νhx2, (2.23)
ȷi,i+1=12hxwiνhx2, (2.24)
ȷnx,nx1=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+uux=νuxx,(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 [12]

u(t,x)=2νπeνπ2tsen(πx)2+eνπ2tcos(π)x. (2.30)

Dica: u(t,x)=2νπeνπ2tsen(πx)2+eνπ2tcos(π)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+uux=νuxx,(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 [1]

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+uux=νuxx,(t,x)(0,tf]×(1,1), (2.35)
u(0,x)=2sign(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 [2]:

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

onde

G(t,x)=12etxerfc2tx2t. (2.39)

2.1.1 Método Tipo Newton

Em revisão

Existem várias modificações do Método de Newton4141endnote: 41Isaac 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 jacobiana4242endnote: 42Carl 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 Matriz 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 3.1.1). A ideia é, então, buscar uma convergência pelo menos super-linear, i.e.

e(k+1)ρke(k), (2.40)

com ρk0 quando k. Aqui, e(k):=xx(k). Se a convergência é superlinear, então podemos usar a seguinte aproximação

ρkδ(k)δ(k1) (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 3.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
| | | |