Viana & Espinar, IMPA 2025
Método de Picard
Implementação computacional do experimento § 2.6 de Viana & Espinar — iteração de Picard, análise de convergência, comparação entre integradores e extensão para sistemas de dimensão 2.
Implementação completa do experimento § 2.6 de Equações Diferenciais Ordinárias (Viana & Espinar, IMPA 2025), cobrindo a iteração de Picard para aproximação de soluções de EDOs. O projeto inclui análise de convergência numérica, comparativo entre os integradores do trapézio e do retângulo, otimização de complexidade via acumulação incremental e extensão para sistemas de dimensão .
§ 2.6
Fundamentação teórica
O problema de valor inicial e o operador de Picard
Considera-se o problema de valor inicial
onde é contínua num aberto e localmente Lipschitziana em . A ideia central do método de Picard é reescrever (1) como equação integral e aplicar o Teorema do Ponto Fixo para Contrações.
Dado , o operador de Picard age em funções contínuas , com , por
A sequência de iterados de Picard é definida por e para .
Existência, unicidade e raio garantido
Dado , fixe tal que . Define-se
e seja a constante de Lipschitz de em sobre essa região. Para todo satisfazendo
existe solução única de (1), e os iterados de Picard convergem uniformemente para ela nesse intervalo (Teorema 2.12 de Viana & Espinar).
Cota do erro
O resultado central para toda a análise numérica é o Corolário 2.14:
O fatorial no denominador garante convergência para qualquer valor de — apenas a taxa varia:
- Se : o fatorial domina a potência desde o primeiro iterado, e a cota decresce monotonamente em .
- Se : o termo cresce até atingir um máximo em torno de e só então decai via o fatorial. É o que ocorre no Objetivo 4, com e .
A equação (6) conecta os parâmetros ao número mínimo de iterados necessários para atingir uma tolerância :
Parâmetros ótimos para
Para e , as quantidades de (3) sobre são
onde a última igualdade segue de para , que garante que o mínimo em (4) é sempre o segundo argumento. Maximizando :
Com , a cota (6) reduz-se a , que para fornece . A convergência observada é tipicamente melhor que esta cota superior, uma vez que (6) usa o supremo sobre toda a bola e não apenas sobre a trajetória da solução.
| δ | M(δ) | C(δ) | ε(δ) | N_max(10⁻⁶) |
|---|---|---|---|---|
| 0,25 | 1,5625 | 2,5000 | 0,1600 | 7 |
| 0,50 | 2,2500 | 3,0000 | 0,2222 | 9 |
| 1,00 | 4,0000 | 4,0000 | 0,2500 | 11 |
| 1,50 | 6,2500 | 5,0000 | 0,2400 | 12 |
| 2,00 | 9,0000 | 6,0000 | 0,2222 | 12 |

