Use o botão abaixo para reportar erros ou dar sugestões.

Cálculo Numérico - Versão Python

10.11 Método de Adams-Moulton


O método de Adams-Moulton, assim como o método de Adams-Bashforth, é um método de passo múltiplo. A diferença entre estes dois métodos é que Adams-Bashforth é explícito, enquanto Adams-Moulton é implícito, isto é, os valores de f t,u), nos passos n, n + 1, ..., n + s - 1 e, inclusive, n + s são utilizados ao calcular f em t(n+s).

Considere o problema de valor inicial u(t) = f(t,u(t)) (10.292) u(t0) = a (10.293)

Integrando a equação diferencial no intervalo [t(n+s-1),t(n+s)], obtemos:

u(n+s) = u(n+s-1) +t(n+s-1)t(n+s) f(t,u(t))dt (10.294)

Agora o integrando em (10.294) é aproximado pelo polinômio que interpola f(t(k),u(k)) para k = n,n + 1,n + 2,,n + s, isto é:

u(n+s) = u(n+s-1) +t(n+s-1)t(n+s) p(t)dt (10.295)

onde p(t) é polinômio de grau s dado na forma de Lagrange por:

p(t) = j=0s f(t(n),u(n)) k=0,kjs t - t(n+k) t(n+j) - t(n+k) (10.296)

Agora observamos que

t(n+s-1)t(n+s) p(t)dt = h j=0sβ jf(t(n+j),u(n+j)) (10.297)

onde

βj = 1 ht(n+s-1)t(n+s) k=0,kjs t - t(n+k) t(n+j) - t(n+k)dt (10.298)

Aplicando a mudança de variáveis t = t(n+s-1) + hτ, temos: βj = 01 k=0,kjsτ + s - k - 1 j - k dt (10.299) = (-1)s-j j!(s - j)!01 k=0,kjs(τ + s - k - 1)dτ (10.300) = (-1)s-j j!(s - j)!01 k=0,ks-j-1s(τ + k - 1)dτ (10.301)

Assim, obtemos a relação de recorrência: u(n+s) = u(n+s-1) + h j=0sβ jf(t(n+j),u(n+j)) (10.302)

Observação 10.11.1. Os coeficientes do método de Adams-Moulton de s passos podem, alternativamente, ser obtidos exigindo que o sistema seja exato para f(t,u) = t0, f(t,u) = t1, f(t,u) = t2, …, f(t,u) = ts.

Exemplo 10.11.1. Obtenha o método de Adams-Moulton para s = 3 como u(n+3) = u(n+2) + t(n+3)t(n+4)f(t,u(t))dt (10.303) u(n+3) = u(n+2) + h m=03b mf(n+m) (10.304) u(n+3) = u(n+2) + h b 3f(n+3) + b 2f(n+2) + b 1f(n+1) + b 0f(n) (10.305)

Para isso devemos obter [b3,b2,b1,b0] tal que o método seja exato para polinômios até ordem 3. Podemos obter esses coeficientes de maneira análoga a obter os coeficientes de um método para integração.

Supondo que os nós tk estejam igualmente espaçados, e para facilidade dos cálculos, como o intervalo de integração é [t(n+2),t(n+3)], translade t(n+2) para a origem tal que [t(n),t(n+1),,t(n+3)] = [-2h, - h,0,h].

Considere a base [1,t,t2,t3] e substitua f(t) por cada um dos elementos da base,obtendo: 0h1dt = h = h(b 0(1) + b1(1) + b2(1) + b3(1)) (10.306) 0htdt = h2 2 = h(b0(h) + b1(0) + b2(-h) + b3(-2h)) (10.307) 0ht2dt = h3 3 = h(b0(h)2 + b 1(0)2 + b 2(-h)2 + b 3(-2h)2) (10.308) 0ht3dt = h4 4 = h(b0(h)3 + b 1(0)3 + b 2(-h)3 + b 3(-2h)3) (10.309)

que pode ser escrito na forma matricial 1 0 1 1 1 0 - 1 - 2 1 0 1 4 1 0 - 1 - 8 b0 b1 b2 b3 = 1 12 13 14 (10.310)

Resolvendo o sistema obtemos

[b0,b1,b2,b3] = 1 24, - 5 24,19 24, 9 24 (10.311)