Discretização e erro de quadratura
A curva é representada por valores em pontos igualmente espaçados
Para que coincida com um índice da malha, é necessário que seja ímpar; nesse caso satisfaz .
A integral em (2) é aproximada por duas regras clássicas:
O erro total do -ésimo iterado discreto decompõe-se em dois termos com dependências opostas:
com para o trapézio e para o retângulo. Aumentar reduz o primeiro termo via o fatorial; aumentar reduz o segundo como . Para fixo e suficientemente grande, o retângulo atinge um piso de erro irredutível proporcional a , que não pode ser eliminado aumentando o número de iterados — apenas aumentando ou diminuindo .
Cinco objetivos progressivos
O experimento
O experimento está organizado em cinco objetivos progressivos, correspondentes às instruções da Seção 2.6:
- Escrever o método de Picard em código computacional.
- Considerar com , calcular os primeiros iterados num domínio adequado, comparar com a solução exata e estimar o erro do -ésimo iterado.
- Calcular soluções no domínio , observando o comportamento das duas regras de quadratura no extremo esquerdo da curva.
- Investigar a convergência dos iterados em domínios maiores que , inclusive em todo o intervalo de definição da solução.
- Repetir os passos anteriores para com , , cuja solução exata é . Neste caso o problema tem dimensão .
Todos os códigos usam Python com NumPy e Matplotlib.
Objetivo 1
Implementação básica
O domínio com é escolhido de modo a maximizar o raio garantido para . Com , a cota decresce monotonamente desde o primeiro iterado.
| Parâmetro | Descrição | Valor |
|---|---|---|
| ε | Raio do domínio [0, ε] | 0,25 |
| L | Pontos de discretização | 500 |
| N | Iterados de Picard | 8 |
| x₀ | Condição inicial | 1,0 |
import numpy as np
eps = 0.25; L = 500; N = 8; x0 = 1.0
t = np.linspace(0, eps, L)
def F(t, x):
return x**2
y = np.zeros((N+1, L))
y[0, :] = x0
for n in range(N):
for k in range(L):
integrando = F(t[:k+1], y[n, :k+1])
y[n+1, k] = x0 + np.trapezoid(integrando, t[:k+1])A matriz y[n, k] armazena . O laço interno discretiza a recorrência do
operador (2): para cada , integra de a pela regra
do trapézio sobre os pontos já calculados.
| n | Trapézio | Cota 4/n! |
|---|---|---|
| 0 | 3.33e−01 | 4.00e+00 |
| 1 | 8.33e−02 | 4.00e+00 |
| 2 | 1.56e−02 | 2.00e+00 |
| 3 | 2.25e−03 | 6.67e−01 |
| 5 | 2.49e−05 | 3.33e−02 |
| 7 | 7.39e−08 | 7.94e−04 |
| 8 | 6.49e−08 | 9.92e−05 |
![Iterados γ₁ a γ₈ e a solução exata x(t) = 1/(1−t), em tracejado vermelho, no domínio [0, 0,25]. A cor indica o índice do iterado. A convergência é rápida porque Cε* = 1.](/figuras/edo1-iterados.png)
Objetivo 2
Trapézio contra retângulo
O Objetivo 2 estende a análise para , saindo da região de garantia do teorema, e introduz a comparação entre os dois integradores.
Embora ultrapasse a garantia teórica, a convergência numérica ocorre em todo o intervalo . Isso decorre de um fato estrutural: os iterados de Picard para com coincidem exatamente com as somas parciais da série geométrica
cujo raio de convergência é . Portanto, para qualquer , os iterados convergem para a solução exata, ainda que o teorema só garanta isso para . Este é um dos pontos matematicamente mais elegantes do experimento: o método de Picard constrói, iterado a iterado, os coeficientes da expansão em série de Taylor da solução.
| Parâmetro | Descrição | Valor |
|---|---|---|
| ε | Raio | 0,5 |
| L | Pontos | 2000 |
| N | Iterados | 14 |
h = t[1] - t[0]
for n in range(N):
for k in range(L):
integrando = F(t[:k+1], y_tp[n, :k+1])
y_tp[n+1, k] = x0 + np.trapezoid(integrando, t[:k+1])
for n in range(N):
for k in range(L):
integrando = F(t[:k+1], y_rt[n, :k+1])
y_rt[n+1, k] = x0 + np.sum(integrando[:-1]) * hNa regra do retângulo, integrando[:-1] seleciona os pontos à esquerda de cada
subintervalo, implementando (11).
| n | Trapézio | Retângulo |
|---|---|---|
| 0 | 1.00e+00 | 1.00e+00 |
| 2 | 2.08e−01 | 2.08e−01 |
| 5 | 4.67e−03 | 5.32e−03 |
| 8 | 2.53e−05 | 7.18e−04 |
| 11 | 8.11e−08 | 6.93e−04 |
| 14 | 1.25e−07 | 6.93e−04 ⌊ |
O trapézio atinge piso numérico da ordem de ; o retângulo estabiliza em — um piso que não diminui aumentando .

Objetivo 3
Domínio simétrico e o piso do retângulo
O Objetivo 3 estende o domínio para , exigindo integração bidirecional a partir de . Essa extensão expõe um problema assimétrico entre os dois integradores: enquanto o trapézio mantém convergência em , o retângulo acumula um piso de erro irredutível que não pode ser reduzido aumentando .
| Parâmetro | Descrição | Valor |
|---|---|---|
| ε | Raio de (−ε, ε) | 0,85 |
| L | Pontos (ímpar) | 10001 |
| N | Iterados | 14 |
Para , a equação integral requer
i0 = L // 2 # índice de t = 0
for n in range(N):
for k in range(L):
if k > i0: # t > 0
intg = F(t[i0:k+1], y_tp[n, i0:k+1])
y_tp[n+1, k] = x0 + np.trapezoid(intg, t[i0:k+1])
elif k < i0: # t < 0: sinal negativo
intg = F(t[k:i0+1], y_tp[n, k:i0+1])
y_tp[n+1, k] = x0 - np.trapezoid(intg, t[k:i0+1])
else:
y_tp[n+1, k] = x0O erro de quadratura global da regra do retângulo ao integrar sobre para é
Para o trapézio, o erro local por subintervalo é , resultando em erro global . O trapézio converge duas ordens a mais em , tornando-o sempre preferível do ponto de vista da convergência.
| n | Trapézio | Retângulo |
|---|---|---|
| 0 | 5.67e+00 | 5.67e+00 |
| 3 | 2.94e+00 | 2.94e+00 |
| 6 | 7.32e−01 | 7.39e−01 |
| 9 | 6.67e−02 | 7.97e−02 |
| 12 | 2.36e−03 | 1.66e−02 |
| 14 | 1.65e−04 | 1.44e−02 ⌊ |
Os decaimentos observados nos gráficos de erro pontual são pontos onde a curva iterada toca ou se aproxima muito da solução exata. A assimetria entre os lados e deve-se ao acúmulo de erro pelo uso de pontos à esquerda.

Objetivo 4
Domínios maiores e otimização
O Objetivo 4 concentra as contribuições computacionais e teóricas mais relevantes do trabalho. Do lado algorítmico, a implementação direta de complexidade é substituída por uma versão incremental de complexidade , tornando viável o uso de pontos.
| Parâmetro | Descrição | Valor |
|---|---|---|
| ε | Raio | 0,99 |
| L | Pontos (ímpar) | 20001 |
| N | Iterados | 30 |
Redução de complexidade
Nos Objetivos 1–3, o cálculo de aplica a quadratura no subintervalo , o que exige o recálculo de toda a integral desde o ponto inicial a cada passo, com custo operações. Somando sobre todos os pontos à direita de :
e de forma análoga no lado negativo, totalizando por iterado e no total. Para e , isso representa operações.
A redução a baseia-se na propriedade de acumulação incremental: a regra do trapézio satisfaz
e a do retângulo, . Cada custa operações, reduzindo o custo por iterado a .
| Versão | Complexidade | Operações | Fator |
|---|---|---|---|
| Direta (Obj. 1–3) | O(NL²) | ≈ 3,0 × 10⁹ | 2500× |
| Incremental | O(NL) | ≈ 1,2 × 10⁶ | 1× |
for n in range(N):
f_tp = F(t, y_tp[n]) # avalia F uma vez em todos os pontos
I_tp_pos = np.zeros(L)
for k in range(i0 + 1, L): # direcao positiva
I_tp_pos[k] = I_tp_pos[k-1] + (f_tp[k-1] + f_tp[k]) / 2.0 * h
I_tp_neg = np.zeros(L)
for k in range(i0 - 1, -1, -1): # direcao negativa
I_tp_neg[k] = I_tp_neg[k+1] + (f_tp[k] + f_tp[k+1]) / 2.0 * h
y_tp[n+1, i0+1:] = x0 + I_tp_pos[i0+1:]
y_tp[n+1, :i0] = x0 - I_tp_neg[:i0]
y_tp[n+1, i0] = x0Iterados necessários por tolerância
O valor é calculado via a recorrência
que evita overflow numérico ao não calcular as potências e os fatoriais separadamente.
| Tolerância τ | N_max |
|---|---|
| 10⁻² | 6 |
| 10⁻⁴ | 8 |
| 10⁻⁶ | 11 |
| 10⁻⁸ | 12 |
| 10⁻¹⁰ | 14 |
| 10⁻¹² | 16 |

Convergência fora do raio garantido
O código usa . O teorema não garante convergência nesse regime; contudo, a série (15) converge para , de modo que os iterados convergem numericamente em . Para a solução cresce rapidamente em direção à singularidade em , e os iterados precisam de iterações para acompanhá-la — consequência de , que faz os primeiros iterados piorarem antes de convergir.

Objetivo 5
Sistema bidimensional
A equação com , é reescrita como sistema de primeira ordem:
A solução exata é
Ao contrário do Objetivo 4, é uma função inteira em (sem singularidade real), implicando que os iterados convergem em qualquer domínio compacto.
| Parâmetro | Descrição | Valor |
|---|---|---|
| ε | Raio | 0,9468 |
| L | Pontos (ímpar) | 30001 |
| N | Iterados | 14 |
| x₀ | Condição inicial | (1, 0)ᵀ |
Adaptações para d = 2
A adaptação é mínima estruturalmente: o vetor de iterados passa a ter forma , os acumuladores e têm forma , e a recorrência (17) é aplicada elemento a elemento pelo NumPy sem alteração de código.
| Objeto | EDO4 (d = 1) | EDO5 (d = 2) | Descrição |
|---|---|---|---|
| y_tp | (N+1, L) | (N+1, L, 2) | Iterados |
| I_tp_pos | (L,) | (L, 2) | Acumulação positiva |
| x0 | 1.0 | array([1., 0.]) | Condição inicial |
def F(t, x): # x tem estrutura (L, 2)
dx1 = x[:, 1]
dx2 = -x[:, 0] + 2.0 * np.sin(t)
return np.column_stack([dx1, dx2])
y_tp = np.zeros((N+1, L, 2))
y_tp[0, :, :] = x0 # x0 = array([1., 0.])
I_tp_pos = np.zeros((L, 2))
for k in range(i0 + 1, L):
I_tp_pos[k] = I_tp_pos[k-1] + (f_tp[k-1] + f_tp[k]) / 2.0 * hConstante de Lipschitz exata
Para :
Portanto para todo . O campo é afim em com parte linear , onde
é uma rotação e, portanto, uma isometria — sua norma espectral é . Já
com quando .
| n | Trapézio |
|---|---|
| 0 | 1.58e+00 |
| 2 | 1.98e−01 |
| 4 | 8.14e−03 |
| 6 | 1.65e−04 |
| 8 | 1.99e−06 |
| 10 | 1.49e−08 |
| 12 | 9.98e−10 |
| 14 | 9.09e−10 |