fornecendo a regra un+3 = un+2 + h 24[9fn+3 + 19fn+2 - 5fn+1 + f(n)] (10.312)

A tabela abaixo mostra as coeficientes do método de Adams-Moulton para até oito passos.










1 1
2 1 2 1 2
3 - 1 12 2 3 5 12
4 1 24 - 5 24 19 24 3 8
5 - 19 720 53 360 - 11 30 323 360 251 720
6 3 160 - 173 1440 241 720 - 133 240 1427 1440 95 288
7 - 863 60480 263 2520 - 6737 20160 586 945 - 15487 20160 2713 2520 19087 60480
8 275 24192 - 11351 120960 1537 4480 - 88547 120960 123133 120960 - 4511 4480 139849 120960 5257 17280









Exemplo 10.11.2. O esquema iterativo de Adams-Moulton com três passos, isto é, s = 2 é dado na forma:

u(n+2) = u(n+1) + h 12 5f t(n+2),u(t(n+2)) + 8f t(n+1),u(t(n+1)) - f t(n),u(t(n)) (10.313)

Exercícios resolvidos


ER 10.11.1. Resolva o problema de valor inicial dado por: u(t) = -2u(t) + te-t (10.314) u(0) = -1 (10.315)

via Adams-Moulton com s = 2 (três passos) com h = 0,1 e h = 0,01 e compare com a solução exata dada por u(t) = (t - 1)e-t nos instantes t = 1 e t = 2. Inicialize com Euler modificado.

Solução. Primeiro observamos que f(u,t) = -2u + te-t e que o esquema de Adams-Moulton pode ser escrito como:
u(n+2) = u(n+1) + h 12 5f t(n+2),u(t(n+2)) + 8f t(n+1),u(t(n+1)) - f t(n),u(t(n)) (10.316)

de forma que: u(n+2) = u(n+1) + h 12 8f t(n+1),u(t(n+1)) - f t(n),u(t(n)) + 5h 12f t(n+2),u(t(n+2)) (10.317) = u(n) + h 12 8f(n+1) - f(n) + 5h 12 t(n+2)et(n+2) - 2u(t(n+2)) (10.318)

Assim: 1 + 5h 6 u(n+2) = u(n+1) + h 12 8f(n+1) - f(n) + 5h 12t(n+2)e-t(n+2) (10.319)

Os valores obtidos são:




t=1 t=2



h=0,1 -0,000223212480142 0,135292280956
h=0,01 -2,02891229566e-07 0,135335243537
Exato 0 0,135335283237



A seguinte rotina implementa a recursão:
## resolve u’(t)=l*u(t) + g  
 
def g(t):  
return t*np.exp(-t)  
 
 
 
 
u0=-1  
h=1e-2  
Tmax=2  
itmax=np.int(Tmax/h)  
 
u=np.empty(itmax+1)  
fn=np.empty(itmax+1)  
 
u[0]=u0  
l=-2  
#Iniciliza com Euler modificado  
k1= l*u[0] + g(0)  
k2= l*(u[0]+h*k1) + g(h)  
u[1]= u[0]+ h *(k1+k2)/2  
 
fn[0]= k1  
fn[1]= l*u[1] + g(h)  
 
 
 
for n in np.arange(0,itmax-1):  
gn2=g((n+2)*h)  
 
u[n+2]= (u[n+1] + h/12*(8*fn[n+1]-fn[n]) + 5*h/12*gn2 ) / (1+5*h/6)  
fn[n+2]=l*u[n+2]+gn2  
 
for n in np.arange(0,itmax+1):  
print h*n,u[n], (h*n-1)*np.exp(-h*n)

ER 10.11.2. Repita o Problema 10.10.1 pelo método de Adams-Moulton, isto, é resolva numericamente o problema de valor inicial dado por: y(t) = 1 + y(t), (10.320) y(0) = 0, (10.321)

aplicando o método de Adams-Moulton de dois passos. Calcule o valor de y(1) com passo de tamanho h = 0,1.

Solução. Primeiro observamos que o processo resursivo do método de Adams é dado por:
y(n+1) = y(n) + h 2 f t(n+1),u(t(n+1)) + f t(n),u(t(n)) ,n = 1,2, (10.322)