| Tolerância τ | EDO4 (F = x²) | EDO5 (2D) |
|---|---|---|
| 10⁻² | 6 | 6 |
| 10⁻⁴ | 8 | 8 |
| 10⁻⁶ | 11 | 10 |
| 10⁻⁸ | 12 | 12 |
| 10⁻¹⁰ | 14 | 14 |
| 10⁻¹² | 16 | 16 |
Com e , o produto , e a cota (6) reduz-se a , que decresce monotonamente desde o primeiro iterado — sem o período inicial de piora observado no Objetivo 4. O sistema bidimensional é, portanto, intrinsecamente mais favorável ao método de Picard.
Síntese
Conclusões
O desempenho do método de Picard depende diretamente da estrutura algébrica do campo . A constante de Lipschitz determina tanto o tamanho do domínio acessível quanto a velocidade de convergência, via a cota . Quanto mais próximo de linear for em , mais favorável é o método.
1. O trapézio é sempre preferível ao retângulo
O trapézio tem ordem frente ao do retângulo, resultando num piso de erro irredutível mais baixo que não pode ser eliminado aumentando . No Objetivo 2, o piso do retângulo estabiliza em enquanto o trapézio atinge — quatro ordens de diferença para os mesmos parâmetros.
2. Convergência além do raio teórico para F = x²
O teorema garante convergência apenas para , mas os iterados convergem numericamente em todo , porque coincidem com as somas parciais da série geométrica . Para a divergência é verificável executando o código do Objetivo 4 com .
3. Otimização computacional — fator 2500×
A substituição da integração direta pela acumulação incremental reduz a complexidade de para , tornando viável trabalhar com pontos. Para : de para operações.
4. O sistema 2D é intrinsecamente mais favorável
Com constante — reflexo de a parte linear ser uma isometria — o produto garante que a cota decai monotonamente desde o primeiro iterado, sem o período de piora inicial do Objetivo 4, onde . Além disso, a solução é inteira em : não há limitação de domínio análoga ao teto .
5. Equilíbrio entre N e L
Os dois termos do erro total têm dependências opostas: aumentar reduz o erro de convergência exponencialmente via o fatorial; aumentar reduz o erro de quadratura como . O valor mínimo efetivo para equilíbrio, dado fixo, satisfaz
Na prática, para e trapézio, já equilibra os dois termos.
Comparativo final
| Aspecto | F = x² | Sistema 2D |
|---|---|---|
| C(δ) | 2(1+δ), cresce | 1, constante |
| Cε_num | ≈ 3,96 > 1 | = 1 |
| Cota | Cresce antes de cair | Decresce desde n = 0 |
| Singularidade | t = 1 (real) | Inteira em ℝ |
| Domínio | Limitado a |t| < 1 | Qualquer compacto |
Em geral, problemas cujo campo admite uma decomposição com pequena e uniformemente limitada são intrinsecamente mais favoráveis ao método: a cota decai mais rapidamente e domínios maiores são acessíveis sem aumentar . Há, ainda assim, uma limitação numérica ao aumentar o domínio em ambos os casos, pelo acúmulo de erro do método numérico — erro que pode ser controlado com a otimização dos parâmetros.
Sumário dos cinco objetivos
| Arquivo | Domínio | d | Complexidade |
|---|---|---|---|
| EDO1.py | [0, 0,25] | 1 | O(NL²) |
| EDO2.py | [0, 0,5] | 1 | O(NL²) |
| EDO3.py | (−0,85, 0,85) | 1 | O(NL²) |
| EDO4.py | (−0,99, 0,99) | 1 | O(NL) |
| EDO5.py | (−1, 1) | 2 | O(NL) |
Referência
M. Viana e J. Espinar, Equações Diferenciais Ordinárias, IMPA, Rio de Janeiro, 2025.