O valor inicial é dado por y(1) = 0. Primeiramente, precisamos isolar y(x+1) na Equação 10.322:

y(n+1) = y(n)+h 8h2 + 16 + 16y(n) + 8h1 + y(n)+h 21 + y(n)+h2 8 ,n = 1,2, (10.323)
y(1) = 0 (10.324) y(2) = 0,1025 (10.325) y(3) = 0,21 (10.326) y(4) = 0,3225 (10.327) y(5) = 0,44 (10.328) y(6) = 0,5625 (10.329) y(7) = 0,69 (10.330) y(8) = 0,8225 (10.331) y(9) = 0,96 (10.332) y(10) = 1,1025 (10.333) y(11) = 1,25 (10.334)

ER 10.11.3. Resolva o problema de valor inicial dado por y(t) = y3 - y + t, (10.335) y(0) = 0, (10.336)

aplicando o método de Adams-Moulton de dois passos. Calcule o valor de y(1) com passo de tamanho h = 0,1 e h = 0,01. Primeiro observamos que o processo resursivo do método de Adams é dado por: y(n+1) = y(n) + h 2 f t(n+1),u(t(n+1)) + f t(n),u(t(n)) ,n = 1,2,, (10.337) y(1) = 0 (10.338)

Observamos que o problema de isolar y(n+1) pode ser escrito como y(n+1) - h 2f t(n+1),u(t(n+1)) = y(n) + h 2f t(n),u(t(n)) (10.339)

O termo da esquerda é uma expressão não linear em y(n+1) e o termo da direita é conhecido, isto é, pode ser calculado com base nos valores anteriormente calculados. Devemos, então, escolher um método numérico de solução de equações algébricas não lineares (veja capítulo 3) como o método de Newton visto na Seção 3.4 para resolver uma equação do tipo:

u - h 2f(t(n+1),u) = a, (10.340)

isto é:

u - h 2 u3 - u + t(n+1) = a, (10.341)

com a = y(n) + h 2 f t(n),u(t(n)) Os valores obtidos são: 0,37496894 e 0,37512382 quando o método é inicializadom com Euler melhorado. A seguinte rotina implementa a recursão:

def f(t,u):  
return u**3-u+t  
 
def resolve(u,t,a,h,beta): #resolve equacao nao-linear por metodo de Newton  
ctrl=2  
cont=0  
while (ctrl>0):  
cont=cont+1  
residuo=u-beta*h*(u**3-u+t)-a  
derivada=1-beta*h*(3*u**2-1)  
u1=u-residuo/derivada  
if np.abs(u1-u)<derivada*1e-10:  
ctrl=ctrl-1  
u=u1  
# print cont  
return u  
 
 
def adams_moulton_2(h,Tmax,u1):  
itmax=np.int(Tmax/h)  
u=np.empty((itmax+1,1))  
u[0]=u1  
 
for i in np.arange(0,itmax):  
t=i*h  
fn=f(t,u[i])  
a=u[i] + h*fn/2  
u[i+1]=resolve(u[i]+ h*fn,t+h,a,h,1/2)  
return u  
 
 
 
u0=0  
h=1e-2  
Tmax=1  
itmax=np.int(Tmax/h)  
 
u=adams_moulton_2(h,Tmax,u0)  
print u[itmax]  

Exercícios


E 10.11.1. Encontre o método de Adams-Moulton para s = 0.

Resposta.
y(n) = y(n) + hf t(n),u(t(n) (10.342)

Este esquema é equivalente ao método de Euler Implícito.

E 10.11.2. Encontre o método de Adams-Moulton para s = 1.

Resposta.
y(n+1) = y(n) + h 2 f t(n+1),u(t(n+1)) + f t(n),u(t(n)) (10.343)

Este esquema é equivalente ao método trapezoidal.

E 10.11.3. Repita o Problema 10.11.3 usando Adams-Moulton com 3 passos e inicilizando com Runge-Kutta quarta ordem clássico.

Resposta. 0,37517345 e 0,37512543.

Creative Commons License Este texto é disponibilizado nos termos da licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada (CC-BY-SA 3.0). Página gerada em 15/5/2019 às 15:24:50.

Informe erros ou edite você mesmo!