Digite uma matriz ou escolha um exemplo, aplique operações elementares uma de cada vez (ou escalone tudo de uma vez) e acompanhe o sistema de equações mudar. As entradas podem ser inteiros, frações e expressões com letras, como 1/3, a, (a+1)/(a-1) e sqrt(2).
Matriz e operações elementares
entrada, escalonamento e desfazer
Use * para multiplicar. O cálculo simbólico é genérico: dividir por uma expressão com parâmetros supõe que ela seja não nula.
Operações elementares
O sistema em forma de equações
atualizado após cada operação
Interpretação geométricaretas em 2D e planos em 3D
Disponível para sistemas numéricos quadrados 2×2 e 3×3. O conjunto solução é destacado quando for um ponto, uma reta ou um plano.
Análise da matrizdeterminante, posto, núcleo, inversa e espectro
ExportaçãoLaTeX e matrizes para CAS
Gerar LaTeX como:
Gerar matrizes para CAS:
Motor simbólico: Algebrite 1.4.0 (MIT). Gráficos: Plotly.js 3.3.1 (MIT). Ambos são carregados quando necessário de um CDN público; suas matrizes nunca são enviadas a um servidor de cálculo.
Uma placa, temperaturas fixas na borda e uma pergunta: como achar a temperatura em cada ponto interior? O método de Gauss–Seidel responde atualizando um ponto de cada vez. Abaixo da animação há um minicurso que leva da lei de Fourier à taxa de convergência do método, com números que você pode conferir na própria página.
Distribuição de temperatura
A placa em transformação
Pronta para começar
Clique na placa para inspecionar um nó.
ITERAÇÕES COMPLETAS0
ALTERAÇÃO \(\|T^{(k+1)}-T^{(k)}\|_\infty\)—
RESÍDUO \(\|r^{(k+1)}\|_\infty\)—
A borda permanece fixa em todas as iterações.
POR DENTRO DO MÉTODO
Os vizinhos dão a resposta
Nó (i, j)
Sem fontes internas de calor, a equação de Laplace é \(\dfrac{\partial^2 T}{\partial x^2}+\dfrac{\partial^2 T}{\partial y^2}=0\). Nesta malha, \(\Delta x = \Delta y\): cada nó interior recebe a média dos seus quatro vizinhos.
Varredura da esquerda para a direita e de cima para baixo. Os valores novos são usados imediatamente. Vizinhos que estão na borda conservam o valor prescrito.
ACOMPANHE A CONVERGÊNCIA
Cada vez mais perto
Usamos a norma do máximo: \(\|v\|_\infty=\max_m |v_m|\). A alteração compara duas iterações; o resíduo mede o afastamento das equações de equilíbrio.
ALTERAÇÃOResíduo normalizado
Escala vertical logarítmicaIterações →
Quando a animação para?
Ao fim de uma varredura, quando \(\|T^{(k+1)}-T^{(k)}\|_\infty\leq\varepsilon\). Basta tomar a maior diferença em valor absoluto entre as temperaturas novas e antigas. A linha tracejada marca \(\varepsilon\).
Em cada nó, \(r_{i,j}=T_{i,j}-(T_{i-1,j}+T_{i+1,j}+T_{i,j-1}+T_{i,j+1})/4\). Resíduo e alteração não são o erro em relação à solução exata.
TEORIA CONTRA MEDIDA
Fator previsto por iteração, \(\rho_{GS}\)
—
Fator medido (últimas iterações)
—
Iterações que faltam (estimativa)
—
Distância estimada à solução exata
—
O fator é \(\rho_{GS}=\big(\tfrac12\cos\tfrac{\pi}{N_x}+\tfrac12\cos\tfrac{\pi}{N_y}\big)^2\) para uma malha com \(N_x\times N_y\) células. As estimativas usam \(\|e\|\approx\rho\,\delta/(1-\rho)\), onde δ é a última variação. Veja “Lendo a página” no minicurso abaixo.
UM MINICURSO
A teoria completa, passo a passo
Cada pergunta abre uma lição curta ligada a algo desta página. Leia na ordem, ou vá direto à que precisar; o último grupo traz experimentos e exercícios com os números que você deve obter.
1. A física
O que exatamente está sendo animado?
As aproximações sucessivas de um método iterativo para o problema estacionário. O contador mede iterações de Gauss–Seidel, não tempo físico: esta animação não resolve a equação do calor transiente. Supomos uma placa homogênea de condutividade constante, sem fontes internas de calor, fina o bastante para que a temperatura dependa só da posição (x, y) na placa. As cores são a temperatura, os números sob a placa são a aproximação atual, e os três contadores dizem até onde a iteração chegou.
Do fluxo de calor à equação de Laplace
O calor flui do quente para o frio, com taxa proporcional ao gradiente de temperatura (lei de Fourier): o fluxo é \(\mathbf q=-k\nabla T\), com k a condutividade. A conservação de energia em um pedacinho da placa diz que a temperatura sobe à taxa em que o fluxo que entra supera o que sai, o que dá a equação do calor
Se as bordas são mantidas a temperaturas fixas por muito tempo, a placa para de mudar: \(\partial T/\partial t=0\). O estado estacionário satisfaz então a equação de Laplace \(\Delta T=0\) na placa, com as temperaturas prescritas na borda (um problema de Dirichlet). A página resolve exatamente esse problema: sua resposta é onde a placa física se acomodaria, e a iteração é um caminho computacional até lá, não o caminho físico.
Por que a resposta é confiável? O princípio do máximo
As soluções da equação de Laplace têm a propriedade do valor médio: a temperatura em um ponto é a média das temperaturas sobre qualquer círculo em volta dele. Duas consequências. Primeira, o princípio do máximo: os pontos mais quente e mais frio estão na borda, nunca no interior. Confira na página: a escala de cores vai sempre do menor ao maior valor da borda, e nenhuma cor interior sai dela (o exemplo “interior quente, borda fria” apenas esfria até 0 °C uniforme). Segunda, a unicidade: duas soluções com os mesmos valores na borda diferem por uma solução com borda nula, que tem de ser nula em toda parte. Logo, o campo de temperaturas para o qual o método converge é a resposta, não uma entre várias.
A versão discreta é a própria fórmula do método: cada valor interior é a média dos quatro vizinhos. Médias nunca saem do intervalo dos números médios; assim, toda iterada de Gauss–Seidel fica entre o menor e o maior valor da borda.
Uma solução exata para comparar
Tome o exemplo “Borda superior senoidal”: a placa é \(0\le x\le a=1{,}5\), \(0\le y\le b=1\), a borda superior tem \(T=A\sin(\pi x/a)\) com A = 100 °C e as outras três bordas estão a 0 °C. A separação de variáveis dá a solução exata (y medido a partir da borda inferior)
No centro da placa, \(x=0{,}75,\ y=0{,}5\), isso dá \(T=100\cdot0{,}3124\ldots=31{,}2444\) °C. É o número do qual a solução numérica deve se aproximar quando a malha é refinada. Sonde o nó central das malhas 31 × 21 e 61 × 41 (clique na placa) e compare: o Experimento 5 abaixo traz os números.
2. Da equação a um sistema linear
A malha e a diferença central
Cobrimos a placa com uma grade de nós igualmente espaçados, \(x_i=i\,\Delta x\), \(y_j=j\,\Delta y\), e procuramos as temperaturas \(T_{i,j}\) nos nós. Uma derivada segunda vira uma diferença, pelo teorema de Taylor:
A fórmula está correta a menos de um erro proporcional a \(\Delta x^2\): é uma aproximação de segunda ordem. Dividir o espaçamento por dois divide por quatro o erro da fórmula. O mesmo vale em y.
A fórmula de cinco pontos e o sistema linear
Insira as duas diferenças centrais em \(\Delta T=0\). Com \(\Delta x=\Delta y\) (todas as malhas desta página) a equação em um nó interior é
Os vizinhos na borda são números conhecidos e passam para o lado direito. Obtemos uma equação linear por nó interior, logo um sistema \(A\,x=b\) com \(N=(n_x-2)(n_y-2)\) incógnitas: 126, 551, 2 301, 9 401 e 38 001 para as cinco malhas da página. Eis o menor caso interessante, um interior 2 × 2 (incógnitas \(T_{1,1},T_{2,1},T_{1,2},T_{2,2}\) numeradas linha a linha, com os valores da borda entrando em \(b\)):
A matriz é simétrica e definida positiva, diagonalmente dominante, e tem no máximo cinco elementos não nulos por linha, qualquer que seja o tamanho: é esparsa. Para N = 38 001 uma matriz cheia teria 1,4 bilhão de entradas; esta tem menos de 190 000 não nulos. A esparsidade é a razão de os métodos iterativos serem atraentes.
Dois erros diferentes: discretização e iteração
A imagem na tela está errada por duas razões independentes. O erro de discretização é a diferença entre a solução exata do sistema linear e a temperatura verdadeira da placa: vem de trocar derivadas por diferenças, comporta-se como \(\Delta x^2\) e não depende de quanto iteramos. O erro de iteração é a diferença entre a iterada atual e a solução exata do sistema linear: tende a zero com as iterações. Tolerância e malha devem ser escolhidas juntas: não adianta iterar até 10⁻¹² numa malha grossa cujo erro de discretização é 0,1, nem usar uma malha fina parada nas primeiras iterações.
Números para a borda senoidal, centro da placa (valor exato 31,2444 °C): a malha 31 × 21 dá 31,2677 (erro 0,0233) e a malha 61 × 41 dá 31,2502 (erro 0,0058). O erro foi dividido por 4,0 quando o espaçamento foi dividido por dois, exatamente como a segunda ordem prevê.
3. Resolvendo o sistema
Por que não resolver o sistema diretamente?
A eliminação gaussiana em uma matriz cheia N × N custa cerca de \(N^3/3\) operações e \(N^2\) de memória. Para a malha 31 × 21 (N = 551) isso é trivial, e para N = 38 001 é inviável se a esparsidade for ignorada (cerca de \(2\times10^{13}\) operações). Aproveitar a estrutura em banda (as incógnitas só se acoplam às de uma linha acima ou abaixo) reduz a eliminação, em duas dimensões, a um custo administrável, e na prática solucionadores diretos de banda ou esparsos são excelentes para placas. O problema aparece em três dimensões, ou quando a malha continua sendo refinada: a eliminação cria novos não nulos (preenchimento) e seu custo cresce muito mais rápido que o número de incógnitas. Os métodos iterativos só multiplicam pela matriz esparsa, nunca a alteram, usam memória proporcional a N e dão uma resposta utilizável após poucas iterações. O problema deles é a velocidade de convergência, estudada adiante.
Jacobi e Gauss–Seidel
Resolva cada equação para a sua própria incógnita e use os valores mais recentes disponíveis. Jacobi usa apenas valores da iteração anterior: \(T^{(k+1)}_{i,j}=\tfrac14\big(T^{(k)}_{i-1,j}+T^{(k)}_{i+1,j}+T^{(k)}_{i,j-1}+T^{(k)}_{i,j+1}\big)\). Gauss–Seidel sobrescreve cada valor de imediato; assim os vizinhos já visitados nesta iteração (oeste e norte, na ordem da página, da esquerda para a direita e de cima para baixo) são novos e os demais (leste e sul) são antigos:
O cartão “Por dentro do método” mostra isso, nó a nó, se você escolher “Nó a nó”. Em linguagem matricial, escreva \(A=D-L-U\) (diagonal, menos a parte estritamente inferior, menos a parte estritamente superior). Jacobi é \(Dx^{(k+1)}=(L+U)x^{(k)}+b\) e Gauss–Seidel é \((D-L)x^{(k+1)}=Ux^{(k)}+b\). Gauss–Seidel não precisa de um segundo vetor, e é por isso que o código é tão curto, mas o resultado depende da ordem da varredura.
Quando converge, e com que rapidez?
Escreva a solução exata como \(x^*\) e o erro como \(e^{(k)}=x^*-x^{(k)}\). Subtraindo a iteração da equação que \(x^*\) satisfaz obtém-se \(e^{(k+1)}=G\,e^{(k)}\), onde G é a matriz de iteração (\(G=(D-L)^{-1}U\) para Gauss–Seidel). Logo \(e^{(k)}=G^ke^{(0)}\), e a iteração converge para qualquer chute inicial se e somente se o raio espectral satisfaz \(\rho(G)<1\). Dominância diagonal (com irredutibilidade, verdadeira aqui) ou ser simétrica definida positiva são condições suficientes, e ambas valem para a nossa matriz.
Para este problema os autovalores são conhecidos. Com \(N_x=n_x-1\) e \(N_y=n_y-1\) células em cada direção,
A relação \(\rho_{GS}=\rho_J^2\) (Young, para matrizes “consistentemente ordenadas”, como esta) significa que Gauss–Seidel converge duas vezes mais rápido que Jacobi. Valores para as malhas da página: 0,9305 (16 × 11), 0,9823 (31 × 21), 0,9956 (61 × 41), 0,9989 (121 × 81), 0,9997 (241 × 161). Eles se aglomeram perto de 1: quanto mais fina a malha, mais lento o método.
Quantas iterações serão necessárias?
Se o erro encolhe pelo fator ρ a cada iteração, reduzi-lo por um fator \(10^{-d}\) exige \(k\approx d\ln10/(-\ln\rho)\) iterações. Como \(1-\rho_{GS}\) é proporcional a \(1/N_x^2\), o número de iterações cresce como \(N_x^2\): refinar a malha por um fator 2 multiplica as incógnitas por 4 e as iterações por cerca de 4, logo o trabalho total por cerca de 16. Medido no exemplo “quatro lados” a partir de zero e tolerância 0,001: 120 iterações (16 × 11), 405 (31 × 21), 1 314 (61 × 41). O fator entre as duas últimas é 3,2 e tende a 4 à medida que a tolerância passa a incidir sobre modos cada vez mais lentos.
Essa é a fraqueza central do método, e a motivação para métodos melhores, a seguir.
Métodos mais rápidos: SOR, gradientes conjugados, multigrid
A sobre-relaxação sucessiva (SOR) leva cada valor além do valor de Gauss–Seidel: \(T\leftarrow T+\omega\,(T_{GS}-T)\), com \(1\lt \omega\lt 2\). A melhor escolha para este problema é \(\omega_{opt}=2/\big(1+\sqrt{1-\rho_J^2}\big)\), e então o raio espectral cai para \(\omega_{opt}-1\), de modo que o número de iterações cresce como \(N_x\) em vez de \(N_x^2\). Para a malha 31 × 21, \(\omega_{opt}=1{,}765\): o exemplo “quatro lados” converge em 54 iterações em vez de 405 (e Jacobi precisa de 738). Uma linha a mais de código, um fator 7 no tempo.
Mais duas ideias, ambas assuntos para um curso posterior. O método dos gradientes conjugados, para matrizes simétricas definidas positivas, também precisa de cerca de \(N_x\) iterações. Os métodos multigrid usam o fato de que Gauss–Seidel elimina erros irregulares em poucas iterações e só os erros suaves sobrevivem (veja as primeiras iterações na página: a imagem fica suave rápido e depois deriva muito devagar); erros suaves podem ser representados e corrigidos numa malha mais grossa, por uma fração do custo. Um multigrid bem construído resolve o problema com trabalho proporcional a N, o melhor possível.
4. Lendo a página
Os três números: variação, resíduo e erro
Três grandezas diferentes são fáceis de confundir. O erro \(\|e^{(k)}\|=\|x^*-x^{(k)}\|\) é o que queremos e não podemos ver, pois \(x^*\) é desconhecida. A variação \(\delta_k=\|x^{(k+1)}-x^{(k)}\|_\infty\) é a maior diferença entre duas iterações consecutivas. O resíduo mede o quanto as equações \(T=\text{média dos vizinhos}\) são violadas.
A variação é o teste de parada da página, e é um bom indicador, não uma garantia. Se o erro encolhe por ρ a cada iteração, \(x^{(k+1)}-x^{(k)}=e^{(k)}-e^{(k+1)}\approx(1-\rho)\,e^{(k)}\), e portanto
Para a malha 31 × 21, \(\rho/(1-\rho)\approx55\): quando a variação cai abaixo de 0,001 °C as temperaturas ainda podem estar erradas por cerca de 0,055 °C. Eu conferi: o exemplo “quatro lados” para após 405 iterações com erro verdadeiro de 0,0546 °C (o fator 55 previa 0,055). Na malha mais fina o fator é 3 591. É por isso que a página mostra, ao lado do gráfico, uma estimativa da distância à solução exata, e que códigos sérios usam testes mais rigorosos que “nada se mexeu”.
O que o gráfico e a caixa de teoria mostram
Como \(e^{(k)}=G^ke^{(0)}\), após um breve transiente o erro é dominado pelo autovetor do maior autovalor, e é multiplicado por cerca de ρ a cada iteração. O logaritmo da variação cai então ao longo de uma reta com inclinação \(\log_{10}\rho\) por iteração: uma reta no gráfico logarítmico é a assinatura da convergência geométrica (linear). A caixa de “teoria” compara quatro números: o fator previsto \(\rho_{GS}\) pela fórmula acima, o fator medido nas últimas iterações (média geométrica das razões entre variações consecutivas: deve se acomodar na previsão), o número de iterações adicionais previsto para atingir a tolerância, \(\ln(\varepsilon/\delta_k)/\ln\rho\), e a estimativa \(\rho\,\delta_k/(1-\rho)\) da distância à solução exata. Veja o fator medido se aproximar do previsto à medida que as iterações avançam.
O erro que decai mais devagar é o mais suave: uma única corcova sobre a placa inteira (o produto \(\sin\sin\)). É por isso que, no fim da execução, as cores parecem congeladas enquanto a variação ainda cai: resta apenas uma correção muito suave e pequena.
O que acontece nos cantos?
Quando dois lados têm valores diferentes no mesmo canto, mostramos a média deles. Os quatro cantos não são vizinhos diretos de nenhum nó interior, de modo que essa convenção não altera o sistema resolvido. (Matematicamente, o dado de Dirichlet dá um salto num canto assim, e a solução exata tem comportamento singular ali; a solução continua boa longe do canto, mas o erro de discretização é maior perto dele.)
5. Faça você mesmo
Experimentos guiados
Conte as iterações. Exemplo “Quatro lados, quatro temperaturas”, malha 31 × 21, tolerância 0,001, início 0. Aperte Iniciar e anote o número de iterações quando parar (405). A caixa de teoria o prevê bem durante a execução?
Refine a malha. Repita com 16 × 11 (120 iterações) e 61 × 41 (1 314 iterações). Calcule as razões e compare com “cerca de 4 por refinamento”.
Mude o início. Com 31 × 21, comece o interior em 50 °C em vez de 0: 264 iterações. Em 100 °C: 413. Por que 50 é o melhor dos três?
Superposição. A solução é linear nos dados de borda. Sonde um nó em “Quatro lados”, depois rode “Só a borda superior aquecida” e a mesma placa só com a borda esquerda em 100 (digite 0, 0, 100, 0) e só com a direita em 100. Combine \(1\cdot\)topo\(+0{,}75\cdot\)esquerda\(+0{,}25\cdot\)direita e compare com a primeira sonda.
Compare com a solução exata. Exemplo “Borda superior senoidal”. Sonde o nó central: 31,268 (31 × 21), 31,250 (61 × 41); valor exato 31,244. Refine de novo e veja o erro cair por um fator 4.
Tolerância contra precisão. Em 31 × 21, tolerância 0,001 para com erro verdadeiro de cerca de 0,055; tolerância 10⁻⁶ leva 791 iterações e deixa erro de cerca de 5·10⁻⁵. Leia a estimativa da caixa de teoria em cada parada.
Princípio do máximo. Exemplo “Interior quente, borda fria”: nenhum valor interior sai do intervalo, e tudo esfria até 0 °C.
Ordem das atualizações. Escolha “Nó a nó” e acompanhe o cartão Por dentro do método: quais vizinhos são novos e quais são antigos?
Exercícios para a turma
Deduza a fórmula de cinco pontos para espaçamentos desiguais: \(T=\dfrac{w_x(T_W+T_E)+w_y(T_N+T_S)}{2(w_x+w_y)}\) com \(w_x=1/\Delta x^2\), \(w_y=1/\Delta y^2\). (O código para baixar a usa.)
Para o sistema com interior 2 × 2 acima com \(b=(100,100,0,0)\), faça à mão duas iterações de Jacobi e duas de Gauss–Seidel a partir de zero e compare com a solução exata (que é \((37{,}5,\,37{,}5,\,12{,}5,\,12{,}5)\)).
No código para baixar, mude uma linha para obter Jacobi (leia de uma cópia do vetor antigo) e verifique que precisa de cerca de 1,8 vez mais iterações (738 contra 405).
Acrescente SOR: \(t[p]=t[p]+\omega\,(\text{value}-t[p])\). Experimente \(\omega=1{,}765\) em 31 × 21 e ache o melhor \(\omega\) experimentalmente; compare com \(2/(1+\sqrt{1-\rho_J^2})\).
Verifique que o fator de contração medido se acomoda em \(\rho_{GS}\), e que \(\rho_{GS}=\rho_J^2\), rodando também Jacobi.
Extrapolação de Richardson: com os valores centrais \(T_h=31{,}2677\) (31 × 21) e \(T_{h/2}=31{,}2502\) (61 × 41) calcule \((4\,T_{h/2}-T_h)/3\). Compare com o exato 31,2444. Por que funciona?
Mostre que a matriz do sistema é simétrica definida positiva e explique por que isso garante a convergência de Gauss–Seidel.
Duas hastes, duas massas e as leis de Newton. Solte pêndulos que diferem por um milionésimo de radiano e veja-os ficarem juntos, ou se separarem. O movimento é calculado ao vivo a partir das equações diferenciais, com métodos que você pode ler em poucas linhas de JavaScript simples: Euler, Heun, o método clássico de Runge–Kutta de ordem 4 e quatro integradores simpléticos que impedem a energia de derivar. Um gráfico de energia mostra o que cada método faz com uma grandeza que a natureza conserva.
Simulação
Os pêndulos
Pronto para começar
TEMPO0.00 s
ERRO DE ENERGIA \(|E-E_0|/E_{\max}\)0
TAXA DE DIVERGÊNCIA \(\lambda\)—
Condições iniciais
Posições e velocidades
Os ângulos são medidos a partir da vertical para baixo, em graus; as velocidades angulares são em radianos por segundo. Cada linha é um pêndulo. Mova um controle ou digite um valor exato (uma diferença de 0,00006° já é um milionésimo de radiano). Qualquer mudança reinicia o movimento no tempo 0.
O pêndulo k recebe os dados do pêndulo 1 mais (k−1) vezes este deslocamento em θ₁: o jeito mais rápido de fazer gêmeos quase idênticos.
O que uma grandeza conservada revela
O gráfico de energia
Sem amortecimento a energia verdadeira nunca muda; logo, qualquer variação da energia calculada é erro numérico. Cada visão conta uma história diferente: o erro em escala logarítmica, a troca entre energia cinética e potencial, ou uma corrida entre os sete métodos a partir do pêndulo 1.
tempo (s) →
Erro = |E − E₀| dividido por (m₁+m₂)gℓ₁ + m₂gℓ₂, a energia do pêndulo equilibrado de cabeça para baixo. Uma linha plana perto do fundo é o melhor que um computador consegue (cerca de 10⁻¹⁶, arredondamento). Uma linha que sobe continuamente é deriva; uma linha que oscila sem subir é a assinatura de um método simplético. Mudar para a corrida reinicia o experimento.
Integradores amigos da energia
Métodos simplécticos
Na forma hamiltoniana o estado é o par (q, p) de ângulos e momentos, e a energia é a função H. Um método simplético respeita a geometria do fluxo no espaço (q, p) e, por isso, seu erro de energia não deriva: apenas oscila, por tempos muito longos. O preço é que, para este H, cada passo exige resolver equações (os métodos são implícitos).
Simplético não significa conservar a energia exatamente: a energia fica numa faixa estreita em torno do valor inicial, e a faixa diminui como h² (ou h⁴ para Gauss). A linha da tabela do método selecionado fica destacada. Os contadores mostram avaliações de f (ou das derivadas do hamiltoniano) por passo e iterações de ponto fixo por passo.
Por dentro do método
Um passo de Runge–Kutta 4
O estado y reúne os dois ângulos e as duas velocidades angulares, e o movimento obedece a y′ = f(y). Um passo de tamanho h calcula a inclinação f quatro vezes e faz a média com pesos 1, 2, 2, 1. Abaixo estão os números do último passo do pêndulo 1.
Cada curva é a distância entre as massas inferiores de dois pêndulos, dividida pelo comprimento total, em escala logarítmica. Uma reta crescente significa crescimento exponencial: a assinatura do caos. Uma linha horizontal significa ordem.
distância, escala logarítmicatempo (s) →
A taxa de divergência λ mostrada acima é a inclinação de ln(distância) no trecho em que a distância cresce de 3 vezes o valor inicial até 5% do comprimento total.
A paisagem do caos
Quais partidas dão a volta?
Cada ponto é um modo de soltar o pêndulo do repouso, com θ₁ na horizontal e θ₂ na vertical. A cor indica quando um braço passa pela primeira vez por cima do pivô. Regiões escuras nunca viram em 10 s: movimento ordenado. O emaranhado de cores é o caos. Clique para levar o pêndulo escolhido até lá; role para ampliar.
Role ou use dois dedos para ampliar, arraste para mover; o mapa é recalculado para a janela que você vê, então ampliar revela estrutura mais fina.
vira cedovira tardenão vira (ordem)
Calculado no seu navegador com o mesmo código de Runge–Kutta 4, passo 0,01 s, até 10 s; é refeito quando as massas, os comprimentos ou o amortecimento mudam. O mapa sempre usa RK4, qualquer que seja o método escolhido acima.
A física
Equações de movimento
Com θ₁ e θ₂ medidos a partir da vertical, as equações de Lagrange dão duas equações de segunda ordem acopladas. Elas são lineares nas acelerações:
Resolvendo o sistema 2×2 para as acelerações α₁, α₂ e tomando as velocidades angulares como incógnitas, obtém-se um sistema de primeira ordem y′ = f(y), a forma de que Runge–Kutta precisa:
A energia E se conserva quando γ = 0, de modo que sua variação no tempo é um teste gratuito do método numérico. Com amortecimento (γ > 0) a energia realmente decai, e os gráficos passam a mostrar essa perda física, não um erro.
Um minicurso
O que está acontecendo aqui?
Abra as perguntas em ordem ou ao acaso. Cada uma aponta para algo que você pode ver na animação, e as duas últimas listas sugerem experimentos e exercícios.
1. Da física às equações
De onde vêm as equações?
Ponha o pivô na origem. Com os ângulos θ₁ e θ₂ medidos a partir da vertical para baixo, as massas estão em \(x_1=\ell_1\sin\theta_1,\ y_1=-\ell_1\cos\theta_1\) e \(x_2=x_1+\ell_2\sin\theta_2,\ y_2=y_1-\ell_2\cos\theta_2\). As leis de Newton para cada massa envolvem as trações desconhecidas das hastes. O método de Lagrange as evita trabalhando diretamente com os dois ângulos, as coordenadas generalizadas.
Com δ = θ₁ − θ₂, as energias cinética e potencial são
O lagrangiano é \(L=T-V\), e o movimento obedece às equações de Euler–Lagrange \(\frac{d}{dt}\frac{\partial L}{\partial\dot\theta_k}-\frac{\partial L}{\partial\theta_k}=0\) para k = 1, 2. Fazendo as derivadas obtém-se o sistema 2×2 mostrado em “Equações de movimento”. O termo cruzado de T, que contém cos δ, é o que acopla os dois ângulos; é também o que torna as equações não lineares.
Por que um sistema de primeira ordem, e o que o programa realmente calcula?
Os métodos de Euler e de Runge–Kutta resolvem sistemas de primeira ordem \(y'=f(y)\). Uma equação de segunda ordem vira de primeira ordem quando a velocidade é acrescentada como incógnita: \(\dot\theta=\omega,\ \dot\omega=\alpha\). Para dois ângulos o estado tem quatro componentes, \(y=(\theta_1,\theta_2,\omega_1,\omega_2)\).
Para calcular \(f(y)\) o programa precisa das acelerações; assim, cada avaliação resolve o sistema linear 2×2 para \(\alpha_1,\alpha_2\) pela regra de Cramer (veja a função deriv no código para baixar: cerca de dez linhas). O lado direito não contém t, portanto o sistema é autônomo, e é por isso que o código não carrega variável de tempo. Todo o resto da página, a animação, os gráficos e o mapa, é construído sobre chamadas repetidas a essa única função.
2. Integração numérica
O método de Euler e a série de Taylor
O método de Euler vem do desenvolvimento de Taylor
Mantendo dois termos obtém-se \(y_{n+1}=y_n+h\,f(y_n)\). O termo descartado é o erro de truncamento local, de tamanho \(h^2\): o erro cometido em um passo. Para chegar a um tempo final T precisamos de \(T/h\) passos, e os erros locais se acumulam; assim, o erro global é de tamanho \(h\). Dividir h por dois dobra o trabalho e divide o erro por dois, um mau negócio.
Geometricamente, Euler segue a reta tangente por um tempo h; mas o caminho verdadeiro se curva, e o passo tangente o deixa pelo lado de fora. Para um oscilador isso faz a amplitude crescer: para \(\ddot x=-\omega^2x\) pode-se verificar que cada passo de Euler multiplica a energia por \(1+h^2\omega^2\). Selecione Euler acima e veja o pêndulo ganhar energia do nada.
O que significa “ordem”, e como medi-la?
Um método tem ordem p quando seu erro global se comporta como \(C\,h^p\) quando \(h\to0\). Euler tem p = 1, Heun p = 2, Runge–Kutta 4 tem p = 4; entre os simplécticos, o Euler simplético tem p = 1, Störmer–Verlet e o ponto médio implícito p = 2, e o método de Gauss de dois estágios p = 4 (a tabela em “Métodos simplécticos” os lista).
A ordem se mede por um experimento: resolva o mesmo problema com passo h e com passo h/2. Se os erros são e e e′, então \(e/e'\approx2^p\), isto é, \(p\approx\log_2(e/e')\). O exercício 1 abaixo faz isso com uma solução de referência. O erro de energia mostra um expoente parecido, mas não idêntico, porque a energia só enxerga a amplitude do erro, não a sua fase. Para pequenas oscilações o erro de energia de Heun cresce como \(h^3\) e o de RK4 como \(h^5\) por unidade de tempo: no experimento de “pequenas oscilações”, para o pêndulo de 20° (a curva de cima), RK4 com h = 0,05 termina 60 s com cerca de 1,7·10⁻⁵, e com h = 0,02 com 1,8·10⁻⁷; a razão é cerca de 100, próxima de \(2{,}5^5\approx98\).
Heun e Runge–Kutta 4: de onde vêm os pesos
Resolver \(y'=f\) em um passo significa calcular \(\int_t^{t+h}f\), e todo método é uma regra de quadratura disfarçada. Euler usa o retângulo à esquerda. Heun usa a regra do trapézio, \(y_{n+1}=y_n+\tfrac h2\,[\,f(y_n)+f(y_n+h\,f(y_n))\,]\), em que a inclinação desconhecida da extremidade direita é prevista por um passo de Euler. RK4 é a regra de Simpson \(\tfrac h6(f_a+4f_m+f_b)\): o peso 4 no ponto médio é dividido entre k₂ e k₃, duas estimativas sucessivamente melhoradas da inclinação no ponto médio, e k₄ é a inclinação no fim. Os pesos 1, 2, 2, 1 da fórmula são exatamente os 1, 4, 1 de Simpson.
Escolher coeficientes para que o método concorde com a série de Taylor até \(h^4\) exige oito condições; este quadro satisfaz todas. Quatro inclinações por passo não alcançam a ordem 5: isso exige seis (resultado clássico de Butcher), e é por isso que RK4 é o ponto ótimo ensinado em aula.
Precisão contra custo
O custo real de um método é o número de vezes que ele avalia f. Euler usa 1 por passo, Heun 2, RK4 4; a linha sob a animação mostra o número medido para o método selecionado, incluindo as iterações dos implícitos. Uma comparação justa fixa o custo, não o passo: RK4 com h = 0,004 custa o mesmo que Euler com h = 0,001, e seu erro de energia é incomparavelmente menor. Ordem alta compensa porque o erro cai como \(h^p\) enquanto o custo cresce só como \(1/h\).
A comparação é mais sutil para os métodos implícitos: o método de Gauss custa entre cerca de 13 e 20 avaliações por passo nesta página (mais quando h cresce), de três a cinco vezes RK4, e em uma corrida caótica curta pode não ser melhor. Sua força é outra: o comportamento da energia a longo prazo, discutido a seguir.
3. Energia e geometria: métodos simplécticos
A energia como teste, e por que RK4 deriva
Sem amortecimento, a energia verdadeira \(E\) é constante. A energia calculada \(E(y_n)\) não é, e \(|E(y_n)-E(y_0)|\) é uma medida gratuita de erro: não precisa de solução de referência. É uma verificação necessária, não suficiente: um método pode conservar E e ainda errar a fase.
Rode RK4 na partida de “pequenas oscilações” com passo grande (h = 0,05) e olhe a curva de cima do gráfico de energia (o pêndulo de 20°): o erro sobe continuamente, uma reta na escala linear, cerca de 3·10⁻⁶ a cada dez segundos. Para um oscilador harmônico um passo de RK4 multiplica a amplitude por um fator um pouco menor que 1 (o fator da energia é \(1-(h\omega)^6/72+\cdots\)): um minúsculo amortecimento numérico, constante e sistemático, que se acumula. Euler faz o contrário (fator \(1+h^2\omega^2\)) e explode. Mude para a “corrida” para ver Euler fora da escala, Heun subindo rápido, RK4 subindo devagar e os simplécticos ficando no mesmo nível.
A forma de Hamilton: momentos e a função H
Defina os momentos \(p_k=\partial L/\partial\dot\theta_k\). Para o pêndulo duplo, com \(q=(\theta_1,\theta_2)\) e \(c=m_2\ell_1\ell_2\),
Estas são as equações de Hamilton, equivalentes às de Lagrange. Com \(\omega=M^{-1}p\) as derivadas são \(\partial H/\partial\theta_1=c\sin\delta\,\omega_1\omega_2+(m_1+m_2)g\ell_1\sin\theta_1\) e \(\partial H/\partial\theta_2=-c\sin\delta\,\omega_1\omega_2+m_2g\ell_2\sin\theta_2\). Note que H mistura q e p (a matriz M depende de q): é por isso que o leapfrog explícito simples dos livros não se aplica aqui.
O que é um método simplético?
O fluxo de um sistema hamiltoniano preserva uma estrutura geométrica do espaço (q, p), a forma simplética \(\sum_k dq_k\wedge dp_k\). Com um grau de liberdade isso é simplesmente área: uma mancha de condições iniciais é deformada pelo movimento, mas mantém sua área (o teorema de Liouville é uma consequência). Um método numérico é simplético se sua aplicação de um passo \((q_n,p_n)\mapsto(q_{n+1},p_{n+1})\) tem a mesma propriedade.
Por que isso ajuda a energia? A análise de erro regressiva mostra que os pontos calculados \(z_n\) são, com altíssima precisão, pontos exatos do fluxo de um hamiltoniano ligeiramente diferente \(\tilde H=H+h^pH_{p+1}+\cdots\). A solução numérica conserva \(\tilde H\); logo, o próprio H só pode oscilar cerca de \(h^p\), sem derivar, por tempos extremamente longos quando h é pequeno o bastante. Um método não simplético não tem tal hamiltoniano vizinho, e seus pequenos erros se acumulam numa só direção. A forma do gráfico da “corrida” é esse teorema tornado visível.
Ser simplético não torna a trajetória mais precisa: o erro de fase continua se acumulando e, no movimento caótico, o caminho acaba diferindo de qualquer modo. A garantia é de bom comportamento qualitativo e de longo prazo.
Os quatro métodos simplécticos desta página
Escreva \(H_q=\partial H/\partial q\), \(H_p=\partial H/\partial p\), \(z=(q,p)\) e \(F(z)=(H_p,-H_q)\).
Störmer–Verlet (ordem 2, a forma generalizada para H não separável): \(p_{n+\frac12}=p_n-\tfrac h2H_q(q_n,p_{n+\frac12})\); \(q_{n+1}=q_n+\tfrac h2[H_p(q_n,p_{n+\frac12})+H_p(q_{n+1},p_{n+\frac12})]\); \(p_{n+1}=p_{n+\frac12}-\tfrac h2H_q(q_{n+1},p_{n+\frac12})\).
Ponto médio implícito (ordem 2): \(z_{n+1}=z_n+h\,F\!\left(\tfrac{z_n+z_{n+1}}{2}\right)\).
O ponto médio implícito é o método de Gauss de um estágio. A família de Gauss é simplética para qualquer número de estágios (ordem 2s com s estágios). Os quatro agem sobre (q, p); a página converte de e para as velocidades angulares \(\omega=M^{-1}p\) para desenhar, e o amortecimento, quando presente, é aplicado a p como um fator de meio passo \(e^{-\gamma h/2}\) antes e depois do passo.
Métodos implícitos: resolver uma equação a cada passo
Em um método implícito o novo estado aparece nos dois lados, como na regra do ponto médio \(z_{n+1}=z_n+hF(\tfrac{z_n+z_{n+1}}{2})\). Cada passo é, portanto, uma equação não linear para \(z_{n+1}\). Esta página a resolve por iteração de ponto fixo: um chute inicial \(z^{(0)}\) (um passo de Euler) e depois repete-se \(z^{(k+1)}=z_n+hF(\tfrac{z_n+z^{(k)}}{2})\) até que duas iteradas coincidam a 10⁻¹⁴. A iteração é uma contração, logo converge, quando \(h\) vezes a constante de Lipschitz de F é menor que cerca de 1; por isso passos muito grandes podem precisar de muitas iterações (o contador sob a animação mostra a média). Em problemas rígidos usa-se o método de Newton, o mesmo do capítulo de equações não lineares do curso.
Assim, os métodos implícitos ligam três capítulos do cálculo numérico de uma vez: equações diferenciais, equações não lineares e a geometria do fluxo.
Os métodos simplécticos realmente conservam a energia?
Não, e é importante dizer isso com clareza. Eles mantêm a energia dentro de uma faixa estreita em torno do valor inicial; os números no gráfico oscilam mas não sobem. A largura da faixa é cerca de \(h^p\) vezes uma constante que depende do movimento, e é maior em partidas caóticas e com passos grandes (tente h = 0,05 nos gêmeos caóticos: Störmer–Verlet fica perto de 10⁻² enquanto RK4 sobe a cerca de 0,2 da escala de energia).
Um teorema de Ge e Marsden diz que um método de passo fixo não pode, em geral, ser simplético e conservar a energia exatamente ao mesmo tempo. Há métodos que conservam a energia exatamente (os de “gradiente discreto”, por exemplo), mas abrem mão da simplecticidade. E com amortecimento (γ > 0) nada deve conservar a energia: ela realmente decai, e o gráfico passa a mostrar a perda física, que os métodos simplécticos reproduzem fielmente.
4. Caos
Por que o pêndulo duplo é caótico?
Duas massas em duas hastes já dão quatro números de estado, e as equações são não lineares e acopladas. Com pouca energia o movimento é uma mistura suave de duas oscilações regulares (os modos normais: experimente o segundo experimento pronto). Com mais energia os braços podem passar por cima, e pequenas diferenças são amplificadas a cada oscilação: movimentos vizinhos se afastam aproximadamente como \(e^{\lambda t}\).
O que significa a taxa de divergência?
Se uma pequena distância cresce como \(d_0e^{\lambda t}\), então \(\lambda\) é o maior expoente de Lyapunov e \(\ln2/\lambda\) é o tempo para dobrar a distância. Em partidas caóticas do pêndulo duplo \(\lambda\) costuma estar entre um e poucos por segundo, de modo que uma diferença de um milionésimo atinge o tamanho do pêndulo em cerca de dez segundos. O número mostrado é estimado pela inclinação de \(\ln d\) contra t no trecho em que a distância cresce de três vezes o valor inicial até 5% do comprimento total.
A consequência é um horizonte de previsão: para prever até o tempo T com incerteza inicial \(\delta_0\) e tolerância \(\Delta\) precisamos de \(T\lesssim\frac1\lambda\ln(\Delta/\delta_0)\). Cada dígito decimal a mais de precisão compra apenas \(\ln10/\lambda\approx1{,}5\) s a mais. É por isso que a previsão de longo prazo é inviável, embora as equações sejam determinísticas.
O caos é real ou um artefato do computador?
É real: as próprias equações amplificam diferenças. O computador acrescenta seus próprios erros minúsculos (truncamento e arredondamento), de modo que depois de um tempo o caminho calculado não é o caminho verdadeiro. Ainda assim ele está muito próximo de um caminho verdadeiro de um experimento vizinho, e é por isso que figuras e estatísticas do caos calculadas com métodos e passos diferentes concordam mesmo quando os caminhos individuais não concordam. Compare dois passos ou dois métodos na mesma partida: eles se separam exatamente como os gêmeos, com a mesma taxa, e o tempo em que se separam cresce apenas logaritmicamente quando o erro diminui (veja o horizonte de previsão acima). Antes que o caos se instale, o erro numérico é o que você controla, e é isso que o gráfico de energia mede.
Como o mapa é calculado, e o que são as regiões escuras?
Para cada par de ângulos iniciais, com os dois braços em repouso, o programa executa Runge–Kutta 4 com passo 0,01 s até que um braço passe por cima do pivô ou se passem 10 segundos, e colore o ponto por esse tempo. Nada é consultado em tabela: milhares de pequenos problemas de valor inicial são resolvidos no seu navegador.
Partidas de baixa energia não conseguem virar, e aparecem escuras. Seu movimento é quase periódico e vive em toros invariantes que, segundo o teorema KAM, sobrevivem a pequenas perturbações de um sistema integrável. Quando a energia cresce os toros se rompem e dão lugar ao emaranhado de cores: pontos vizinhos viram em tempos completamente diferentes. Ainda podem ser encontradas ilhas de ordem dentro do mar caótico.
5. Faça você mesmo
Experimentos guiados
Euler ganha energia. Experimento “Ordem: pequenas oscilações”, método Euler, h = 0,02. Em dez segundos o erro de energia é de ordem 1 e os pêndulos sobem mais do que onde foram soltos. Passe para Heun e depois para RK4 e compare.
Deriva contra oscilação. Mesmo experimento, RK4, h = 0,05, gráfico “cada pêndulo”: a curva de cima (20°) sobe continuamente até cerca de 10⁻⁵ em 60 s. Agora selecione Gauss de 2 estágios: plana perto de 6·10⁻⁹. Störmer–Verlet também fica plano, cerca de 10⁻⁴, oscilando. Qual é “melhor”? Discuta precisão contra estrutura.
A corrida. Escolha a corrida com h = 0,02. Euler sai pelo topo, Heun sobe rápido, RK4 devagar, e a distinção tracejado/contínuo separa os não simplécticos dos simplécticos.
A troca. Escolha “energia cinética, potencial e total”: o total é plano enquanto as outras duas trocam energia. Repita com Euler e veja o total subir.
Ordem e caos. Experimento “Ordem e caos lado a lado”: compare as curvas de divergência. Depois mude h de 0,002 para 0,02 com RK4: os gêmeos caóticos ainda se separam com praticamente a mesma taxa.
Passos grandes. Gêmeos caóticos, h = 0,05, corrida: Euler diverge de imediato; RK4 chega a cerca de 0,2 da escala de energia e Störmer–Verlet fica perto de 10⁻². O caminho de algum deles merece confiança?
Amortecimento. Ponha γ = 0,2. A energia agora cai para todos os bons métodos: é física, não erro. Compare os métodos de novo.
Exercícios para a turma
Escreva o método de Euler em dez linhas para \(y'=-y\), \(y(0)=1\), e meça a ordem dividindo h por dois em \(t=1\). Repita para Heun e RK4.
Para \(\ddot x=-\omega^2x\) mostre que um passo de Euler multiplica \(E=\tfrac12(\dot x^2+\omega^2x^2)\) por \(1+h^2\omega^2\), e que \(|R(i\,h\omega)|^2=1-(h\omega)^6/72+\cdots\) para RK4, onde \(R(z)=1+z+z^2/2+z^3/6+z^4/24\).
Verifique que \(\det M=m_2\ell_1^2\ell_2^2(m_1+m_2\sin^2\delta)\) e inverta M à mão.
Para o oscilador harmônico \(\dot q=p,\ \dot p=-q\) resolva exatamente a equação do ponto médio implícito (um sistema linear 2×2) e mostre que \(q^2+p^2\) é preservado a cada passo.
No gráfico de divergência leia dois pontos do trecho reto e estime \(\lambda=\ln(d_2/d_1)/(t_2-t_1)\); compare com o número mostrado.
Baixe o código, mude a tolerância da iteração de ponto fixo (1e-14) para 1e-6 e veja como mudam a contagem de iterações e a faixa de energia.
Interpolação de Lagrange: o polinômio que passa pelos pontos
Dados \(n+1\) pontos com abscissas diferentes, existe exatamente um polinômio de grau no máximo \(n\) que passa por todos eles. Este aplicativo o desenha, para uma função de teste, uma fórmula sua ou pontos que você mesmo coloca, e deixa você olhar tudo o que a teoria diz sobre ele. Começa pela ideia de Lagrange, de que os polinômios \(\ell_j\) são eles próprios os polinômios interpoladores de tabelas muito simples, e de que toda outra tabela é uma combinação dessas; depois vêm a fórmula do erro com o polinômio dos nós, o fenômeno de Runge, os nós de Chebyshev, a constante de Lebesgue, a tabela de Newton e por que a matriz de Vandermonde é uma péssima maneira de calcular. A conta usa a fórmula baricêntrica, em poucas linhas de JavaScript puro, sem bibliotecas, e um script Python pronto permite repetir tudo no seu computador. Um curso completo vem logo abaixo.
O polinômio interpolador
Função, nós e p
Pronto
f (função)p (polinômio)nós \((x_j,y_j)\)
ERRO MÁXIMO \(\max|f-p_n|\)—
CONSTANTE DE LEBESGUE \(\Lambda_n\)—
COND. DE VANDERMONDE \(\kappa_\infty(V)\)—
Erro máx.: maior valor de \(|f-p|\) em 1500 pontos de \([a,b]\). Constante de Lebesgue: quanto os nós podem amplificar erros nos dados. Número de condição da matriz do sistema nos monômios.
A ideia de Lagrange
Toda tabela é combinação de tabelas especiais
Fixe os nós \(x_0,\dots,x_n\). A percepção de Lagrange foi que o problema todo se reduz a \(n+1\) tabelas muito simples. A tabela especial \(e_j\) vale \(1\) no nó \(x_j\) e \(0\) em todos os outros nós. Seu polinômio interpolador é, por definição, o polinômio de Lagrange \(\ell_j\): os \(\ell_j\) não são um truque de notação, eles são polinômios interpoladores, das tabelas especiais feitas com os mesmos \(x_k\) e com valores especiais \(y_k=\delta_{jk}\). Ora, qualquer tabela \(y\) é soma de tabelas especiais, \(y=y_0e_0+\dots+y_ne_n\), e a interpolação é linear (o dobro da tabela dá o dobro do polinômio, a soma de duas tabelas dá a soma dos polinômios). Logo
Nenhum sistema de equações é resolvido: a resposta para uma tabela é montada a partir das respostas para as tabelas especiais. Mexa nos controles abaixo para ver as duas metades da ideia.
Esquerda: uma tabela especial e seu polinômio
Direita: montando p a partir das peças
Por que \(\ell_j\) tem a fórmula que tem: precisa se anular nos \(n\) nós \(x_k\), \(k\ne j\), e ter grau no máximo \(n\), então é uma constante vezes \(\prod_{k\ne j}(x-x_k)\), e a constante é fixada por \(\ell_j(x_j)=1\). Nada mais poderia interpolar a tabela especial, pelo argumento de contagem de raízes da unicidade. O grupo A ideia de Lagrange do curso abaixo vai mais longe (matrizes, história, um exercício).
Em um relance
As quatro fórmulas para lembrar
Forma de Lagrange: \(\ell_j\) é o polinômio interpolador da tabela especial que vale \(1\) em \(x_j\) e \(0\) nos outros nós; toda tabela é combinação dessas.
Cada \(\ell_j\) tem grau \(n\), vale \(1\) em \(x_j\) e \(0\) nos outros nós. Somam \(1\) (a linha tracejada) e \(p\) é a combinação delas com pesos \(y_j\). A função de Lebesgue é a soma dos seus valores absolutos.
Erro
Onde o polinômio erra, e por quê
A fórmula do erro diz que \(f-p=\dfrac{f^{(n+1)}(\xi)}{(n+1)!}\,\omega(x)\). Compare as três famílias de nós, olhe o próprio \(\omega\), ou veja o mesmo polinômio calculado pela matriz de Vandermonde.
Convergência
O que acontece quando n cresce
Erro máximo contra o grau para as três famílias de nós, para a função escolhida acima, ou as constantes de Lebesgue das famílias em \([-1,1]\). A linha tracejada marca o \(n\) atual.
grau n
Formas
Tabela de Newton e cinco modos de calcular
As diferenças divididas (para \(n\le8\)) dão a forma de Newton; a linha de cima, destacada, são seus coeficientes. Abaixo, o mesmo valor \(p(x)\) é calculado por cinco algoritmos.
Os cinco são o mesmo polinômio, então as diferenças são erros de arredondamento. Ficam perto de \(10^{-16}\) para \(n\) pequeno, e o caminho de Vandermonde é o primeiro a piorar quando \(n\) cresce. A forma de Newton tem seu próprio aplicativo, ao lado deste.
Curso completo
Interpolação polinomial, da definição aos teoremas
Sete grupos de lições curtas. Cada uma aponta algo que você pode ver no aplicativo acima; os números citados foram medidos com o mesmo código que roda aqui (amostrando 4000 pontos do intervalo).
1 · O problema
O que é interpolação polinomial, e para quê?
Você conhece os valores de uma função \(f\) em \(n+1\) pontos distintos \(x_0\lt x_1\lt \dots\lt x_n\), os nós, digamos \(y_j=f(x_j)\). Os valores podem vir de uma medição, ou de uma fórmula cara de avaliar. A interpolação polinomial procura um polinômio \(p\) de grau no máximo \(n\) que assuma os mesmos valores nos nós:
\[p(x_j)=y_j,\qquad j=0,1,\dots,n.\]
Por que polinômios? São as funções mais simples que existem: calcular um exige apenas somas e produtos, e pode-se derivá-lo e integrá-lo exatamente. O teorema de Weierstrass diz que toda função contínua num intervalo fechado é limite uniforme de polinômios. E a interpolação é o motor de muitos outros métodos: a regra de Simpson e todas as fórmulas de quadratura, diferenças finitas, os métodos de Adams para equações diferenciais, o método da secante e a interpolação inversa para raízes, a extrapolação de Richardson e a integração de Romberg.
As perguntas deste curso são as naturais. Esse \(p\) existe, e é único? Como calculá-lo, e qual o melhor modo? Quão grande é \(f-p\) entre os nós? Dá para escolher bem os nós? O que acontece quando \(n\) cresce?
Existência e unicidade
Teorema. Se os nós \(x_0,\dots,x_n\) são distintos, então para quaisquer valores \(y_0,\dots,y_n\) existe exatamente um polinômio \(p\) de grau no máximo \(n\) com \(p(x_j)=y_j\) para todo \(j\).
Unicidade. Se \(p\) e \(q\) interpolam ambos, então \(p-q\) tem grau no máximo \(n\) e se anula nos \(n+1\) nós distintos. Um polinômio não nulo de grau no máximo \(n\) tem no máximo \(n\) raízes, logo \(p-q=0\).
Existência. Escreva \(p(x)=a_0+a_1x+\dots+a_nx^n\). As condições formam um sistema linear \(Va=y\) com a matriz de Vandermonde
A unicidade diz que \(Va=0\) só para \(a=0\), logo \(V\) é invertível e o sistema tem solução. (O próximo grupo constrói a solução explicitamente, o que é uma segunda demonstração.)
Consequências. Se os dados vêm de um polinômio de grau no máximo \(n\), o interpolador é esse mesmo polinômio: escolha “polinômio x⁵ − 2x³ + x/2” no aplicativo e aumente \(n\) de 4 para 5; o erro cai de 0,11 para cerca de \(10^{-15}\). O grau de \(p\) pode ser menor que \(n\) (todos os \(y_j\) iguais dão uma constante). Os nós têm de ser distintos; com nós repetidos é preciso prescrever derivadas (interpolação de Hermite, grupo 6).
A interpolação como operador
Fixe os nós e chame \(\mathcal I_nf\) o polinômio interpolador de \(f\). Três fatos organizam tudo o que vem depois.
\(\mathcal I_n\) é linear: \(\mathcal I_n(\alpha f+\beta g)=\alpha\,\mathcal I_nf+\beta\,\mathcal I_ng\), porque o sistema \(Va=y\) é linear em \(y\).
\(\mathcal I_n\) é uma projeção: \(\mathcal I_np=p\) para todo polinômio \(p\) de grau no máximo \(n\), logo \(\mathcal I_n^2=\mathcal I_n\).
\(\mathcal I_nf\) depende de \(f\) apenas pelos \(n+1\) números \(f(x_j)\), então nada sabe sobre \(f\) entre os nós. O tamanho de \(f-\mathcal I_nf\) ali tem de vir da suavidade (grupo 3), e a sensibilidade a erros nos \(y_j\) é a norma de \(\mathcal I_n\), a constante de Lebesgue (grupo 4).
O polinômio em si não depende de como o escrevemos. Os cinco algoritmos do próximo grupo (Lagrange, Newton, Neville, monomial, baricêntrico) produzem a mesma função, com custos e comportamentos de arredondamento muito diferentes.
1b · A ideia de Lagrange: os polinômios da base interpolam tabelas especiais
A ideia, em três frases
Fixe os nós \(x_0,\dots,x_n\) (distintos). Para \(j=0,\dots,n\) chame de \(e_j\) a tabela que vale \(1\) em \(x_j\) e \(0\) nos outros \(n\) nós: \(e_j(x_k)=\delta_{jk}\). Cada uma dessas tabelas tem um polinômio interpolador, e ele é único; chame-o de \(\ell_j\). Toda tabela \(y\) satisfaz \(y=\sum_jy_je_j\) (compare os dois lados nó por nó), e a aplicação tabela \(\mapsto\) polinômio interpolador é linear, logo
\[p=\sum_{j=0}^{n}y_j\,\ell_j .\]
O ponto que nunca é demais sublinhar é o primeiro: os polinômios de Lagrange não são só uma fórmula que por acaso funciona, são os polinômios interpoladores das tabelas mais simples possíveis, construídas sobre os mesmos nós. O problema geral foi reduzido a estes \(n+1\) problemas especiais, e os problemas especiais têm resposta explícita.
Por que as tabelas especiais têm resposta explícita
Procure um polinômio \(q\) de grau no máximo \(n\) com \(q(x_k)=0\) para \(k\ne j\) e \(q(x_j)=1\). Tendo as \(n\) raízes \(x_k\) (\(k\ne j\)) e grau no máximo \(n\), ele tem de ser \(q(x)=c\prod_{k\ne j}(x-x_k)\) para alguma constante \(c\): dividindo por esses \(n\) fatores lineares sobra um polinômio de grau no máximo \(0\). A condição \(q(x_j)=1\) dá \(c=1/\prod_{k\ne j}(x_j-x_k)\), isto é
Então a fórmula não é adivinhada, é deduzida da tabela especial. O mesmo argumento de contagem de raízes prova a unicidade em geral (dois interpoladores diferem por um polinômio de grau \(\le n\) com \(n+1\) raízes), então é o único polinômio que serve. Experimente no cartão acima: escolha a tabela especial \(e_j\) e compare as hastes (os valores \(0,\dots,1,\dots,0\)) com a curva; a nota abaixo do gráfico diz o maior valor de \(|\ell_j|\), que pode ser bem maior que \(1\) entre os nós.
Toda tabela é uma combinação: a decomposição no aplicativo
Com \(n\le6\) o cartão mostra a tabela das peças \(y_je_j\): a coluna \(j\) é nula exceto na linha \(j\), onde vale \(y_j\), e a última coluna, a soma de cada linha, é a tabela original \(y\). À direita do cartão as curvas \(y_j\ell_j\) são os polinômios interpoladores dessas colunas, e o controle soma uma a uma: as somas parciais são os polinômios interpoladores das tabelas parciais \(y_0e_0+\dots+y_me_m\), e depois da última peça a curva passa por todos os nós. No modo “seus dados”, arraste um ponto para cima e veja exatamente uma peça mudar de escala, e a soma acompanhar.
Três identidades são a mesma ideia lida com outras tabelas. A tabela de todos uns é \(e_0+\dots+e_n\) e é interpolada pela constante \(1\), logo \(\sum_j\ell_j=1\). A tabela \((x_0^k,\dots,x_n^k)\) é interpolada por \(x^k\) quando \(k\le n\), logo \(\sum_jx_j^k\ell_j(x)=x^k\). E como \(\ell_j\) tem grau \(n\) e as \(n+1\) funções \(\ell_0,\dots,\ell_n\) são independentes (olhe seus valores nos nós), elas formam uma base dos polinômios de grau no máximo \(n\), em que o vetor de coordenadas de \(p\) é simplesmente a tabela \((y_0,\dots,y_n)\).
O ponto de vista matricial: três bases, três matrizes
Escolha uma base \(b_0,\dots,b_n\) dos polinômios de grau no máximo \(n\) e escreva \(p=\sum_ka_kb_k\). As condições de interpolação viram o sistema linear \(Ba=y\) com \(B_{ik}=b_k(x_i)\): a matriz da base avaliada nos nós. As três formas clássicas são três escolhas:
Base
Matriz \(B\)
Resolver \(Ba=y\)
Lagrange \(\ell_k\)
identidade: \(\ell_k(x_i)=\delta_{ik}\)
nada a resolver, \(a=y\)
Newton \(\prod_{m<k}(x-x_m)\)
triangular inferior (a \(k\)-ésima função se anula em \(x_0,\dots,x_{k-1}\))
substituição progressiva; é a tabela de diferenças divididas
monômios \(x^k\)
matriz de Vandermonde cheia \(V\)
eliminação \(O(n^3)\), mal condicionada
Quanto mais estrutura a base tem em relação aos nós, menos trabalho sobra. A base de Lagrange é o caso extremo. Ela também diz o que é \(V^{-1}\): como \(\ell_j(x)=\sum_ka_{kj}x^k\) é o polinômio da tabela \(e_j\), a \(j\)-ésima coluna de \(V^{-1}\) guarda os coeficientes de \(\ell_j\) nos monômios, e o operador de interpolação, como aplicação de tabelas em vetores de coeficientes, é a multiplicação por \(V^{-1}\). Seu tamanho na norma do sup é a constante de Lebesgue do grupo 4: \(|p(x)|\le\Lambda_n\max_j|y_j|\), pois \(|p(x)|\le\sum_j|y_j||\ell_j(x)|\le(\max_j|y_j|)\sum_j|\ell_j(x)|\).
Um pouco de história: Waring, Euler, Lagrange, Gauss
O nome sugere que Lagrange inventou a fórmula, mas ela é mais antiga. Edward Waring a publicou em 1779, e Euler deduziu a mesma fórmula poucos anos depois (por volta de 1783). A apresentação do próprio Lagrange veio nas suas aulas na École Normale por volta de 1795. O que o nome homenageia é uma maneira de ver: com Lagrange a fórmula aparece dentro de uma teoria geral dos \(\ell_j\) como tijolos de construção, o ponto de vista deste cartão, e foi nessa forma que ela se difundiu. Uma geração depois Gauss, numa conferência de 1812 publicada só depois, mostrou que as fórmulas de Newton, Euler e Waring–Lagrange são um único polinômio escrito de maneiras diferentes, que é o teorema de unicidade do grupo 1 disfarçado. A forma do próprio Newton, mais antiga que todas essas, é o tema do próximo aplicativo desta seção.
Fontes: J. Meijering, A chronology of interpolation: from ancient astronomy to modern signal and image processing, Proc. IEEE 90 (2002) 319–342, para as datas; o ano exato das aulas de Lagrange é o dado ali, até onde pude conferir.
2 · Cinco maneiras de escrever o mesmo polinômio
A forma de Lagrange
Em vez de resolver um sistema, construa \(p\) diretamente. Para cada \(j\) seja
Cada \(\ell_j\) é um produto de \(n\) fatores lineares, logo tem grau \(n\). Num nó \(x_i\ne x_j\) o numerador contém o fator \(x_i-x_i=0\); em \(x_j\) cada fração vale 1. Portanto \(\ell_j(x_i)=\delta_{ij}\) (delta de Kronecker), e \(p(x_i)=\sum_jy_j\delta_{ij}=y_i\). Esta é a demonstração explícita de existência.
A leitura conceitual, de que \(\ell_j\) é o interpolador da tabela especial \(e_j\) e de que a linearidade monta todo o resto, é o tema do grupo 1b.
Exemplo. Nós \(-1,0,1\): \(\ell_0=\tfrac12x(x-1)\), \(\ell_1=1-x^2\), \(\ell_2=\tfrac12x(x+1)\). Para os valores \(y=(1,0,1)\) obtemos \(p=\ell_0+\ell_2=x^2\).
Duas identidades. A constante 1 interpola os valores \((1,\dots,1)\), então por unicidade \(\sum_j\ell_j(x)=1\) para todo \(x\) (a linha tracejada no cartão da base). Mais geralmente \(\sum_jx_j^k\ell_j(x)=x^k\) para \(k\le n\).
Avaliação. A forma de Lagrange é maravilhosa para a teoria, pois a base \(\ell_j\) está ligada aos nós e os coeficientes são os próprios dados. Como algoritmo é fraca: calcular \(p(x)\) custa \(O(n^2)\), e acrescentar um nó muda todas as \(\ell_j\).
A forma de Newton e as diferenças divididas
Newton escreve \(p\) na base \(1,\ (x-x_0),\ (x-x_0)(x-x_1),\dots\):
Elas preenchem uma tabela triangular (veja o cartão Formas; os coeficientes são a linha de cima, destacada). Exemplo. Nós \(0,1,2,3\), valores \(1,2,0,5\): as colunas são \(1,2,0,5\); depois \(1,-2,5\); depois \(-\tfrac32,\tfrac72\); depois \(\tfrac53\). Logo
e de fato \(p(0)=1,\ p(1)=2,\ p(2)=0,\ p(3)=5\) e \(p(1{,}5)=0{,}75\).
Por que é útil. O coeficiente \(c_k\) usa só os primeiros \(k+1\) nós, então acrescentar um nó acrescenta um termo novo e deixa os antigos em paz (Lagrange não consegue isso). A avaliação é aninhada como a regra de Horner, \(p(x)=c_0+(x-x_0)\bigl(c_1+(x-x_1)(c_2+\cdots)\bigr)\), com \(n\) multiplicações. A tabela custa cerca de \(n^2/2\) divisões. As diferenças divididas são simétricas nos argumentos, e para \(f\) suave vale \(f[x_0,\dots,x_k]=f^{(k)}(\xi)/k!\) para algum \(\xi\) (consequência da fórmula do erro do grupo 3); quando todos os nós se fundem a forma de Newton vira o polinômio de Taylor.
O algoritmo de Neville
Se você precisa de \(p\) em um único ponto \(t\), pode dispensar os coeficientes. Seja \(P_{i,\dots,i+k}(t)\) o valor em \(t\) do polinômio que interpola somente os nós \(x_i,\dots,x_{i+k}\). Partindo de \(P_i=y_i\),
Demonstração. Os dois lados são polinômios em \(t\) de grau no máximo \(k\). Em \(t=x_i\) o lado direito dá \(P_{i,\dots,i+k-1}(x_i)=y_i\); em \(t=x_{i+k}\) dá \(P_{i+1,\dots,i+k}(x_{i+k})=y_{i+k}\); num nó interno as duas parcelas valem \(y\) e os pesos \((t-x_i)-(t-x_{i+k})=x_{i+k}-x_i\) somam o denominador. Por unicidade os dois lados coincidem.
O custo é \(O(n^2)\) por ponto e só um vetor de memória. As colunas sucessivas são os interpoladores de grau crescente, exatamente o que a extrapolação de Richardson e a integração de Romberg usam: extrapolar para \(h=0\) é calcular um polinômio interpolador em 0.
A forma monomial e a matriz de Vandermonde: uma armadilha
O algoritmo mais óbvio resolve \(Va=y\) por eliminação gaussiana. Custa \(O(n^3)\) e, pior, \(V\) é mal condicionada. O número de condição \(\kappa_\infty(V)\) (nós em \([-1,1]\)) cresce geometricamente:
n
5
10
15
20
25
equiespaçados
1,9·10²
6,4·10⁴
1,8·10⁷
5,4·10⁹
1,6·10¹²
Chebyshev
1,3·10²
1,7·10⁴
1,7·10⁶
1,6·10⁸
1,4·10¹⁰
Com 16 dígitos de aritmética, um número de condição \(\kappa\) custa cerca de \(\log_{10}\kappa\) dígitos nos coeficientes. A visão “Baricêntrica × Vandermonde” do cartão Erro mostra o efeito: dois cálculos do mesmo polinômio, cuja diferença deveria ser zero, diferem por \(3{,}6\cdot10^{-14}\) (n = 10), \(2{,}9\cdot10^{-11}\) (n = 20) e \(3{,}1\cdot10^{-8}\) (n = 30) para a função de Runge em nós de Chebyshev. Para \(e^x\) em nós equiespaçados a diferença é \(8\cdot10^{-13}\) em n = 20, \(5\cdot10^{-10}\) em n = 30, \(3\cdot10^{-7}\) em n = 40 e \(10^{-4}\) em n = 50.
(O aplicativo já ajuda o caminho de Vandermonde: reescala o intervalo para \([-1,1]\) e faz pivoteamento. Num intervalo cru como \([0,100]\) é catastroficamente pior.) A moral: a base monomial é perfeita para demonstrações e para \(n\) minúsculo, e uma base ruim para calcular.
As fórmulas baricêntricas
Ponha \(\omega(x)=\prod_k(x-x_k)\) e \(w_j=1/\prod_{k\ne j}(x_j-x_k)\) (que é igual a \(1/\omega'(x_j)\)). Então \(\ell_j(x)=\omega(x)\,\dfrac{w_j}{x-x_j}\), e a forma de Lagrange vira a primeira forma baricêntrica
Interpolar a constante 1 dá \(1=\omega(x)\sum_jw_j/(x-x_j)\). Dividindo a primeira forma por essa identidade eliminamos \(\omega\) e obtemos a segunda forma baricêntrica (a verdadeira)
Em \(x=x_j\) a fórmula é \(0/0\) e simplesmente devolvemos \(y_j\). Como os pesos aparecem no numerador e no denominador, qualquer fator comum é irrelevante, e por isso existem fórmulas fechadas simples:
nós equiespaçados: \(w_j=(-1)^j\binom nj\);
pontos de Chebyshev (zeros de \(T_{n+1}\)): \(w_j=(-1)^j\sin\frac{(2j+1)\pi}{2n+2}\);
pontos de Chebyshev–Lobatto (extremos de \(T_n\), com as pontas): \(w_j=(-1)^j\), pela metade em \(j=0\) e \(j=n\).
Para outros nós os pesos custam \(O(n^2)\) uma única vez. O aplicativo usa as fórmulas fechadas e as confere com a fórmula geral (concordância até \(5\cdot10^{-15}\)).
Propriedades. Avaliar custa \(O(n)\) por ponto; acrescentar um nó custa \(O(n)\); as fórmulas servem para quaisquer nós. Higham (2004) provou que a segunda forma é estável (progressivamente) quando a constante de Lebesgue dos nós é pequena, como nos nós de Chebyshev, o que a torna o método de escolha (é o que o Chebfun usa). Com nós equiespaçados e \(n\) grande o próprio problema de interpolação é mal condicionado (grupo 4), e nenhum algoritmo conserta isso.
Qual forma para qual tarefa?
Forma
Construir
Avaliar
Acrescentar nó
Serve para
Lagrange
nada
\(O(n^2)\)
recomeçar
teoria, demonstrações, pesos de quadratura
Newton
\(O(n^2)\)
\(O(n)\)
\(O(n)\)
nós chegando um a um, análise do erro, métodos de passo múltiplo
Neville
nada
\(O(n^2)\)
não se aplica
um valor em um ponto, extrapolação
Monomial
\(O(n^3)\)
\(O(n)\)
\(O(n^3)\)
só \(n\) minúsculo: mal condicionada
Baricêntrica
\(O(n)\) fórmula fechada, senão \(O(n^2)\)
\(O(n)\)
\(O(n)\)
avaliar interpoladores na prática
O cartão Formas calcula o mesmo \(p(x)\) com cinco algoritmos. Para \(n\) pequeno os cinco valores concordam em 15 ou 16 dígitos; aumente \(n\) com nós equiespaçados e o valor de Vandermonde é o primeiro a errar.
3 · Quanto erra? A fórmula do erro e os nós de Chebyshev
A fórmula do erro, com demonstração
Teorema. Seja \(f\in C^{n+1}[a,b]\), sejam \(x_0,\dots,x_n\in[a,b]\) distintos e seja \(p\) o polinômio interpolador. Para todo \(x\in[a,b]\) existe um ponto \(\xi\) no menor intervalo que contém \(x,x_0,\dots,x_n\) tal que
Demonstração. Se \(x\) é um nó os dois lados são zero. Senão fixe \(x\), e defina \(c=\dfrac{f(x)-p(x)}{\omega(x)}\) e \(g(t)=f(t)-p(t)-c\,\omega(t)\). Então \(g\) se anula nos \(n+1\) nós (ali \(f-p=0\) e \(\omega=0\)) e em \(t=x\) pela escolha de \(c\): são \(n+2\) zeros distintos. Pelo teorema de Rolle \(g'\) tem pelo menos \(n+1\) zeros, \(g''\) pelo menos \(n\), e assim por diante até que \(g^{(n+1)}\) tem pelo menos um zero \(\xi\). Mas \(p^{(n+1)}=0\) e \(\omega^{(n+1)}=(n+1)!\), então
Corolários. \(\|f-p\|_\infty\le\dfrac{\|f^{(n+1)}\|_\infty}{(n+1)!}\,\|\omega\|_\infty\). Se \(f\) é um polinômio de grau no máximo \(n\), o erro é zero. Na interpolação linear (\(n=1\), espaçamento \(h\)) o máximo de \(|\omega|\) é \(h^2/4\), logo o erro é no máximo \(h^2\|f''\|/8\). Há também uma versão que não precisa de derivadas: \(f(x)-p(x)=\omega(x)\,f[x_0,\dots,x_n,x]\), que é a forma de Newton com mais um nó.
Lendo a fórmula: um fator da função e um fator dos nós
O erro é um produto de duas coisas com donos diferentes. O fator \(f^{(n+1)}(\xi)/(n+1)!\) pertence à função; não podemos mudá-lo. O fator \(\omega(x)\) pertence aos nós; nós o escolhemos. Use a visão “Polinômio dos nós” do cartão Erro.
Em \([-1,1]\) o maior \(|\omega|\) é
n
5
10
20
equiespaçados
6,9·10⁻²
8,5·10⁻³
2,3·10⁻⁴
Chebyshev
3,1·10⁻²
9,8·10⁻⁴
9,5·10⁻⁷
Em \(n=20\) o \(\omega\) de Chebyshev é cerca de 245 vezes menor. Para nós equiespaçados \(\omega\) é minúsculo no meio e grande perto das duas pontas, então o erro se acumula ali; para nós de Chebyshev os \(n+2\) lóbulos de \(|\omega|\) têm todos a mesma altura.
O fator da derivada também pode ser perigoso. Para \(1/(1+25x^2)\) os coeficientes de Taylor em 0 são \(\pm25^k\), então \(f^{(n+1)}(0)/(n+1)!\) tem tamanho em torno de \(5^{n+1}\). O fator \(\omega\) dos nós equiespaçados encolhe só cerca de 0,7 por passo (8,5·10⁻³ em \(n=10\), 2,3·10⁻⁴ em \(n=20\)), então a cota cresce com \(n\), e o erro real também (grupo 3, Runge).
Um exemplo: eˣ e quantos nós são necessários
Tome \(f=e^x\) em \([-1,1]\), onde \(\|f^{(n+1)}\|_\infty=e\). Com nós de Chebyshev \(\|\omega\|=2^{-n}\), então
\[\|f-p\|_\infty\le\frac{e}{(n+1)!\,2^{n}}.\]
n
4
8
12
cota
1,4·10⁻³
2,9·10⁻⁸
1,1·10⁻¹³
medido, Chebyshev
6,4·10⁻⁴
1,2·10⁻⁸
4,4·10⁻¹⁴
medido, equiespaçados
1,1·10⁻³
5,8·10⁻⁸
7,0·10⁻¹³
A cota vale e é justa dentro de um fator de cerca de 2,4 para os nós de Chebyshev. Use-a para escolher \(n\): para garantir erro abaixo de \(10^{-6}\) precisamos de \(e/((n+1)!2^n)\lt 10^{-6}\), o que falha para \(n=6\) (\(8{,}4\cdot10^{-6}\)) e vale para \(n=7\) (\(5{,}3\cdot10^{-7}\)). Como \(e^x\) é inteira, o erro cai mais depressa que qualquer taxa geométrica até chegar ao nível do arredondamento, cerca de \(10^{-15}\) a partir de \(n=15\).
O fenômeno de Runge
Escolha “Runge” com nós equiespaçados. Em \(n=5\) o polinômio é uma aproximação pobre mas sensata; em \(n=10\) ele balança bem acima da função perto das pontas; em \(n=20\) sai do gráfico. Os erros máximos em \([-1,1]\) para \(1/(1+25x^2)\):
n
5
10
20
30
40
equiespaçados
0,43
1,92
59,8
2,4·10³
1,05·10⁵
Em \(x=0{,}95\) e \(n=10\) o polinômio vale 1,92 enquanto \(f(0{,}95)=0{,}042\). Mais pontos o deixaram pior. Runge descobriu isso em 1901: os interpoladores convergem para \(f\) só para \(|x|\lt 0{,}726\) e divergem para \(|x|>0{,}726\) (aproximadamente).
A razão está no plano complexo: \(1/(1+25z^2)\) tem polos em \(\pm i/5\), perto do intervalo. A interpolação equiespaçada só converge para funções analíticas numa região em forma de lente em volta de \([-1,1]\) que corta o eixo imaginário em cerca de \(\pm0{,}53\,i\); os polos em \(\pm0{,}2\,i\) estão dentro dela. A mesma história vale para “1/(1 + x²) em [−5, 5]”: é a mesma função após reescalar, e os números são idênticos, o que mostra que só importa a posição relativa da singularidade. Nós de Chebyshev curam isso (próxima lição e grupo 5).
Nós de Chebyshev: o melhor ω possível
Como \(\omega\) é a parte que controlamos, escolha os nós para tornar \(\|\omega\|_\infty\) o menor possível. Teorema (Chebyshev). Entre todos os polinômios mônicos de grau \(n+1\), a menor norma do máximo em \([-1,1]\) é a de \(T_{n+1}(x)/2^n\), onde \(T_{n+1}(x)=\cos((n+1)\arccos x)\); sua norma é \(2^{-n}\). Logo os melhores nós são os zeros de \(T_{n+1}\),
Demonstração. \(T_{n+1}\) tem coeficiente líder \(2^n\), então \(\omega^\ast=T_{n+1}/2^n\) é mônico, e alterna entre \(+2^{-n}\) e \(-2^{-n}\) nos \(n+2\) pontos \(\cos(k\pi/(n+1))\). Se um mônico \(q\) tivesse \(\|q\|_\infty\lt 2^{-n}\), então \(r=\omega^\ast-q\) teria grau no máximo \(n\) e, nesses \(n+2\) pontos, os sinais de \(\omega^\ast\): \(n+1\) mudanças de sinal, logo \(n+1\) zeros, logo \(r=0\), contradizendo \(\|q\|\lt 2^{-n}\). \(\blacksquare\)
Em \([a,b]\) os nós são levados por uma transformação afim e a cota da lição anterior vira
Os pontos de Chebyshev–Lobatto (extremos de \(T_n\), com as pontas) dão um \(\omega\) de tamanho quase igual e são muitas vezes mais convenientes. Medidos na função de Runge, os erros máximos para nós de Chebyshev em \(n=10,20,40\) são \(0{,}109,\ 0{,}0153,\ 2{,}9\cdot10^{-4}\); para Lobatto \(0{,}132,\ 0{,}0177,\ 3{,}4\cdot10^{-4}\). Uma curiosidade: o erro de Chebyshev em \(n=15\) (0,083) é maior que em \(n=12\) (0,069). Para \(n\) ímpar há um número par de nós e nenhum está em \(x=0\), justamente onde fica o pico da função.
4 · Estabilidade: a constante de Lebesgue
Função e constante de Lebesgue
Agora perturbe os dados. Se cada \(y_j\) muda no máximo \(\delta\), o interpolador muda \(\sum_j\delta_j\ell_j(x)\), cujo tamanho é no máximo \(\delta\lambda_n(x)\), onde
A cota é atingida tomando \(\delta_j=\delta\,\mathrm{sinal}\,\ell_j(x)\). Então \(\Lambda_n\), a constante de Lebesgue, é exatamente a amplificação de erros dos dados no pior caso: o número de condição da interpolação. Depende só dos nós. Veja a função de Lebesgue no cartão da base. Medidas em \([-1,1]\):
n
5
10
20
40
equiespaçados
3,1
29,9
1,1·10⁴
4,7·10⁹
Chebyshev
1,69
2,07
2,48
2,90
Lobatto
1,99
2,42
2,87
3,31
No aplicativo, tome \(\sin(2\pi x)\), \(n=20\), e some ruído \(10^{-3}\) aos valores: com nós equiespaçados o erro máximo vira cerca de 1,8, com nós de Chebyshev cerca de \(1{,}2\cdot10^{-3}\), o tamanho do próprio ruído.
Aproximação quase ótima
Seja \(E_n(f)=\min_{q\in\mathcal P_n}\|f-q\|_\infty\) o erro do melhor polinômio de grau no máximo \(n\) (existe e é único, pelo teorema da equioscilação de Chebyshev). A interpolação nunca é muito pior:
Demonstração. Seja \(q\) um polinômio qualquer de grau no máximo \(n\). Como \(\mathcal I_nq=q\) e \(\mathcal I_n\) é linear, \(f-\mathcal I_nf=(f-q)-\mathcal I_n(f-q)\), logo \(\|f-\mathcal I_nf\|\le(1+\|\mathcal I_n\|)\|f-q\|\). Tome \(q\) o melhor polinômio. \(\blacksquare\)
Assim duas coisas controlam a interpolação: quão bem polinômios aproximam \(f\) (\(E_n(f)\), questão de suavidade, próximo grupo) e quão bons são os nós (\(\Lambda_n\)). Com nós de Chebyshev \(1+\Lambda_n\) é 3,9 em \(n=40\) e cerca de 5,4 mesmo em \(n=400\): você perde no máximo um fator pequeno em relação ao melhor polinômio, e o obtém com uma fórmula \(O(n)\) e sem iteração. Com nós equiespaçados o fator \(1+\Lambda_n\) é astronômico e a garantia não vale nada.
Com que velocidade cresce Λₙ? Por que nós equiespaçados falham
As assintóticas, todas visíveis no gráfico “Constante de Lebesgue contra n”:
nós equiespaçados: \(\Lambda_n\approx\dfrac{2^{n+1}}{e\,n\ln n}\) (cerca de \(1{,}1\cdot10^{4}\) medido em \(n=20\), \(4{,}7\cdot10^{9}\) em \(n=40\)): crescimento exponencial, praticamente dobrando a cada passo;
nós de Chebyshev–Lobatto: \(\Lambda_n\approx\dfrac2\pi\ln n+0{,}9625\), conferido numericamente com quatro dígitos em \(n=100\) (3,894) e \(n=400\) (4,777); os zeros de Chebyshev são o mesmo a menos de uma constante: crescimento logarítmico.
Existe um conjunto perfeito de nós com \(\Lambda_n\) limitado? Não. Erdős (1961) provou que para toda escolha de nós \(\Lambda_n\ge\frac2\pi\ln(n+1)-C\) para uma constante \(C\). Logo os nós de Chebyshev são ótimos a menos de uma constante aditiva limitada, o melhor que se pode esperar.
Olhe a função de Lebesgue \(\lambda_n(x)\) para nós equiespaçados em \(n=20\): é de ordem 1 a 10 no meio do intervalo e dispara para cerca de \(10^4\) no primeiro e no último subintervalo. Nós afastados demais perto das pontas é o que faz um polinômio por eles balançar loucamente ali; os nós de Chebyshev se aglomeram perto das pontas com densidade \(1/(\pi\sqrt{1-x^2})\) para impedir exatamente isso.
Erros de arredondamento também são erros nos dados
Mesmo que \(f\) seja calculada perfeitamente, cada \(y_j\) é armazenado com erro relativo de até cerca de \(\varepsilon\approx1{,}1\cdot10^{-16}\). Isso é uma perturbação dos dados, e a interpolação pode multiplicá-la por \(\Lambda_n\). Duas medições:
\(f=e^x\), equiespaçados, \(n=40\): \(\Lambda_n=4{,}7\cdot10^9\), dano esperado \(\sim5\cdot10^{-7}\), erro medido \(3{,}3\cdot10^{-7}\), embora o erro teórico de interpolação seja muito abaixo de \(10^{-30}\) (a função é inteira).
O polinômio \(x^5-2x^3+x/2\) é reproduzido exatamente para todo \(n\ge5\) em aritmética exata. Em ponto flutuante, nós equiespaçados dão erros \(1{,}1\cdot10^{-15}\) (n = 10), \(5{,}5\cdot10^{-13}\) (n = 20), \(2{,}4\cdot10^{-10}\) (n = 30) e \(1{,}6\cdot10^{-7}\) (n = 40), enquanto nós de Chebyshev ficam abaixo de \(10^{-15}\) o tempo todo.
Isso é uma propriedade do problema, não da fórmula: atinge baricêntrica, Newton e Lagrange por igual. Para \(n\) grande, a interpolação equiespaçada está portanto duplamente errada: imprecisa para funções como a de Runge e ruidosa até para polinômios.
5 · Teoria da convergência
O interpolador converge? Faber e Bernstein
O palpite tentador é que \(\mathcal I_nf\to f\) uniformemente para toda \(f\) contínua se os nós são decentes. É falso. Teorema de Faber (1914): para toda matriz triangular de nós existe uma função contínua \(f\) para a qual \(\|f-\mathcal I_nf\|_\infty\) não tende a 0. A razão é o princípio da limitação uniforme: \(\Lambda_n=\|\mathcal I_n\|\to\infty\) para toda matriz (a cota de Erdős do grupo 4), então alguma \(f\) é atingida pelo crescimento.
Para nós equiespaçados é pior que “alguma função”: Bernstein (1918) mostrou que para \(f(x)=|x|\) os interpoladores divergem em todo ponto de \([-1,1]\) exceto \(-1,0,1\). Tente “|x|” com nós equiespaçados: os erros máximos são 0,66, 95 e \(1{,}5\cdot10^7\) para \(n=10,20,40\). Com nós de Chebyshev são 0,055, 0,029 e 0,015: convergência, devagar.
O lado positivo: com nós de Chebyshev \(\Lambda_n=O(\ln n)\), então \(\|f-\mathcal I_nf\|\le(1+\Lambda_n)E_n(f)\) tende a 0 sempre que \(E_n(f)\ln n\to0\), em particular para toda função lipschitziana, e toda mais suave. (Marcinkiewicz mostrou que para cada \(f\) contínua alguma matriz de nós dá convergência, mas a matriz depende de \(f\), o que não serve na prática.)
Com que velocidade? A suavidade decide (Jackson e Bernstein)
Pela propriedade de quase-melhor, a velocidade é a da melhor aproximação \(E_n(f)\), a menos de um fator \(1+\Lambda_n\). E \(E_n(f)\) é governada pela suavidade:
(Jackson) se \(f\in C^k[-1,1]\) então \(E_n(f)\le C_k\,\|f^{(k)}\|_\infty/n^k\): lei de potência, tanto mais rápida quanto mais suave;
se \(f\) é analítica numa vizinhança de \([-1,1]\), então \(E_n(f)\) decai geometricamente, \(O(\rho^{-n})\) (próxima lição);
uma quina custa uma potência: para \(f=|x|\), \(nE_n(f)\to0{,}2802\) (constante de Bernstein). A interpolação de Chebyshev dá \(0{,}0546,\ 0{,}0285,\ 0{,}0146\) em \(n=10,20,40\), cerca do dobro de \(0{,}28/n\), como o fator \(1+\Lambda_n\approx3\) permite.
A conclusão é prática. A precisão que se alcança com um polinômio de grau \(n\) é uma propriedade da função, e a interpolação de Chebyshev chega a um fator pequeno dela. Nada mais esperto bate \(E_n\); só pode evitar o fator \(1+\Lambda_n\).
Funções analíticas: a elipse de Bernstein
Seja \(E_\rho\) a elipse com focos \(\pm1\) e semieixos \((\rho+\rho^{-1})/2\) e \((\rho-\rho^{-1})/2\). Teorema (Bernstein; veja Trefethen). Se \(f\) é analítica dentro de \(E_\rho\) com \(|f|\le M\) ali, então o interpolador em \(n+1\) pontos de Chebyshev satisfaz
Convergência geométrica, com taxa fixada pela singularidade mais próxima. Teste com a função de Runge. Seus polos em \(\pm i/5\) estão em \(E_\rho\) quando \((\rho-\rho^{-1})/2=1/5\), isto é \(\rho=\frac{1}{5}+\sqrt{1+\frac1{25}}=1{,}2198\). A previsão: o erro encolhe por \(\rho^{-10}=0{,}137\) a cada 10 passos de \(n\) e por \(\rho^{-20}=0{,}0188\) a cada 20. Medido com nós de Chebyshev: de \(n=10\) a 20 o fator é 0,140, de \(n=20\) a 40 é 0,0189. A teoria prevê a inclinação.
A taxa aparece como uma reta no gráfico logarítmico de convergência. Para \(\sin(2\pi x)\) e \(e^x\), funções inteiras sem singularidade alguma, a curva se curva para baixo mais depressa que qualquer reta (convergência superexponencial) até encontrar o piso do arredondamento perto de \(10^{-15}\). A mesma teoria explica a falha dos equiespaçados: esses nós se comportam como se as singularidades perto do eixo imaginário (os polos da função de Runge) estivessem muito mais perto do que estão.
Um catálogo: suavidade contra taxa
Erro máximo com nós de Chebyshev, medido no aplicativo (escolha a função e ajuste n):
função
suavidade
n = 10
n = 20
n = 40
sinal(x)
salto
da ordem de 1: nenhum \(p\) contínuo chega mais perto que metade do salto
|x|
quina, lipschitziana
5,5·10⁻²
2,9·10⁻²
1,5·10⁻²
√(x+1)
singular na ponta
6,4·10⁻²
3,4·10⁻²
1,7·10⁻²
bump suave
\(C^\infty\), não analítica
4,9·10⁻³
1,6·10⁻⁴
4,1·10⁻⁶
Runge
analítica, polos em \(\pm0{,}2i\)
1,1·10⁻¹
1,5·10⁻²
2,9·10⁻⁴
sen(2πx)
inteira
7,2·10⁻³
7,1·10⁻¹⁰
1,3·10⁻¹⁵
Lendo as linhas: para o salto, nada ajuda; para a quina e a singularidade na ponta o erro cai pela metade quando \(n\) dobra (\(O(1/n)\)); para o bump cai mais depressa que qualquer potência de \(1/n\) mas mais devagar que qualquer taxa geométrica; para Runge cai geometricamente à taxa \(1{,}22^{-n}\); para funções inteiras cai superexponencialmente até o arredondamento. O gráfico “Erro máximo contra n” mostra exatamente essas formas.
Por que os pontos de Chebyshev funcionam: o círculo
Ponha \(x=\cos\theta\). Os pontos de Chebyshev são \(x_j=\cos\theta_j\) com ângulos igualmente espaçados \(\theta_j=(2j+1)\pi/(2n+2)\): são as sombras, no diâmetro, de pontos igualmente espaçados no círculo unitário. Um polinômio de grau \(n\) em \(x\) é o mesmo que um polinômio trigonométrico par \(\sum_{k\le n}a_k\cos k\theta\), pois \(T_k(\cos\theta)=\cos k\theta\).
Então interpolar em pontos de Chebyshev é interpolar um polinômio trigonométrico em ângulos equiespaçados, e isso é a transformada discreta de Fourier: ortogonal, perfeitamente condicionada, e a fonte do crescimento \(\frac2\pi\ln n\) de \(\Lambda_n\). Pontos equiespaçados em \(x\) não são equiespaçados em \(\theta\), e essa é toda a diferença entre Chebyshev e Runge.
Bônus prático: os coeficientes de Chebyshev \(a_k\) do interpolador podem ser calculados em \(O(n\log n)\) pela transformada rápida de Fourier, que é a base dos métodos espectrais e do sistema Chebfun.
6 · Extensões e aplicações
Integração e derivação a partir da interpolação
Troque \(f\) por \(p\) e integre: \(\displaystyle\int_a^bf\approx\int_a^bp=\sum_jW_jy_j\) com \(W_j=\int_a^b\ell_j\). É assim que nasce toda regra de quadratura interpolatória. Para nós equiespaçados em \([0,n]\) (espaçamento 1):
Para \(n=8\) os pesos são \(0{,}279,\ 1{,}662,\ -0{,}262,\ 2{,}962,\ -1{,}281,\ 2{,}962,\ -0{,}262,\ 1{,}662,\ 0{,}279\): alguns são negativos, então \(\sum|W_j|>b-a\) e erros de arredondamento nos \(y_j\) são amplificados, a mesma doença da constante de Lebesgue. Por isso as regras de Newton–Cotes de ordem alta são abandonadas. Remédios: regras compostas (grau baixo em muitos painéis pequenos), Clenshaw–Curtis (integrar o interpolador de Chebyshev) e a quadratura de Gauss, em que os nós são escolhidos para tornar a regra exata até o grau \(2n+1\).
Derivar a fórmula do erro dá regras para \(f'\): de \(n=2\) sai a diferença central \((f(x+h)-f(x-h))/(2h)\) com erro \(-h^2f'''(\xi)/6\). Derivar é intrinsecamente mal posto: a norma da matriz de derivação de Chebyshev cresce como \(n^2\), então o ruído é amplificado muito mais que na interpolação. Os métodos de passo múltiplo de Adams–Bashforth para EDOs integram o interpolador de \(f\) pelos últimos passos.
Interpolação de Hermite e o teorema de Taylor
Prescreva valores e primeiras derivadas em \(n+1\) nós: \(2n+2\) condições, e exatamente um polinômio \(H\) de grau no máximo \(2n+1\) as satisfaz. A demonstração da fórmula do erro vale palavra por palavra (cada nó é zero duplo de \(f-H\)) e dá
A interpolação de Hermite se calcula com a tabela de Newton repetindo nós e pondo \(f[x_j,x_j]=f'(x_j)\) nas posições onde haveria divisão por zero. Para \(n=1\) é o interpolador cúbico de Hermite, o tijolo dos splines em computação gráfica e da interpolação monótona “PCHIP”.
O caso extremo é um único nó repetido \(n+1\) vezes: a forma de Newton vira o polinômio de Taylor \(\sum_kf^{(k)}(x_0)(x-x_0)^k/k!\), e a fórmula do erro vira o resto de Lagrange \(f^{(n+1)}(\xi)(x-x_0)^{n+1}/(n+1)!\). Então o teorema de Taylor é o caso especial desta lição em que todos os nós colidem, e a interpolação é sua generalização natural a nós separados, que é por que se comporta muito melhor num intervalo inteiro.
Quando o grau é o problema: polinômios por partes e splines
Um único polinômio de grau alto é um objeto global: um solavanco numa ponta pode sacudir a curva toda. A alternativa é grau baixo em muitos pedaços pequenos.
A interpolação linear por partes é contínua com erro no máximo \(h^2\|f''\|_\infty/8\), pela fórmula do erro com \(n=1\). Estável (\(\Lambda=1\)), mas de suavidade só de primeira ordem.
Os splines cúbicos são cúbicas por partes com duas derivadas contínuas. Para \(f\) suave o erro é \(O(h^4)\), e a constante de Lebesgue fica limitada quando a malha é refinada, ao contrário da interpolação polinomial global.
Uma regra prática: se \(f\) é analítica (ou muito suave) no intervalo todo e você pode escolher os nós, a interpolação global em pontos de Chebyshev converge geometricamente e vence. Se os dados vêm em pontos arbitrários, ou \(f\) tem quinas e saltos, ou você só precisa de poucos dígitos, pedaços de grau baixo são a escolha segura. No modo de dados livres, ponha doze pontos num zigue-zague suave: o polinômio global oscila entre eles e além deles, o que um spline não faria.
Dados com ruído: interpolar ou ajustar?
Se os \(y_j\) são medições com erros de tamanho \(\sigma\), a interpolação reproduz fielmente os erros, e pode amplificá-los até \(\Lambda_n\sigma\) entre os pontos. Com dados equiespaçados e \(n\) em torno de 20 isso é uma catástrofe (use o controle de ruído com “equiespaçados”, depois troque a família de nós para ver o contraste).
O que se faz na prática é ajuste por mínimos quadrados: escolher um polinômio de grau baixo \(m\ll n\) minimizando \(\sum_j(p(x_j)-y_j)^2\), ou um spline suavizante. O ajuste não passa pelos pontos, e isso é uma qualidade: ele faz a média do ruído em vez de persegui-lo. A interpolação é a ferramenta certa quando os dados são exatos (valores de uma função conhecida, ou nós que você escolhe) e a pergunta certa é “o que há entre os nós?”.
7 · Experimentos guiados e exercícios
Experimento 1: o fenômeno de Runge
Escolha “Runge: 1/(1 + 25x²)”, nós equiespaçados, e aperte Aumentar n. O erro máximo primeiro fica perto de 0,4 (0,44 em \(n=4\), 0,43 em \(n=5\)) e depois explode: 0,43 em \(n=5\), 1,92 em \(n=10\), 59,8 em \(n=20\), \(2{,}4\cdot10^3\) em \(n=30\), \(1{,}05\cdot10^5\) em \(n=40\).
Marque “Ajustar a janela a p” para ver o polinômio inteiro, e abra a visão da função de Lebesgue no cartão da base.
Troque para Chebyshev: \(0{,}109\), \(0{,}0153\), \(2{,}9\cdot10^{-4}\) em \(n=10,20,40\). No cartão de convergência a curva de Chebyshev é uma reta de inclinação \(\log_{10}1{,}22^{-1}\) por unidade de \(n\).
Escolha “1/(1 + x²) em [−5, 5]” e compare: mesma função após reescalar, números idênticos.
Pergunta: por que o erro de Chebyshev em \(n=15\) supera o de \(n=12\)? (Lição sobre os nós de Chebyshev.)
Experimento 2: suavidade contra taxa
Com nós de Chebyshev, percorra “|x|”, “√(x + 1)”, “bump suave”, “Runge” e “sen(2πx)” em \(n=10,20,40\) e compare com a tabela da lição do catálogo. No cartão de convergência observe as formas: uma curva quase achatada para a quina (\(O(1/n)\) só é reta num gráfico log–log, aqui parece uma curva suave), uma reta para Runge, uma curva despencando para o seno. Depois troque para nós equiespaçados com \(|x|\): a curva sobe depois de \(n\approx5\), que é a divergência de Bernstein.
Pergunta: a tabela sugere que dobrar \(n\) divide o erro por dois para \(|x|\). Que parte do teorema de Jackson é essa?
Experimento 3: unicidade e a fórmula do erro, exatamente
Escolha “polinômio x⁵ − 2x³ + x/2”. Para \(n\ge5\) o erro é só arredondamento (cerca de \(10^{-15}\)): unicidade. Para \(n=4\) não é zero, e pode ser previsto exatamente. A função é mônica de grau 5, então \(f^{(5)}/5!=1\) e a fórmula do erro diz \(f-p=\omega(x)\) sem \(\xi\) sobrando. Portanto o erro máximo é \(\|\omega\|_\infty\): para nós equiespaçados 0,113, e para nós de Chebyshev exatamente \(2^{-4}=0{,}0625\), que é o que o aplicativo mostra. Confira ambos na visão “Polinômio dos nós” do cartão Erro.
Experimento 4: ruído e a constante de Lebesgue
Escolha \(\sin(2\pi x)\), \(n=20\), ruído \(10^{-3}\). Nós equiespaçados: erro máximo cerca de 1,8, mil vezes o ruído, perto da folga \(\Lambda_{20}\approx1{,}1\cdot10^4\). Nós de Chebyshev: cerca de \(1{,}2\cdot10^{-3}\), o tamanho do ruído. Olhe o polinômio com “Ajustar a janela a p”: com nós equiespaçados o dano está no primeiro e no último subintervalo, exatamente onde a função de Lebesgue é grande. Tente ruído \(10^{-6}\) e \(10^{-2}\) e verifique que o dano escala linearmente com o ruído.
Experimento 5: seus próprios pontos
Escolha “Seus dados”. Arraste um ponto e veja o polinômio inteiro se mover: é um objeto global. Ponha pontos à direita do último: o polinômio lá longe à esquerda também muda. Ponha dois pontos bem juntos com alturas diferentes: o polinômio precisa de uma inclinação enorme entre eles e \(\Lambda_n\) dispara. Aperte Pôr um ponto aleatório várias vezes e veja o número de condição de Vandermonde nas métricas. No cartão Formas (para \(n\le8\)) acompanhe a tabela de diferenças divididas enquanto arrasta: a linha de cima, os coeficientes de Newton, só muda do ponto arrastado em diante para a direita.
Experimento 7: a ideia de Lagrange, à mão e na tela
Escolha “Seus dados” e ponha quatro pontos. No cartão A ideia de Lagrange escolha \(e_0\) e olhe o gráfico da esquerda: o polinômio vale \(1\) no primeiro ponto e \(0\) nos outros três. Faça o mesmo com \(e_1,e_2,e_3\).
Arraste o controle da direita de \(0\) até a última peça. Qual peça é a maior? Arraste o ponto correspondente para cima e veja aquela peça, e só ela, crescer.
Escolha “Sua função f(x)”, digite sin(3x) em \([-1,1]\) com \(n=3\) nós equiespaçados, e compare a soma das quatro peças com \(f\).
No script Python abaixo, troque NODES por "cheb" e compare as figuras lagrange_pieces.png das duas famílias: as peças \(y_j\ell_j\) são bem menores com nós de Chebyshev, que é a constante de Lebesgue em ação.
Exercícios, com respostas
Ache o polinômio por \((-1,1),(0,0),(1,1)\) pela fórmula de Lagrange e por unicidade. Resposta: \(\ell_0+\ell_2=x^2\); e \(x^2\) tem grau 2 e serve, logo por unicidade é ele.
Mostre que \(\sum_j\ell_j(x)\equiv1\) e \(\sum_jx_j^k\ell_j(x)=x^k\) para \(k\le n\). Resposta: \(1\) e \(x^k\) são polinômios de grau no máximo \(n\), então cada um é o próprio interpolador, cuja forma de Lagrange é a soma dada.
Mostre que \(w_j=1/\omega'(x_j)\). Resposta: escreva \(\omega=(x-x_j)\prod_{k\ne j}(x-x_k)\); então \(\omega'(x_j)=\prod_{k\ne j}(x_j-x_k)\).
Limite o erro da interpolação linear de \(\ln x\) nos nós 1 e 2, em \(x=1{,}5\). Resposta: \(|f''|=1/x^2\le1\), \(|\omega(1{,}5)|=0{,}25\), então o erro é no máximo \(\tfrac12\cdot0{,}25=0{,}125\). O erro real é \(\ln1{,}5-\tfrac12\ln2=0{,}0589\).
Quantos nós de Chebyshev garantem erro abaixo de \(10^{-6}\) para \(e^x\) em \([-1,1]\)? Resposta: \(e/((n+1)!2^n)\lt 10^{-6}\) vale pela primeira vez em \(n=7\), isto é 8 nós.
Deduza a regra de Simpson de \(\int\ell_j\). Resposta: nos nós \(0,1,2\): \(\ell_0=\tfrac12(x-1)(x-2)\), \(\ell_1=x(2-x)\), \(\ell_2=\tfrac12x(x-1)\), com integrais em \([0,2]\) iguais a \(\tfrac13,\tfrac43,\tfrac13\). Logo \(\int_0^2f\approx\tfrac13(f_0+4f_1+f_2)\).
Prove que o coeficiente de Newton \(c_k\) depende só de \(x_0,\dots,x_k\) e \(y_0,\dots,y_k\). Resposta: \(c_k\) é o coeficiente líder do polinômio de grau no máximo \(k\) que interpola os primeiros \(k+1\) dados, pois os termos de Newton \(c_j\prod_{i\lt j}(x-x_i)\) com \(j\lt k\) têm grau abaixo de \(k\).
Experimente você mesmo em Python
Um script autônomo que faz com a sua fórmula ou tabela o que o aplicativo faz: constrói os polinômios de Lagrange, verifica a identidade e a propriedade de interpolação, compara com a fórmula baricêntrica, calcula a constante de Lebesgue e o número de condição de Vandermonde e grava duas figuras. Precisa de numpy e matplotlib (pip install numpy matplotlib). Mude as configurações no começo (SOURCE, a fórmula f, o intervalo, N, NODES, DATA) e rode de novo.
# Lagrange interpolation: the polynomial through points, built from special tables.
#
# Lagrange's insight: for the SAME nodes x_0..x_n, the polynomial l_j of degree <= n through the special
# table (x_k, delta_jk) -- value 1 at x_j and 0 at every other node -- is l_j(x) = prod_{k != j} (x - x_k)/(x_j - x_k).
# Any table y is the sum of y_j times these special tables, and interpolation is linear, so
# p(x) = y_0 l_0(x) + y_1 l_1(x) + ... + y_n l_n(x).
#
# Needs: pip install numpy matplotlib Run: python lagrange_interp.py
# Edit the settings just below and run again.
import numpy as np
import matplotlib.pyplot as plt
# ------------------------------------------------------------------ settings: play with these
SOURCE = "function" # "function": y_k = f(x_k) or "data": your own points below
def f(x): # any numpy expression of x, for example np.exp(x), np.abs(x), np.sin(2*np.pi*x)
return 1 / (1 + 25 * x**2) # Runge's function
A, B = -1.0, 1.0 # the interval
N = 8 # degree n: there are n + 1 nodes
NODES = "chebyshev" # "equispaced", "chebyshev" (zeros of T_{n+1}) or "lobatto" (extrema of T_n)
DATA = [(0, 1), (2, 3), (4, 2.5), (6, 4.5), (8, 3), (10, 6)] # (x, y) pairs, used when SOURCE == "data"
SAVE = True # also write the pictures as lagrange_*.png
# ------------------------------------------------------------------
def make_nodes(kind, n, a, b):
m, h, i = (a + b) / 2, (b - a) / 2, np.arange(n + 1)
if kind == "chebyshev":
return m - h * np.cos((2 * i + 1) * np.pi / (2 * n + 2))
if kind == "lobatto" and n > 0:
return m - h * np.cos(i * np.pi / n)
return np.linspace(a, b, n + 1)
def lagrange_basis(xs, j, t):
"""l_j(t) straight from the definition: the product of the n factors (t - x_k)/(x_j - x_k), k != j."""
out = np.ones_like(t, dtype=float)
for k, xk in enumerate(xs):
if k != j:
out *= (t - xk) / (xs[j] - xk)
return out
def interpolate(xs, ys, t):
"""p(t) = sum_j y_j l_j(t): the data table written as a sum of special tables."""
return sum(yj * lagrange_basis(xs, j, t) for j, yj in enumerate(ys))
def barycentric(xs, ys, t):
"""Same polynomial, second barycentric formula: O(n) per point and numerically stable."""
w = np.array([1 / np.prod(xj - np.delete(xs, j)) for j, xj in enumerate(xs)])
out = np.empty_like(t, dtype=float)
for i, ti in enumerate(t):
d = ti - xs
if np.any(d == 0):
out[i] = ys[np.argmin(np.abs(d))]
else:
q = w / d
out[i] = np.dot(q, ys) / q.sum()
return out
if SOURCE == "data":
pts = np.array(sorted(DATA), dtype=float)
xs, ys = pts[:, 0], pts[:, 1]
A, B = xs[0], xs[-1]
else:
xs = make_nodes(NODES, N, A, B)
ys = f(xs)
n = len(xs) - 1
t = np.linspace(A, B, 1200)
# 1. the special tables: l_j(x_k) must be the identity matrix
L = np.array([[lagrange_basis(xs, j, np.array([xk]))[0] for k, xk in enumerate(xs)] for j in range(n + 1)])
print("max |l_j(x_k) - delta_jk| =", np.abs(L - np.eye(n + 1)).max())
print("max |p(x_k) - y_k| =", np.abs(interpolate(xs, ys, xs) - ys).max())
print("max |Lagrange - barycentric| on the grid =", np.abs(interpolate(xs, ys, t) - barycentric(xs, ys, t)).max())
# 2. the Lebesgue function sum_j |l_j(x)| and its maximum: the condition number of interpolation
leb = sum(np.abs(lagrange_basis(xs, j, t)) for j in range(n + 1))
print("Lebesgue constant Lambda_n =", leb.max(), " (|p(x)| <= Lambda_n * max|y_j|)")
print("Vandermonde condition number =", np.linalg.cond(np.vander(xs, increasing=True)))
# 3. the pictures
p = interpolate(xs, ys, t)
fig, ax = plt.subplots(1, 2, figsize=(13, 4.8))
for j in range(n + 1):
ax[0].plot(t, ys[j] * lagrange_basis(xs, j, t), lw=1, alpha=.8, label=f"$y_{j}\\,\\ell_{j}$" if n <= 6 else None)
ax[0].plot(t, p, "k", lw=2.2, label="$p=\\sum y_j\\ell_j$")
if SOURCE == "function":
ax[0].plot(t, f(t), "--", color="gray", lw=1.2, label="$f$")
ax[0].plot(xs, ys, "o", color="crimson", zorder=5)
lo, hi = ys.min(), ys.max()
ax[0].set_ylim(lo - 1.5 * (hi - lo), hi + 1.5 * (hi - lo))
ax[0].set_title("your table = sum of $y_j$ times the special tables"); ax[0].legend(fontsize=8, ncol=2); ax[0].grid(alpha=.3)
for j in range(n + 1):
ax[1].plot(t, lagrange_basis(xs, j, t), lw=1.3)
ax[1].plot(xs, (np.arange(n + 1) == j).astype(float), "o", ms=3, color="k")
ax[1].set_ylim(-1.2, 1.6)
ax[1].set_title("$\\ell_j$ interpolates the table $(x_k,\\delta_{jk})$: a 1 at $x_j$, 0 elsewhere"); ax[1].grid(alpha=.3)
plt.tight_layout()
if SAVE:
plt.savefig("lagrange_pieces.png", dpi=140)
if SOURCE == "function":
fig2, ax2 = plt.subplots(figsize=(7, 4))
ax2.semilogy(t, np.abs(f(t) - p) + 1e-18, label="$|f-p_n|$")
ax2.semilogy(t, leb * 1e-3, "--", label="Lebesgue function / 1000")
ax2.set_title(f"error, n = {n}, {NODES} nodes"); ax2.legend(); ax2.grid(alpha=.3)
plt.tight_layout()
if SAVE:
plt.savefig("lagrange_error.png", dpi=140)
plt.show()
Referências: J.-P. Berrut e L. N. Trefethen, Barycentric Lagrange interpolation, SIAM Review 46 (2004) 501–517; N. J. Higham, The numerical stability of barycentric Lagrange interpolation, IMA J. Numer. Anal. 24 (2004) 547–556; L. N. Trefethen, Approximation Theory and Approximation Practice, SIAM; P. J. Davis, Interpolation and Approximation, Dover; qualquer texto de análise numérica (Burden–Faires, Süli–Mayers). Históricas: C. Runge (1901), G. Faber (1914), P. Erdős (1961). J. Meijering, A chronology of interpolation, Proc. IEEE 90 (2002) 319–342.
A forma de Newton: construindo o polinômio um nó de cada vez
O modo de Newton interpolar: em vez de achar todos os coeficientes de uma vez, construir o polinômio nó por nó. Cada novo nó acrescenta exatamente um termo, um número \(c_k\) (uma diferença dividida) vezes o produto \((x-x_0)\cdots(x-x_{k-1})\), e os termos que já estavam lá nunca são tocados. Este aplicativo deixa você acrescentar os nós um a um e ver o que cada termo faz, reordenar os nós (o polinômio final não muda, a aritmética muda), ver o próximo termo estimar o erro, comparar com a fórmula de Gregory para espaçamento igual e ver como nós que se juntam transformam diferenças divididas em derivadas. Use uma função de teste, uma fórmula sua, ou pontos que você clica, que são usados na ordem em que você os clica. Um curso com observações históricas vem logo abaixo, e um script Python pronto permite repetir tudo no seu computador.
O polinômio de Newton
Função, nós e o polinômio até agora
Pronto
f (função)p (polinômio)último termo \(c_kN_k\)nós usadosnós ainda não usados
ERRO MÁX. \(\max|f-p_k|\)—
ÚLTIMO COEFICIENTE \(c_k\)—
TAMANHO DO ÚLTIMO TERMO \(\max|c_kN_k|\)—
Erro máx.: maior valor de \(|f-p_k|\) em 800 pontos de \([a,b]\), para o polinômio dos nós usados até agora (só para uma função). Último coeficiente: a diferença dividida do nó recém-acrescentado. Tamanho do último termo: o maior valor de \(|c_kN_k|\) em \([a,b]\), que é o que aquele nó contribuiu.
Em um relance
As quatro fórmulas para lembrar
Forma de Newton: uma soma de termos, cada um uma diferença dividida vezes um produto de fatores.
A tabela de diferenças divididas para os nós na ordem escolhida (mostrada para \(n\le8\)). A linha de cima guarda os coeficientes \(c_0,c_1,\dots\): os que estão em uso para o \(k\) atual estão destacados, os outros estão em cinza. Abaixo, a forma de Newton de \(p_k\) e sua forma aninhada (de Horner).
Cada entrada é (o vizinho da direita menos o da esquerda) dividido pela distância entre os nós extremos da sua diagonal, então a tabela toda custa cerca de \(n^2/2\) subtrações e divisões.
Um nó de cada vez
O termo novo corrige o resíduo antigo
Quando o nó \(x_k\) é acrescentado, o polinômio antigo \(p_{k-1}\) já ajusta os primeiros \(k\) nós e erra o novo valor pelo resíduo \(r_k=y_k-p_{k-1}(x_k)\). O termo novo \(c_kN_k\) se anula em todos os nós antigos e é escalado para cancelar exatamente esse resíduo: é o polinômio interpolador da tabela de resíduos. Tracejado: a função resíduo verdadeira \(f-p_{k-1}\) (para uma função). Pontos: o resíduo em cada nó; os cinza já são zero, o vermelho é o nó novo, os vazados ainda não foram alcançados.
Estimativa do erro
O próximo termo é o erro
O erro de \(p_k\) é \(f[x_0,\dots,x_k,x]\,N_{k+1}(x)\), enquanto o próximo termo de Newton é \(f[x_0,\dots,x_{k+1}]\,N_{k+1}(x)\): o mesmo produto de fatores com duas diferenças divididas próximas. Assim o primeiro termo ainda não usado estima o erro dos termos já usados, o que as outras formas do polinômio não oferecem. Preto: \(|f-p_k|\). Vermelho: o tamanho do próximo termo.
Espaçamento igual
Diferenças e a fórmula de Newton–Gregory
Quando os nós são equiespaçados, a divisão por \(x_{i+k}-x_i\) vira uma divisão por \(kh\) e as diferenças divididas se reduzem às diferenças progressivas comuns \(\Delta^ky_i\). A tabela abaixo aparece quando os nós são equiespaçados (escolha nós equiespaçados, ou clique pontos igualmente espaçados; os pontos iniciais de “seus dados” são) e mostra que \(c_k=\Delta^ky_0/(k!\,h^k)\). Esta é a fórmula achada por Gregory em 1670 e usada por séculos em tábuas de interpolação.
Ordem dos nós
O mesmo polinômio, aritmética diferente
O polinômio \(p_n\) por todos os nós não depende da ordem deles, mas os números \(c_k\) e os erros de arredondamento dependem. Esquerda: o tamanho \(|c_k|\) de cada coeficiente para quatro ordens (a atual em negrito). Direita: a diferença, em \([a,b]\), entre a forma de Newton avaliada naquela ordem e a fórmula baricêntrica; é erro de arredondamento e nada mais. Aumente \(n\) (tente 35 com nós de Chebyshev) e compare as ordens.
Tamanho dos coeficientes
Erro de arredondamento da avaliação
Aglomeração
Quando os nós se juntam, as diferenças divididas viram derivadas
Tome cinco nós \(x_c,\ x_c+s,\dots,x_c+4s\) e deixe o espaçamento \(s\) diminuir. Os coeficientes \(c_0,\dots,c_4\) se estabilizam nos coeficientes de Taylor \(f^{(k)}(x_c)/k!\) (a forma de Newton vira o polinômio de Taylor) até que \(s\) fique tão pequeno que subtrair números quase iguais e dividir por \(s^k\) destrói todos os dígitos: quanto maior o \(k\), mais cedo. Para \(\exp\), \(\sin(2\pi x)\) e o polinômio os coeficientes de Taylor exatos aparecem na última linha.
Curso completo
Interpolação de Newton: diferenças divididas, erros e história
Seis grupos de lições curtas; a história está no grupo 5. Cada uma aponta para algo que você pode ver no aplicativo acima.
1 · A ideia: um nó de cada vez
Por que não simplesmente acrescentar um ponto?
A forma de Lagrange precisa de todos os nós de uma vez: com mais um nó todo \(\ell_j\) muda. A forma nos monômios precisa de um novo sistema linear. Newton arrumou o trabalho para que nada do que já foi feito se perca. Suponha que \(p_{k-1}\) interpola os primeiros \(k\) nós \(x_0,\dots,x_{k-1}\), e procure \(p_k=p_{k-1}+q\) com \(q\) de grau no máximo \(k\). Tanto \(p_k\) quanto \(p_{k-1}\) ajustam os primeiros \(k\) nós, então \(q\) se anula neles, e um polinômio de grau no máximo \(k\) com essas \(k\) raízes é
O denominador \(N_k(x_k)=\prod_{j\lt k}(x_k-x_j)\) não é zero porque os nós são distintos. No aplicativo, a curva vermelha é \(p_k\), a curva azul tracejada é o último termo \(c_kN_k\), e Acrescentar os nós um a um executa a construção. Cada passo custa \(O(k)\) operações, então o polinômio todo custa \(O(n^2)\).
Diferenças divididas e a tabela
O número \(c_k\) tem nome: a diferença dividida \(f[x_0,\dots,x_k]\). Como \(p_k=p_{k-1}+c_kN_k\), com \(p_{k-1}\) de grau no máximo \(k-1\) e \(N_k\) mônico de grau \(k\), o número \(c_k\) é o coeficiente líder (o de \(x^k\)) do polinômio de grau no máximo \(k\) pelos primeiros \(k+1\) nós. Tome isso como definição. Ele satisfaz a recursão
Demonstração. Seja \(P\) o interpolador em \(x_i,\dots,x_{i+k-1}\) e \(Q\) em \(x_{i+1},\dots,x_{i+k}\), e ponha \(R(x)=\dfrac{(x-x_i)Q(x)-(x-x_{i+k})P(x)}{x_{i+k}-x_i}\). Ele tem grau no máximo \(k\). Em \(x_i\) vale \(P(x_i)\), em \(x_{i+k}\) vale \(Q(x_{i+k})\), e num nó interno \(x_m\), onde \(P=Q=y_m\), vale \(y_m\cdot\dfrac{(x_m-x_i)-(x_m-x_{i+k})}{x_{i+k}-x_i}=y_m\). Logo \(R\) é o polinômio interpolador de todos os \(k+1\) nós, e comparar os coeficientes de \(x^k\) dá a recursão. (Esta é também a ideia do algoritmo de Neville.) \(\square\)
A recursão preenche uma tabela triangular, uma coluna por ordem, e os coeficientes \(c_0,\dots,c_n\) são sua linha de cima; é a tabela do primeiro cartão abaixo do gráfico, onde os coeficientes em uso estão destacados.
Um exemplo completo, e acrescentando um nó
Nós \(0,1,2,3\) com valores \(1,2,0,5\). As colunas da tabela são \(1,2,0,5\); depois \(1,-2,5\); depois \(-\tfrac32,\tfrac72\); depois \(\tfrac53\). A linha de cima é \(c=(1,1,-\tfrac32,\tfrac53)\), logo
Agora acrescente o nó \(x_4=4\) com valor \(y_4=3\). O polinômio antigo dá \(p_3(4)=1+4-18+40=27\), então o resíduo é \(3-27=-24\), enquanto \(N_4(4)=4\cdot3\cdot2\cdot1=24\). Portanto \(c_4=-24/24=-1\) e
\[p_4(x)=p_3(x)-x(x-1)(x-2)(x-3).\]
Nada anterior foi recalculado. (Confira com a tabela completa dos cinco valores: a nova coluna é \(-2\), depois \(-\tfrac72\), depois \(-\tfrac73\), depois \(-1\).) No modo “seus dados” clique num ponto novo para ver exatamente isto: só o último termo muda.
O que \(c_k\) realmente é: o coeficiente líder
Escrevendo o polinômio interpolador dos nós \(x_0,\dots,x_k\) na forma de Lagrange, \(\sum_jy_j\ell_j\), e lendo o coeficiente de \(x^k\) (o coeficiente líder de \(\ell_j\) é \(1/\prod_{m\ne j}(x_j-x_m)\)), obtém-se a fórmula explícita
Três consequências. (i) É simétrica nos nós: a diferença dividida depende do conjunto \(\{x_0,\dots,x_k\}\), não da ordem (o grupo 2 usa isto). (ii) Se os dados vêm de um polinômio de grau \(d\), então \(c_k=0\) para \(k>d\) e \(c_d\) é seu coeficiente líder; por exemplo \(f[x_0,x_1,x_2]=1\) para \(f=x^2\) e quaisquer três nós. (iii) Liga os dois aplicativos desta seção: \(c_kN_k\) é o polinômio que se anula em \(x_0,\dots,x_{k-1}\) e vale \(r_k\) em \(x_k\), isto é, \(r_k\) vezes o polinômio de Lagrange \(\ell_k\) dos nós \(x_0,\dots,x_k\), que interpola a tabela especial \((0,\dots,0,1)\). O cartão O termo novo corrige o resíduo antigo confere isto numericamente.
2 · Propriedades: ordem, avaliação e erro
Ordem dos nós: mesmo polinômio, aritmética diferente
Por simetria, \(c_k\) depende apenas de quais nós estão entre os primeiros \(k+1\), então reordenar os nós muda os polinômios intermediários \(p_k\) e os termos individuais, mas nunca o polinômio final \(p_n\) (que é o único interpolador). Em aritmética exata a ordem é irrelevante. Em ponto flutuante não é: os termos \(c_kN_k(x)\) podem ser grandes e se cancelar, e os erros de arredondamento crescem com o tamanho deles. O cartão O mesmo polinômio, aritmética diferente mostra o tamanho dos coeficientes e o erro de arredondamento verdadeiro para quatro ordens.
Uma boa ordem espalha os nós para que \(|N_k|\) não dispare. A ordem de Leja toma \(x_0\) de maior módulo e depois, a cada passo, o nó que maximiza \(\prod_{j\lt k}|x-x_j|\) entre os ainda não usados. É barata de calcular e mantém os termos equilibrados; veja as referências (Reichel; Higham, capítulo 5). O efeito pode ser dramático. Com 36 nós de Chebyshev em \([-1,1]\) a ordem da esquerda para a direita (e a inversa) perde cerca de oito dígitos na forma de Newton, enquanto a ordem de Leja guarda quase todos (medido neste aplicativo para a função de Runge; veja o experimento). Com muitos nós equiespaçados todas as ordens sofrem igualmente, porque ali o próprio problema de interpolação é mal condicionado (a constante de Lebesgue do aplicativo de Lagrange), e nenhuma ordenação conserta isso.
Avaliação aninhada, sua derivada e o custo
A forma de Newton se avalia como a regra de Horner: \(s_n=c_n\), depois \(s_j=c_j+(t-x_j)\,s_{j+1}\) para \(j=n-1,\dots,0\), e \(p(t)=s_0\). São \(n\) multiplicações e \(2n\) somas, sem potências e sem produtos a construir. Derivando a recursão, \(s_j'=s_{j+1}+(t-x_j)\,s_{j+1}'\) com \(s_n'=0\), obtém-se \(p'(t)=s_0'\) ao mesmo custo. A forma aninhada é a segunda linha do cartão Diferenças divididas e a forma de Newton.
Operação
Forma de Newton
Forma de Lagrange
Baricêntrica
construir a partir dos dados
\(O(n^2)\) (tabela)
nenhuma
\(O(n^2)\) (pesos)
avaliar num ponto
\(O(n)\)
\(O(n^2)\)
\(O(n)\)
acrescentar um nó
\(O(n)\), conserva todo o trabalho antigo
\(O(n^2)\), tudo muda
\(O(n)\), os pesos se atualizam
mudar um valor \(y_j\)
refazer a tabela a partir dali
\(O(n)\) por ponto
de graça, pesos intactos
A fórmula do erro, com uma demonstração de uma linha
Demonstração. Use \(x\) como mais um nó, o último. Pela propriedade incremental da forma de Newton, o polinômio interpolador de \(x_0,\dots,x_n,x\) é \(p_n(t)+f[x_0,\dots,x_n,x]\,N_{n+1}(t)\) com \(N_{n+1}=\omega\). Ele interpola \(f\) no nó \(x\), então pondo \(t=x\) obtém-se \(f(x)=p_n(x)+f[x_0,\dots,x_n,x]\,\omega(x)\). \(\square\)
Nenhuma derivada aparece, e a fórmula é uma identidade válida para qualquer função. Junto com o teorema do valor médio do grupo 2 (\(f[x_0,\dots,x_n,x]=f^{(n+1)}(\xi)/(n+1)!\)) dá a fórmula usual do erro do aplicativo de Lagrange. O fator \(\omega\), que depende só dos nós, é o que o cartão de erro daquele aplicativo desenha.
O próximo termo como estimativa do erro
Pela lição anterior o erro de \(p_k\) é \(f[x_0,\dots,x_k,x]\,N_{k+1}(x)\), enquanto o próximo termo de Newton é \(f[x_0,\dots,x_k,x_{k+1}]\,N_{k+1}(x)\). O produto de fatores é o mesmo; as duas diferenças divididas só diferem no ponto extra que usam, \(x\) ou \(x_{k+1}\), e para uma função suave ambas estão perto de \(f^{(k+1)}/(k+1)!\). Então \(|f-p_k|\approx|c_{k+1}N_{k+1}|\) perto dos dados: o primeiro termo que você não usou mede o erro dos que usou. Isso dá uma regra adaptativa: acrescente nós até o último termo ficar abaixo de uma tolerância. O cartão O próximo termo é o erro desenha as duas curvas; para funções suaves elas ficam próximas.
Cuidado. A estimativa só enxerga os nós. Se \(f\) tem uma característica estreita entre os nós, as diferenças divididas podem continuar pequenas enquanto o erro verdadeiro é grande, e a estimativa é enganada. Experimente o “bump suave” com poucos nós, ou digite uma fórmula com um pico estreito como exp(-400*(x-0.3)^2).
Diferenças divididas e derivadas
Teorema (valor médio para diferenças divididas). Se \(f\in C^k\), então \(f[x_0,\dots,x_k]=f^{(k)}(\xi)/k!\) para algum \(\xi\) entre o menor e o maior nó.
Demonstração. Seja \(q\) o polinômio interpolador de grau no máximo \(k\); sua derivada de ordem \(k\) é a constante \(k!\,c_k\) com \(c_k=f[x_0,\dots,x_k]\). A função \(f-q\) tem \(k+1\) zeros, então pelo teorema de Rolle aplicado \(k\) vezes \((f-q)^{(k)}\) tem um zero \(\xi\): \(f^{(k)}(\xi)=k!\,c_k\). \(\square\)
Há também uma integral exata, a fórmula de Hermite–Genocchi, \(f[x_0,\dots,x_k]=\int f^{(k)}(t_0x_0+\dots+t_kx_k)\,dt\) sobre o simplex \(t_i\ge0,\ \sum t_i=1\), que faz sentido para nós repetidos. Leitura prática: se \(|f^{(k)}|\le M_k\) então \(|c_k|\le M_k/k!\), de modo que para funções suaves os coeficientes \(|c_k|\) (gráfico da esquerda do cartão da ordem) caem rápido, e para funções com quina ou salto não caem. O tamanho dos coeficientes é um diagnóstico da suavidade dos dados.
3 · Espaçamento igual: diferenças finitas
Diferenças progressivas e a fórmula de Newton–Gregory
Para nós \(x_i=x_0+ih\) defina as diferenças progressivas \(\Delta y_i=y_{i+1}-y_i\) e \(\Delta^ky_i=\Delta^{k-1}y_{i+1}-\Delta^{k-1}y_i\). A recursão das diferenças divididas tem denominador \(x_{i+k}-x_i=kh\), e indução em \(k\) dá
A segunda fórmula é a de Newton–Gregory (diferenças progressivas): aqui \(N_k(x_0+sh)=h^k\,s(s-1)\cdots(s-k+1)\), que absorve o \(h^k\). Exemplo: os valores \(1,2,0,5\) em \(0,1,2,3\) têm \(\Delta y_0=1\), \(\Delta^2y_0=-3\), \(\Delta^3y_0=10\), então \(p(s)=1+s-3\binom s2+10\binom s3\) e \(p(1{,}5)=1+1{,}5-1{,}125-0{,}625=0{,}75\), o valor do grupo 1. Só subtrações são necessárias para montar a tabela: uma grande ajuda nos tempos do cálculo à mão.
Os coeficientes binomiais fazem o papel das potências para as diferenças, assim como a identidade \(\Delta\binom{s}{k}=\binom{s}{k-1}\) faz o papel de \(\tfrac{d}{ds}\tfrac{s^k}{k!}=\tfrac{s^{k-1}}{(k-1)!}\): a fórmula de Newton–Gregory é a fórmula de Taylor discreta. O cartão Diferenças e a fórmula de Newton–Gregory confere \(c_k=\Delta^ky_0/(k!h^k)\) e a igualdade das duas maneiras de avaliar.
As diferenças revelam o grau, e amplificam o ruído
Se \(y_i\) são os valores de um polinômio de grau \(d\) em nós equiespaçados, então \(\Delta^{d}y_i\) é constante (igual a \(d!\,h^d\) vezes o coeficiente líder) e \(\Delta^{d+1}y_i=0\). Exemplo, os cubos \(1,8,27,64,125,216\): as diferenças são \(7,19,37,61,91\); depois \(12,18,24,30\); depois \(6,6,6\); depois \(0,0\). O grau é 3 e o coeficiente líder é \(6/(3!\cdot1)=1\). Calcular tábuas de polinômios somando uma coluna constante para cima é exatamente o que a Máquina de Diferenças de Babbage foi projetada para fazer, na década de 1820, sem uma única multiplicação.
A outra face da moeda: cada diferença pode dobrar o tamanho de erros aleatórios nos dados (\(\Delta\) de dois erros de tamanho \(\sigma\) pode chegar a \(2\sigma\), e assim até \(2^k\sigma\) em \(\Delta^k\)). Se uma coluna alta de diferenças, em vez de se anular, pula de sinal em sinal, os dados contêm ruído; tabuladores usaram isto para achar erros em tábuas impressas. A mesma amplificação é o que torna inúteis as diferenças divididas de alta ordem de dados ruidosos (grupo 4).
4 · Nós repetidos: Taylor e Hermite
Nós repetidos: Taylor e Hermite
Quando dois nós coincidem a recursão divide \(0\) por \(0\). O teorema do valor médio diz qual deve ser o limite: \(f[x_0,x_0]=f'(x_0)\), e em geral \(f[\underbrace{x_0,\dots,x_0}_{k+1}]=f^{(k)}(x_0)/k!\). Com todos os nós iguais, a forma de Newton é o polinômio de Taylor,
Com alguns nós repetidos e outros não obtém-se a interpolação de Hermite: um nó repetido \(m\) vezes prescreve o valor e as primeiras \(m-1\) derivadas ali. Usa-se a mesma tabela, pondo a derivada onde apareceria um \(0/0\). Exemplo: \(f(0)=1\), \(f'(0)=0\), \(f(1)=2\), nós \(0,0,1\): as colunas são \(1,1,2\); depois \(0,1\); depois \(1\). Logo \(p=1+0\cdot x+1\cdot x^2=1+x^2\), que de fato tem \(p(0)=1\), \(p'(0)=0\), \(p(1)=2\). A série de Taylor de 1715 é o limite da fórmula de Newton quando os nós se juntam, e foi assim que Taylor a achou.
Por que nós aglomerados arruínam a aritmética
Calculada a partir de valores da função, uma diferença dividida de ordem \(k\) com espaçamento \(s\) é uma diferença de ordem \(k\) dividida por \(s^k\). Cada valor carrega um erro de arredondamento de cerca de \(\varepsilon|f|\) (\(\varepsilon\approx1{,}1\times10^{-16}\)), e a divisão o multiplica: o erro de \(c_k\) é da ordem de \(\varepsilon|f|/s^k\) (a menos de um fator \(2^k\)). Já o erro de aproximação de \(c_k\) como coeficiente de Taylor é da ordem de \(s\). A soma dos dois é mínima em \(s\approx\varepsilon^{1/(k+1)}\): cerca de \(10^{-8}\) para \(k=1\) mas só \(10^{-3}\) para \(k=4\) (ignorando os fatores limitados). Esta é a tabela do cartão Quando os nós se juntam, as diferenças divididas viram derivadas: cada coluna melhora, atinge seu melhor e depois se perde em ruído, e quanto maior a ordem mais cedo isso acontece.
É o mesmo compromisso da derivação numérica por diferenças finitas. O remédio, quando se querem as derivadas: não aglomerar; derivar analítica ou automaticamente, ou usar nós num círculo do plano complexo (fórmula de Cauchy), o que mantém as divisões inofensivas. E se você precisa de dados de Hermite, dê as derivadas à forma de Hermite em vez de aproximá-las por aglomeração.
5 · História
Antes de Newton: a interpolação em tábuas, Briggs e Gregory
A interpolação é tão antiga quanto a astronomia: astrônomos babilônios e gregos completavam tábuas de posições por esquemas lineares e depois quadráticos. O que tornou necessárias as fórmulas polinomiais no século XVII foi a produção de grandes tábuas, sobretudo de logaritmos. Henry Briggs, na sua Arithmetica Logarithmica (1624), já usava diferenças finitas para interpolar e conferir suas tábuas, e deduziu casos especiais da fórmula de intervalos iguais.
A fórmula geral para intervalos iguais, a fórmula de Newton–Gregory do grupo 3, é de James Gregory, que a achou em 1670 e a descreveu numa carta a John Collins nesse ano. Gregory não a publicou. Tinha nas mãos, em poucas linhas, o que os tabuladores precisavam; a história da interpolação no século XVII é em parte a história de cartas que não foram impressas.
Newton: cartas, manuscritos, os Principia e o Methodus
Newton chegou à interpolação na década de 1670. Em 1675 descreveu o método de preencher tábuas por diferenças numa carta a John Smith. Em 1676 escreveu o manuscrito Regula differentiarum (a regra das diferenças), que ficou inédito até o século XX. A primeira aparição impressa está nos Principia (1687), Livro III, Lema V: achar uma curva de tipo parabólico que passe por pontos dados. Newton dá a solução primeiro para intervalos iguais (sua versão da fórmula de Newton–Gregory) e depois para intervalos desiguais, onde os coeficientes são o que hoje chamamos diferenças divididas, calculadas por divisão sucessiva das diferenças pelas distâncias entre as abscissas. O lema tem um propósito prático: a trajetória de um cometa, observada em poucos instantes, deve ser interpolada.
O tratado que desenvolve o assunto, o Methodus differentialis, foi escrito na década de 1670 e impresso só em 1711; nele Newton fala de diferenças “assim divididas” (differentia sic divisa). Assim a forma de Newton deste aplicativo, com nós em posições arbitrárias, está impressa desde 1687, e Newton tinha o caso de espaçamento igual e o caso geral com poucos anos de diferença.
Depois de Newton: Taylor, Waring, Euler, Lagrange, Gauss, Cauchy e o nome
O Methodus incrementorum de Brook Taylor (1715) leva a fórmula de Newton ao limite de nós que se juntam e obtém a série que leva o seu nome (grupo 4). Edward Waring publicou em 1779 a fórmula que chamamos de Lagrange; Euler a deduziu logo depois (por volta de 1783); Lagrange deu a ela sua própria apresentação em aulas na École Normale por volta de 1795 (veja o aplicativo de Lagrange desta seção). Numa conferência de 1812, publicada só depois, Gauss mostrou que as fórmulas de Newton, Euler e Waring–Lagrange são o mesmo polinômio em notações diferentes, que é o teorema de unicidade.
O século XIX trouxe a teoria do erro e o vocabulário. Cauchy deu o resto da fórmula de interpolação em termos da derivada \(f^{(n+1)}\) (1821, 1840). Ampère (1826) chamou as quantidades \(f[x_0,\dots,x_k]\) de “fonctions interpolaires”, e Augustus De Morgan cunhou o nome diferenças divididas no seu texto de cálculo de 1842. Genocchi (1869) e Hermite deram a fórmula integral e Hermite (1878) a versão por integral de contorno que cobre nós repetidos; o teorema do valor médio \(f[x_0,\dots,x_n]=f^{(n)}(\xi)/n!\) do grupo 2 é geralmente creditado a Schwarz (1881–82) nesta forma. Em 1901 Runge mostrou, com o exemplo que leva seu nome (o aplicativo de Lagrange), que a interpolação em nós equiespaçados pode divergir.
As datas e atribuições seguem a cronologia de Meijering (Proc. IEEE 90, 2002) e a History of Numerical Analysis de Goldstine; para os detalhes finos de prioridade consulte essas fontes.
Newton e Lagrange: um polinômio, dois pontos de vista
As duas formas são o mesmo polinômio mas respondem a perguntas diferentes. A de Lagrange pergunta qual é o polinômio para qualquer tabela, uma vez fixados os nós? e responde com uma base presa aos nós, em que as coordenadas do polinômio são os próprios dados: a matriz de interpolação é a identidade. A de Newton pergunta como o polinômio muda quando se acrescenta um nó? e responde com uma base em que a matriz de interpolação é triangular, de modo que o polinômio cresce de um termo. A de Lagrange é a forma da teoria (estabilidade, constante de Lebesgue, análise do erro para um conjunto fixo de nós); a de Newton é a forma do cálculo que vai sendo construído (interpolação adaptativa, tábuas, derivadas, dados de Hermite, nós confluentes). A fórmula baricêntrica, no aplicativo de Lagrange, dá a versão eficiente da primeira e as diferenças divididas a versão eficiente da segunda.
6 · Experimentos guiados e exercícios
Experimento 1: um nó de cada vez
Escolha “eˣ em [−1, 1]”, nós de Chebyshev e \(n=8\), e aperte Acrescentar os nós um a um. A curva vermelha caminha para \(f\), e o termo azul tracejado, a contribuição de cada nó novo, encolhe muito depressa: olhe a caixa “tamanho do último termo” e os coeficientes na tabela.
Passe para “|x| (uma quina)”. Os termos e os coeficientes já não encolhem no mesmo ritmo: a suavidade de \(f\) está escrita no tamanho das diferenças divididas (lição “Diferenças divididas e derivadas”).
Pare em \(k=3\) e leia o cartão O termo novo corrige o resíduo antigo: o ponto vermelho no nó recém-acrescentado é o resíduo, a curva tracejada é o resíduo verdadeiro do polinômio antigo.
No cartão O próximo termo é o erro, compare as duas curvas para vários \(k\). Depois digite o pico exp(-400*(x-0.3)^2) como sua função e veja quando a estimativa é enganada.
Experimento 2: a ordem dos nós
Escolha “Runge: 1/(1 + 25x²)” com nós de Chebyshev e ponha \(n=35\). No cartão O mesmo polinômio, aritmética diferente compare as quatro ordens. A ordem da esquerda para a direita e a sua inversa mostram uma diferença de arredondamento da ordem de \(10^{-7}\), a aleatória cerca de \(10^{-13}\) e a de Leja cerca de \(10^{-15}\): o mesmo polinômio, avaliado com precisões muito diferentes.
Agora passe para nós equiespaçados com o mesmo \(n\). As quatro ordens mostram uma diferença do mesmo tamanho (em torno de \(10^{-5}\)): o próprio problema é mal condicionado, e reordenar não o cura. Compare com a constante de Lebesgue no aplicativo de Lagrange.
Mude a ordem nas configurações e veja \(p_k\) para \(k<n\) mudar enquanto o polinômio final não muda: aperte Acrescentar os nós um a um com “Como dada” e depois com “Ordem de Leja”.
Experimento 3: seus próprios pontos, na ordem em que você os clica
Escolha “Seus dados”. Os seis pontos iniciais são equiespaçados (\(h=2\)), então o cartão Diferenças e a fórmula de Newton–Gregory mostra a tabela de diferenças. Clique um sétimo ponto com outro espaçamento: a tabela desaparece, porque os nós já não são equiespaçados.
Arraste um ponto e veja quais termos mudam. Mover o último ponto só muda o último termo quando você usa menos nós; mover o primeiro ponto muda todas as diferenças divididas.
Clique um ponto novo no meio: ele passa a ser o último nó (ordem “Como dada”), então só o último termo muda. Escolha “Ordem de Leja” e compare.
Exercícios, com respostas
Ache a forma de Newton do polinômio por \((-1,1),(0,0),(1,1)\). Resposta. A tabela é \(1,0,1\); depois \(-1,1\); depois \(1\). Logo \(p=1-(x+1)+(x+1)x=x^2\).
Acrescente o nó \((2,3)\) ao polinômio anterior sem recalcular. Resposta. \(p(2)=4\), então o resíduo é \(3-4=-1\) e \(N_3(2)=3\cdot2\cdot1=6\); logo \(c_3=-\tfrac16\) e \(p=x^2-\tfrac16(x+1)x(x-1)\). Confira: \(p(2)=4-\tfrac16\cdot6=3\).
A tabela \(1,8,27,64,125,216\) em \(x=1,\dots,6\): ache o grau e a forma de Newton. Resposta. As diferenças são \(7,19,37,61,91\); \(12,18,24,30\); \(6,6,6\); depois \(0\). Grau 3, \(c_k=\Delta^ky_1/k!\) dá \(1,7,6,1\): \(p=1+7(x-1)+6(x-1)(x-2)+(x-1)(x-2)(x-3)=x^3\).
Mostre que \(f[x_0,x_1,x_2]=1\) para \(f(x)=x^2\) e quaisquer três nós distintos. Resposta. \(f[x_0,x_1]=x_0+x_1\), \(f[x_1,x_2]=x_1+x_2\), então \(f[x_0,x_1,x_2]=\dfrac{(x_1+x_2)-(x_0+x_1)}{x_2-x_0}=1\). (É o coeficiente líder.)
Ache o polinômio de grau menor com \(p(0)=0\), \(p'(0)=1\), \(p(1)=2\), \(p'(1)=3\). Resposta. Nós \(0,0,1,1\): colunas \(0,0,2,2\); depois \(1,2,3\) (o primeiro e o último são as derivadas); depois \(1,1\); depois \(0\): \(p=0+1\cdot x+1\cdot x^2+0=x^2+x\), com \(p(1)=2\), \(p'(1)=3\) ✓.
Experimente você mesmo em Python
Um script autônomo para a sua fórmula ou tabela: calcula a tabela de diferenças divididas, os coeficientes de Newton e a forma de Newton, verifica tudo (propriedade de interpolação, independência da ordem, comparação com a fórmula baricêntrica, Newton–Gregory para espaçamento igual), mostra o que a aglomeração dos nós faz e grava uma figura com os termos. Precisa de numpy e matplotlib (pip install numpy matplotlib). Mude as configurações no começo (SOURCE, a fórmula f, o intervalo, N, NODES, ORDER, DATA) e rode de novo.
# Newton form of the interpolating polynomial, with divided differences.
#
# p(x) = c_0 + c_1 (x - x_0) + c_2 (x - x_0)(x - x_1) + ... + c_n (x - x_0)...(x - x_{n-1}), c_k = f[x_0, ..., x_k]
#
# The k-th coefficient only depends on the first k + 1 nodes, so adding a node adds one term and changes nothing before it.
#
# Needs: pip install numpy matplotlib Run: python newton_interp.py
# Edit the settings just below and run again.
import numpy as np
import matplotlib.pyplot as plt
from math import comb
# ------------------------------------------------------------------ settings: play with these
SOURCE = "function" # "function": y_k = f(x_k) or "data": your own points below, IN THE ORDER GIVEN
def f(x): # any numpy expression of x
return np.exp(x) * np.sin(3 * x)
A, B = -1.0, 1.0
N = 6 # degree n: n + 1 nodes
NODES = "chebyshev" # "equispaced", "chebyshev" or "lobatto"
ORDER = "given" # order in which the nodes are used: "given", "reversed", "leja", "random"
DATA = [(0, 1), (2, 3), (4, 2.5), (6, 4.5), (8, 3), (10, 6)]
SAVE = True
# ------------------------------------------------------------------
def make_nodes(kind, n, a, b):
m, h, i = (a + b) / 2, (b - a) / 2, np.arange(n + 1)
if kind == "chebyshev":
return m - h * np.cos((2 * i + 1) * np.pi / (2 * n + 2))
if kind == "lobatto" and n > 0:
return m - h * np.cos(i * np.pi / n)
return np.linspace(a, b, n + 1)
def leja(xs):
"""Leja order: start at the node of largest modulus, then add the node that maximizes prod |x - chosen|."""
rest, out = list(xs), []
out.append(rest.pop(int(np.argmax(np.abs(rest)))))
while rest:
score = [np.sum(np.log(np.abs(r - np.array(out)) + 1e-300)) for r in rest]
out.append(rest.pop(int(np.argmax(score))))
return np.array(out)
def divided_differences(xs, ys):
"""Return the whole triangle T[k][i] = f[x_i, ..., x_{i+k}]; the Newton coefficients are T[k][0]."""
T = [np.array(ys, dtype=float)]
for k in range(1, len(xs)):
prev = T[-1]
T.append((prev[1:] - prev[:-1]) / (xs[k:] - xs[:-k]))
return T
def newton_eval(t, xs, c, k=None):
"""Nested (Horner-like) evaluation of the first k + 1 terms: c_0 + (t-x_0)(c_1 + (t-x_1)(c_2 + ...))."""
k = len(c) - 1 if k is None else k
s = np.full_like(t, c[k], dtype=float)
for j in range(k - 1, -1, -1):
s = s * (t - xs[j]) + c[j]
return s
if SOURCE == "data":
pts = np.array(DATA, dtype=float) # NOT sorted: the order is the order of the nodes
xs, ys = pts[:, 0], pts[:, 1]
A, B = xs.min(), xs.max()
else:
xs = make_nodes(NODES, N, A, B)
if ORDER == "reversed":
xs = xs[::-1]
elif ORDER == "leja":
xs = leja(xs)
elif ORDER == "random":
xs = np.random.default_rng(1).permutation(xs)
ys = f(xs)
n = len(xs) - 1
T = divided_differences(xs, ys)
c = np.array([T[k][0] for k in range(n + 1)])
# 1. the divided-difference table
print("nodes (in this order):", np.array2string(xs, precision=4))
print("\ndivided differences (column k holds f[x_i, ..., x_{i+k}]; the first row is the list of coefficients c_k)")
for i in range(n + 1):
print(" " + " ".join(f"{T[k][i]:11.5f}" if i <= n - k else " " * 11 for k in range(n + 1)))
print("\nNewton coefficients c_k =", np.array2string(c, precision=5))
# 2. the same polynomial for every order of the nodes, but not the same coefficients
t = np.linspace(A, B, 1000)
p = newton_eval(t, xs, c)
order2 = np.argsort(xs)
c2 = np.array([divided_differences(xs[order2], ys[order2])[k][0] for k in range(n + 1)])
p2 = newton_eval(t, xs[order2], c2)
print("\nsame polynomial with the nodes sorted: max |p - p_sorted| =", np.abs(p - p2).max())
# 3. the error: f(x) - p(x) = f[x_0, ..., x_n, x] * omega(x), and for smooth f this is f^(n+1)(xi)/(n+1)! * omega(x)
if SOURCE == "function":
print("max |f - p| on the grid =", np.abs(f(t) - p).max())
# 4. equispaced nodes: divided differences are forward differences divided by k! h^k (Gregory-Newton)
if NODES == "equispaced" and SOURCE == "function" and ORDER == "given":
h = xs[1] - xs[0]
D = [ys.copy()]
for k in range(1, n + 1):
D.append(np.diff(D[-1]))
s = (t - xs[0]) / h
pg = sum(D[k][0] * np.array([np.prod([(si - j) for j in range(k)]) / np.prod(range(1, k + 1)) for si in s]) for k in range(n + 1))
print("Gregory-Newton with Delta^k y_0 reproduces p: max difference =", np.abs(p - pg).max())
# 5. the pictures: p_0, p_1, ..., p_n (each new node adds one term)
fig, ax = plt.subplots(1, 2, figsize=(13, 4.8))
cmap = plt.get_cmap("viridis")
for k in range(n + 1):
ax[0].plot(t, newton_eval(t, xs, c, k), color=cmap(k / max(n, 1)), lw=1.1 + (k == n), label=f"$p_{k}$" if n <= 7 else None)
if SOURCE == "function":
ax[0].plot(t, f(t), "--", color="gray", lw=1.3, label="$f$")
ax[0].plot(xs, ys, "o", color="crimson", zorder=5)
for k, xk in enumerate(xs):
ax[0].annotate(str(k), (xk, ys[k]), textcoords="offset points", xytext=(4, 6), fontsize=8)
ax[0].set_title("partial sums $p_k$: node $x_k$ adds the term $c_k(x-x_0)\\cdots(x-x_{k-1})$"); ax[0].legend(fontsize=8, ncol=2); ax[0].grid(alpha=.3)
for k in range(n + 1):
nb = np.prod([t - xs[j] for j in range(k)], axis=0) if k else np.ones_like(t)
ax[1].plot(t, nb, color=cmap(k / max(n, 1)), lw=1.2)
ax[1].set_title("the Newton basis $N_k(x)=\\prod_{j<k}(x-x_j)$: $N_k$ vanishes at $x_0,\\dots,x_{k-1}$")
lo, hi = np.percentile(np.concatenate([np.prod([t - xs[j] for j in range(k)], axis=0) if k else np.ones_like(t) for k in range(n + 1)]), [1, 99])
ax[1].set_ylim(lo * 1.2, hi * 1.2); ax[1].grid(alpha=.3)
plt.tight_layout()
if SAVE:
plt.savefig("newton_pieces.png", dpi=140)
# 6. clustering the nodes: the divided differences become derivatives, f[x_0..x_k] -> f^(k)(x_0)/k! (Taylor, 1715)
if SOURCE == "function":
print("\nclustering the nodes around x_0 = 0: the first coefficients settle, then rounding errors (cancellation) take over")
u = np.arange(7) / 6.0
for spread in (1.0, 1e-1, 1e-2, 1e-3, 1e-4, 1e-6, 1e-8):
xc = spread * u
cc = [divided_differences(xc, f(xc))[k][0] for k in range(5)]
print(f" spread {spread:7.0e}: " + " ".join(f"{v:12.6f}" for v in cc))
plt.show()
Referências: J. Meijering, A chronology of interpolation: from ancient astronomy to modern signal and image processing, Proc. IEEE 90 (2002) 319–342; H. H. Goldstine, A History of Numerical Analysis from the 16th through the 19th Century, Springer 1977; C. de Boor, Divided differences, Surveys in Approximation Theory 1 (2005) 46–69; N. J. Higham, Accuracy and Stability of Numerical Algorithms, 2ª ed., SIAM 2002 (capítulo 5); L. Reichel, Newton interpolation at Leja points, BIT 30 (1990) 332–346; I. Newton, Methodus differentialis (1711) e Principia, Livro III, Lema V.
Diferenças finitas e o polinômio de Newton–Gregory
Quando os nós são igualmente espaçados, \(x_i=x_0+ih\), as diferenças divididas da forma de Newton se reduzem a simples diferenças finitas, obtidas por subtrações repetidas: \(\Delta y_i=y_{i+1}-y_i\), \(\Delta^2y_i=\Delta y_{i+1}-\Delta y_i\), e assim por diante. O polinômio interpolador toma então a forma de Newton–Gregory, uma soma das diferenças \(\Delta^ky_0\) vezes coeficientes binomiais \(\binom sk\) na variável \(s=(x-x_0)/h\), com um gêmeo regressivo que parte do último nó. Este aplicativo deixa você montar a tabela de diferenças de uma função, de uma fórmula sua ou de uma lista de números; ler nela as diferenças progressivas, regressivas e centrais; ver o polinômio crescer termo a termo; ver o ruído nos dados ser amplificado pelas diferenças; e depois derivar o polinômio para obter as fórmulas de diferenças finitas de \(f'\) e \(f''\), com seus erros de truncamento e de arredondamento. É a base para as derivadas numéricas. Um curso com observações históricas vem logo abaixo, e um script Python pronto permite repetir tudo no seu computador.
O polinômio de Newton–Gregory
Função, nós igualmente espaçados e o polinômio de grau \(k\)
Pronto
f (função)p (polinômio)nós usadosnós não usados
ERRO MÁX. \(\max|f-p_k|\)—
ÚLTIMA DIFERENÇA —
PRÓXIMA DIFERENÇA —
Erro máx.: maior valor de \(|f-p_k|\) em 400 pontos entre o primeiro e o último nó (só para uma função). A última diferença é a que multiplica \(\binom sk\) no termo de maior grau usado; a próxima diferença é a que viria em seguida, e seu tamanho estima o erro, como a lição sobre o termo de erro explica.
Diferenças progressivas, regressivas e centrais em uma só tabela
Cada coluna é a diferença da anterior, escrita entre seus dois pais. Os números são os mesmos qualquer que seja o nome que lhes damos: \(\Delta^ky_i=\nabla^ky_{i+k}=\delta^ky_{i+k/2}\). O que muda é quais deles são usados. A fórmula progressiva usa a diagonal superior, a regressiva usa a diagonal inferior, e as fórmulas centrais (Gauss, Stirling, Bessel) fazem um zigue-zague ao longo de uma linha horizontal da tabela. Escolha o operador para ver o caminho destacado.
Lendo a tabela: uma coluna (quase) constante diz o grau; uma coluna (quase) nula diz que a anterior era constante. Com dados reais as últimas colunas são dominadas por ruído, veja o segundo cartão a seguir.
Calculando com a fórmula
Termos e somas parciais em um ponto
Digite um ponto \(x\). O aplicativo calcula \(s=(x-x_0)/h\) (progressiva) ou \(s=(x-x_n)/h\) (regressiva) e soma os termos um a um. Para \(x\) entre os dois primeiros nós os termos progressivos diminuem depressa, e é por isso que a forma progressiva serve para o início da tabela; perto do fim a forma regressiva se comporta do mesmo modo. A última coluna é o erro da soma parcial em relação a \(f\), quando há uma função.
Ruído e diferenças
As diferenças amplificam o ruído: \(2^k\)
Some uma perturbação de tamanho \(\varepsilon\) aos valores e tome as diferenças de novo. Cada diferença é uma subtração, então uma perturbação \(\varepsilon_i\) nos dados entra em \(\Delta^ky_i\) com os coeficientes \((-1)^{k-j}\binom kj\), cujos valores absolutos somam \(2^k\). O gráfico mostra a maior entrada em valor absoluto de cada coluna, em escala logarítmica, para os dados limpos (azul) e os perturbados (vermelho), com a cota \(2^k\varepsilon\) (tracejada). A linha vermelha acompanha a azul até o ruído assumir o controle, e daí em diante cresce por um fator próximo de 2 por coluna.
Derivadas numéricas
Derivando o polinômio de Newton–Gregory
Como \(p(x_0+sh)=\sum_k\binom sk\Delta^ky_0\) e \(\tfrac{d}{dx}=\tfrac1h\tfrac{d}{ds}\), derivar o polinômio em \(s=0\) dá \(hf'(x_0)\approx\Delta y_0-\tfrac12\Delta^2y_0+\tfrac13\Delta^3y_0-\cdots\) e algo análogo para derivadas de ordem maior. Truncando depois de \(\Delta^K\) e escrevendo as diferenças em termos dos valores obtêm-se as fórmulas da tabela abaixo, todas exatas para polinômios de grau \(K\). Sua ordem é a potência de \(h\) no erro, que é o primeiro termo omitido. As fórmulas centrais vêm de derivar o polinômio por nós dispostos simetricamente em torno do ponto.
As mesmas fórmulas aplicadas à tabela acima, no seu primeiro nó (progressivas) e no nó do meio (centrais), com o passo \(h\) da tabela. Quando há uma função, o valor de referência é calculado por uma fórmula central de treze pontos com um passo muito menor, e a última coluna é o erro absoluto.
Agora diminua o passo. O gráfico mostra o erro de cada fórmula em \(x_0\) contra o passo \(h\) (os dois eixos logarítmicos), calculado em precisão dupla. Para \(h\) grande domina o erro de truncamento \(Ch^p\) e a curva é uma reta de inclinação \(p\); para \(h\) pequeno os erros de arredondamento dos valores, de tamanho cerca de \(10^{-16}\), são divididos por \(h^m\) e a curva sobe de volta com inclinação \(-m\). Cada fórmula tem um passo ótimo, onde as duas se encontram. Você também pode acrescentar um ruído relativo aos valores da função, para imitar dados medidos.
Curso completo
Diferenças finitas: da tabela à derivada
Seis grupos de lições curtas; a história está no grupo 5. Cada uma aponta para algo que você pode ver no aplicativo acima.
1 · Diferenças finitas
O que é uma diferença finita?
Dados valores \(y_i=f(x_0+ih)\) em nós igualmente espaçados, a diferença progressiva é \(\Delta y_i=y_{i+1}-y_i\), e as diferenças de ordem maior se definem por repetição, \(\Delta^ky_i=\Delta^{k-1}y_{i+1}-\Delta^{k-1}y_i\). Desenrolando a recursão chega-se à fórmula fechada, onde o triângulo de Pascal aparece com sinais alternados:
Exemplo: os valores \(1,2,0,5\) têm \(\Delta y=1,-2,5\), depois \(\Delta^2y=-3,7\), depois \(\Delta^3y=10\); e de fato \(\Delta^3y_0=-1+3\cdot2-3\cdot0+5=10\). A tabela do aplicativo escreve cada coluna entre seus dois pais, de modo que cada entrada fica no meio dos nós que usa.
Operadores: deslocamento, \(\Delta\), \(\nabla\), \(\delta\) e a derivada
Seja \(E\) o deslocamento, \((Ef)(x)=f(x+h)\). Então \(\Delta=E-I\) (progressivo), \(\nabla=I-E^{-1}\) (regressivo) e \(\delta=E^{1/2}-E^{-1/2}\) (central). Eles comutam e satisfazem \(\Delta^ky_i=\nabla^ky_{i+k}=\delta^ky_{i+k/2}\), e é por isso que uma só tabela serve para os três. A fórmula de Taylor diz que \(f(x+h)=\sum_k\tfrac{h^k}{k!}f^{(k)}(x)=e^{hD}f(x)\), logo \(E=e^{hD}\), onde \(D=d/dx\), e portanto
Isto é formal, mas é o motor de todo o último grupo: toda fórmula de diferenças finitas para uma derivada é um truncamento desta série ou de suas potências. Explica também a fórmula \(E^s=(1+\Delta)^s=\sum_k\binom sk\Delta^k\), que é a fórmula de Newton–Gregory em forma de operadores.
Diferenças de polinômios: detectando o grau
Se \(p\) é um polinômio de grau \(d\), então \(\Delta p\) tem grau \(d-1\), porque os termos de maior grau de \(p(x+h)\) e \(p(x)\) se cancelam. Repetindo, \(\Delta^dp\) é constante, igual a \(d!\,a_d\,h^d\), onde \(a_d\) é o coeficiente líder, e \(\Delta^{d+1}p=0\). Assim, a coluna constante da tabela diz o grau de um polinômio só a partir dos seus valores. Exemplo: os cubos \(1,8,27,64,125,216\) têm primeiras diferenças \(7,19,37,61,91\), segundas diferenças \(12,18,24,30\) e terceiras diferenças \(6,6,6\): grau \(3\), e \(3!\cdot1=6\) é o coeficiente líder vezes \(3!\). Digite estes valores em Seus dados para ver.
A recíproca é o princípio da derivação numérica: se \(f\) é suave, \(\Delta^kf(x)\approx h^kf^{(k)}(x)\), e com mais precisão \(\Delta^kf(x)=h^kf^{(k)}(\xi)\) para algum \(\xi\) no intervalo dos nós usados.
Fatoriais decrescentes e a base binomial
Para diferenças, o papel da potência \(x^k\) é feito pelo fatorial decrescente \(x^{\underline k}=x(x-1)\cdots(x-k+1)\) (tome \(h=1\)), porque \(\Delta x^{\underline k}=k\,x^{\underline{k-1}}\), exatamente como \(\tfrac{d}{dx}x^k=kx^{k-1}\). Dividindo por \(k!\), os coeficientes binomiais satisfazem \(\Delta\binom xk=\binom x{k-1}\) (regra de Pascal), de modo que \(\binom xk\) está para as diferenças como \(x^k/k!\) está para as derivadas. Em consequência, um polinômio escrito na base \(\binom xk\) tem uma tabela muito simples: \(p(x)=\sum_k a_k\binom xk\) tem \(\Delta^kp(0)=a_k\). Esta é a fórmula de Newton–Gregory, lida como \(a_k=\Delta^ky_0\).
Há também um teorema fundamental do cálculo discreto: \(\sum_{i=0}^{n-1}\Delta y_i=y_n-y_0\). Com \(y_i=\binom i{k+1}\) ele dá \(\sum_{i=0}^{n-1}\binom ik=\binom n{k+1}\), a identidade do taco de hóquei.
2 · As fórmulas de Newton–Gregory
A fórmula progressiva e de onde ela vem
A forma de Newton com espaçamento igual tem \(c_k=f[x_0,\dots,x_k]\), e a indução na recursão das diferenças divididas, cujo denominador agora é \(x_{i+k}-x_i=kh\), dá \(f[x_i,\dots,x_{i+k}]=\Delta^ky_i/(k!\,h^k)\). Além disso \(\prod_{j\lt k}(x-x_j)=h^k\,s(s-1)\cdots(s-k+1)\) para \(x=x_0+sh\), e as potências de \(h\) se cancelam:
É uma fórmula de Taylor discreta: \(\Delta^ky_0\) no lugar de \(h^kf^{(k)}(x_0)\) e \(\binom sk\) no lugar de \(s^k/k!\). Nos nós \(s=0,1,\dots,n\) o binomial \(\binom sk\) vale \(0\) para \(k>s\), de modo que a soma é finita e reproduz \(y_s\) (é \(E^s=(1+\Delta)^s\)). Só são necessárias subtrações para montar a tabela, o que era uma grande ajuda no tempo do cálculo manual. Note que o polinômio de grau \(k\) (os primeiros \(k+1\) termos) é o interpolador dos primeiros \(k+1\) nós: subir o grau acrescenta um termo e não muda nada do que veio antes.
A fórmula regressiva
Parta do último nó: o mesmo polinômio pode ser escrito nos nós \(x_n,x_{n-1},\dots\), e a forma de Newton nessa ordem tem coeficientes \(f[x_n,\dots,x_{n-k}]=\nabla^ky_n/(k!\,h^k)\), onde \(\nabla^ky_n=\Delta^ky_{n-k}\) está na diagonal inferior da tabela. Com \(x=x_n+sh\), o produto \((x-x_n)(x-x_{n-1})\cdots\) vale \(h^k\,s(s+1)\cdots(s+k-1)\), logo
Aqui \(s\) é negativo dentro da tabela. Para \(k\lt n\) os polinômios progressivo e regressivo do mesmo grau são diferentes, construídos com nós diferentes, e cada um é o melhor perto da sua própria ponta. Para \(k=n\) eles coincidem, pois só há um polinômio de grau \(n\) por \(n+1\) pontos.
O termo de erro e a próxima diferença
O erro de interpolação para os primeiros \(k+1\) nós é \(f(x)-p_k(x)=f[x_0,\dots,x_{k},x]\prod_{j\le k}(x-x_j)\), que para espaçamento igual vira
Como \(\Delta^{k+1}y_0\approx h^{k+1}f^{(k+1)}\), o erro é estimado pelo próximo termo da série, \(\binom s{k+1}\Delta^{k+1}y_0\), que é o que o aplicativo mostra em próxima diferença. Na prática: some termos enquanto eles continuarem diminuindo, e pare quando o próximo for tão pequeno quanto você precisa ou, para dados, tão pequeno quanto o ruído. Dentro da tabela \(|\binom s{k+1}|\) é pequeno para \(s\) perto dos nós usados e cresce depressa para \(s\) fora de \([0,k]\): é a razão numérica pela qual extrapolar é perigoso (marque Estender o gráfico para ver).
Um exemplo completo, progressivo e regressivo
Tome \(y=1,2,0,5\) em \(x=0,1,2,3\). As diferenças são \(\Delta y_0=1\), \(\Delta^2y_0=-3\), \(\Delta^3y_0=10\) (diagonal superior) e \(\nabla y_3=5\), \(\nabla^2y_3=7\), \(\nabla^3y_3=10\) (diagonal inferior). Progressiva: \(p(s)=1+s-3\binom s2+10\binom s3\), e em \(x=1{,}5\), \(s=1{,}5\), obtemos \(1+1{,}5-1{,}125-0{,}625=0{,}75\). Regressiva, com \(x=3+s\) e \(s=-1{,}5\): \(p=5+5s+7\binom{s+1}2+10\binom{s+2}3=5-7{,}5+2{,}625+0{,}625=0{,}75\). O mesmo valor, como deve ser: ambos são o cúbico pelos quatro pontos. Digite estes quatro números em Seus dados, com \(x_0=0\) e \(h=1\), e leia a tabela, a fórmula e o cartão de cálculo.
Todas são o mesmo polinômio escrito em outra ordem dos nós: em vez de \(x_0,x_1,x_2,\dots\) usam-se \(x_c,x_{c+1},x_{c-1},x_{c+2},\dots\), em zigue-zague em torno de um nó central \(x_c\). Os coeficientes são então as diferenças ao longo de um caminho horizontal da tabela (escolha diferenças centrais acima). A média das duas fórmulas de Gauss dá a fórmula de Stirling, a melhor para \(|s|\le\tfrac12\) em torno de um nó; a média no ponto médio entre dois nós dá a de Bessel; e a fórmula de Everett usa só diferenças de ordem par dos dois nós que cercam o ponto. Eram o instrumento de trabalho da interpolação de tabelas antes dos computadores, porque os termos diminuem mais depressa quando o ponto está perto do meio dos nós usados. Para derivadas, o valor delas é outro: levam às fórmulas simétricas do grupo 4, cujos termos de erro ímpares desaparecem.
3 · Ruído
Por que as diferenças amplificam o ruído
Suponha que cada \(y_i\) tenha um erro \(\varepsilon_i\) com \(|\varepsilon_i|\le\varepsilon\). Pela fórmula fechada da lição 1, o erro em \(\Delta^ky_i\) é \(\sum_j(-1)^{k-j}\binom kj\varepsilon_{i+j}\), cujo valor absoluto é no máximo \(2^k\varepsilon\), e isso é atingido quando os erros alternam de sinal. Um único valor errado se espalha por \(k+1\) entradas da coluna \(k\) com o padrão \(\pm\binom kj\varepsilon\), e a do meio é cerca de \(2^k\varepsilon/\sqrt{\pi k/2}\). Assim cada coluna da tabela pode perder até um bit, um fator \(2\), e o ruído dos dados é multiplicado por cerca de \(1000\) na décima coluna. Enquanto isso, as diferenças verdadeiras de uma função suave são \(h^kf^{(k)}\), que diminuem depressa quando \(h\) é pequeno. No fim o ruído vence; o cartão As diferenças amplificam o ruído mostra exatamente onde.
Detectando o grau de dados com ruído
Para um polinômio conhecido apenas a menos de erros de tamanho \(\varepsilon\), as colunas da tabela não se anulam, mas se estabilizam no nível do ruído, e daí crescem por um fator entre \(1\) e \(2\) por coluna. Uma regra prática: calcule a tabela; o grau é o índice da última coluna cujas entradas estão claramente acima de \(2^k\varepsilon\); tudo depois é ruído. (É um método antigo, e a base do método das diferenças variadas dos estatísticos.) No aplicativo, a linha dados perturbados se achata e depois cresce por um fator cerca de \(2\); o ponto em que ela deixa a linha limpa é onde a informação acaba. Para dados exatos em ponto flutuante a mesma regra vale com \(\varepsilon\approx10^{-16}\max|y|\), e o aplicativo a usa na frase sob a tabela.
Espaçamento igual, grau alto e o fenômeno de Runge
O polinômio de Newton–Gregory interpola em nós igualmente espaçados, e para \(n\) grande esta é a pior escolha possível de nós: o fator binomial \(\binom s{n+1}\) é enorme perto das pontas, e a interpolação da função de Runge \(1/(1+25x^2)\) diverge (escolha-a no aplicativo, aumente \(n\) e olhe perto das pontas; use a forma regressiva na ponta direita e a progressiva na esquerda, o erro é o mesmo). O remédio não é uma fórmula melhor, mas nós melhores (Chebyshev, veja os aplicativos de Lagrange e de Newton) ou polinômios por partes de grau baixo. Por isso as fórmulas deste aplicativo se usam com \(k\) pequeno, tipicamente de 2 a 5, em poucos nós vizinhos: é assim que se constroem as fórmulas de diferenças finitas para derivadas e as regras de quadratura de Newton–Cotes.
4 · Derivadas numéricas
Do polinômio às fórmulas de derivada
Derive \(p(x_0+sh)=\sum_k\binom sk\Delta^ky_0\) em relação a \(x\), isto é, \(\tfrac1h\tfrac d{ds}\), e ponha \(s=0\). Como \(\tfrac d{ds}\binom sk\big|_{s=0}=\tfrac{(-1)^{k-1}}k\), obtemos \(hf'(x_0)\approx\Delta y_0-\tfrac12\Delta^2y_0+\tfrac13\Delta^3y_0-\cdots\), a série de \(\ln(1+\Delta)\). Truncando depois de \(\Delta^K\) e expandindo as diferenças em termos dos \(y_j\):
Para a segunda derivada eleve a série ao quadrado, \((hD)^2=\Delta^2-\Delta^3+\tfrac{11}{12}\Delta^4-\tfrac56\Delta^5+\cdots\), e obtenha \(\tfrac{y_0-2y_1+y_2}{h^2}\), depois \(\tfrac{2y_0-5y_1+4y_2-y_3}{h^2}\), e assim por diante. A tabela de fórmulas do aplicativo é calculada exatamente por este procedimento, com frações exatas, e os pesos sempre somam \(0\), porque a fórmula deve dar \(0\) para uma função constante. As mesmas fórmulas valem no último nó com \(\nabla\), trocando o sinal das derivadas de ordem ímpar.
Erro de truncamento e ordem
O que foi deixado de fora é o próximo termo da série. Escrevendo \(a_K\) para o coeficiente de \(\Delta^K\) em \(h^mD^m\), a derivada exata menos a fórmula com \(K\) termos vale cerca de \(a_{K+1}h^{K+1-m}f^{(K+1)}\). Para a fórmula progressiva de dois pontos, \(\tfrac{f(x+h)-f(x)}h=f'(x)+\tfrac h2f''(x)+\cdots\), e a ordem é \(1\). Para a de três pontos o erro é \(+\tfrac{h^2}3f'''\): ordem \(2\). As fórmulas centrais são melhores que as primas progressivas porque os termos ímpares se cancelam por simetria: \(\tfrac{f(x+h)-f(x-h)}{2h}=f'(x)+\tfrac{h^2}6f'''(x)+\cdots\) tem ordem \(2\) com apenas duas avaliações, e \(\tfrac{f(x+h)-2f(x)+f(x-h)}{h^2}=f''(x)+\tfrac{h^2}{12}f^{(4)}(x)+\cdots\) tem ordem \(2\) para a segunda derivada. A última coluna da tabela de fórmulas lista estes termos de erro; eles não foram digitados, são calculados a partir dos pesos.
Erro de arredondamento e o melhor passo
Cada valor \(y_j=f(x_j)\) é guardado com um erro relativo de até \(u\approx1{,}1\times10^{-16}\). Uma fórmula com pesos \(w_j\) divide \(\sum w_jy_j\) por \(h^m\), de modo que o erro de arredondamento chega a \(u\,|f|\sum|w_j|/h^m\), que cresce sem limite quando \(h\to0\). O erro total se comporta como \(E(h)\approx Ch^p+\rho/h^m\) com \(\rho\approx u|f|\sum|w_j|\). Ele é mínimo em \(h_*\sim u^{1/(p+m)}\), com \(E(h_*)\sim u^{p/(p+m)}\):
São os formatos em V do gráfico, com os mínimos onde as fórmulas dizem. A lição prática é que um passo menor nem sempre é melhor, e que uma fórmula de ordem mais alta atinge um erro menor e tolera um passo maior. Além disso, a segunda derivada é intrinsecamente mais difícil que a primeira: a mesma aritmética dá apenas metade dos dígitos.
Qual fórmula usar
Dentro da tabela, use uma fórmula central: para o mesmo número de pontos ela tem a mesma ordem da progressiva mas uma constante de erro menor (compare \(\tfrac{h^2}6\) com \(\tfrac{h^2}3\) para \(f'\)), e para \(f'\) o peso do meio é nulo, de modo que duas avaliações bastam para a ordem \(2\), onde a progressiva precisa de três. Nas pontas da tabela só são possíveis fórmulas progressivas (no começo) e regressivas (no fim), e elas precisam de mais um ponto para a mesma ordem. Ordens maiores que 4 raramente valem a pena: os pesos crescem, a amplificação do arredondamento \(\sum|w_j|\) aumenta, e a função precisa ser suave num trecho mais largo. A fórmula central de dois pontos \(\tfrac{f(x+h)-f(x-h)}{2h}\) é o melhor padrão simples, com \(h\approx10^{-5}\) a \(10^{-6}\) vezes a escala de \(x\) em precisão dupla.
Dados com ruído
Quando os valores vêm de medidas, o ruído \(\varepsilon\) não é \(10^{-16}\) mas talvez \(10^{-3}\), e o termo de arredondamento \(\rho/h^m\) é substituído por \(\varepsilon\sum|w_j|/h^m\): com \(h=0{,}1\) e \(m=2\), a segunda derivada por três pontos tem o ruído amplificado por um fator \(4/h^2=400\). Escolha a opção de ruído no gráfico para ver o mínimo se mover para \(h\) maior e para um erro maior. O remédio é não derivar os dados brutos: suavize antes (um ajuste por mínimos quadrados com polinômio de grau baixo ou um spline, veja o aplicativo de mínimos quadrados) e derive o ajuste, ou use um estêncil largo com \(h\) maior.
5 · História
Diferenças antes de Newton: Briggs e as tabelas
As diferenças finitas vieram com os grandes cálculos de tábuas. Henry Briggs, que calculou as primeiras tábuas de logaritmos comuns, usou diferenças para interpolar e descreveu o método na sua Arithmetica logarithmica (1624); suas tábuas eram preenchidas por subtrações e adições repetidas, exatamente como na primeira lição. Os historiadores da interpolação (Meijering 2002, Goldstine 1977) situam o uso de sequências de diferenças entre astrônomos e fazedores de tábuas do início do século XVII, bem antes das fórmulas que levam os nomes de Gregory e Newton.
Gregory e Newton
A fórmula progressiva com coeficientes binomiais aparece numa carta que James Gregory escreveu a John Collins em novembro de 1670, onde é usada para interpolar séries e tábuas. Newton deu a fórmula para espaçamento igual e desigual no Lema V do Livro III dos Principia (1687), no contexto da órbita de um cometa, e tratou o assunto longamente em Methodus differentialis, escrito em 1676 e publicado em 1711. É por isso que a fórmula progressiva se chama fórmula de Newton–Gregory ou Gregory–Newton. A forma regressiva e as centrais (Gauss, Stirling, Bessel, Everett) foram desenvolvidas nos séculos XVIII e XIX.
O cálculo de diferenças finitas
O Methodus incrementorum directa et inversa (1715) de Brook Taylor fez das diferenças finitas um assunto em si mesmo, e contém a série que hoje chamamos de Taylor, obtida como limite da fórmula de Newton quando \(h\to0\). O Methodus differentialis (1730) de James Stirling desenvolveu as fórmulas centrais e o estudo de séries por diferenças. As Institutiones calculi differentialis (1755) de Euler fixaram a notação \(\Delta\) e construíram o cálculo diferencial sobre o finito, e as ideias de operadores desta página (\(E=e^{hD}\), \(\Delta=e^{hD}-1\)) foram sistematizadas no século XIX, culminando no A Treatise on the Calculus of Finite Differences (1860) de George Boole.
Máquinas de diferenças
A lição 3 é a razão das máquinas. Se um polinômio de grau \(d\) tem diferenças de ordem \(d\) constantes, toda a sua tabela pode ser estendida só com adições: ponha a diferença de ordem \(d\) embaixo, some-a à de cima, e assim até \(y\), e repita. Charles Babbage propôs em 1822 uma máquina para fazer isso mecanicamente, imprimindo tábuas livres de erro humano, e os suecos Georg e Edvard Scheutz, pai e filho, construíram máquinas impressoras desse tipo que funcionavam na década de 1850. Funções suaves (logaritmos, senos) eram tabeladas ajustando polinômios de grau baixo em trechos curtos e deixando a máquina rodar sobre as diferenças.
6 · Exercícios
Ache o grau
Monte a tabela de \(2,5,10,17,26,37\) (use Seus dados). Qual coluna é constante? Qual é o polinômio? Resposta: \(\Delta=3,5,7,9,11\) e \(\Delta^2=2,2,2,2\), logo o grau é \(2\) com coeficiente líder \(2/2!=1\). Os valores são \(x^2+1\) em \(x=1,\dots,6\), e a fórmula dá \(p(3{,}5)=13{,}25\) com \(x_0=1\), \(h=1\).
Calcule à mão
Com \(y=1,2,0,5\) em \(x=0,1,2,3\), use a fórmula progressiva para calcular \(p(2{,}5)\), depois a regressiva, e compare com o aplicativo. Resposta: progressiva com \(s=2{,}5\): \(1+2{,}5-3\cdot1{,}875+10\cdot0{,}3125=1\). Regressiva com \(s=-0{,}5\): \(5-2{,}5+7\cdot(-0{,}125)+10\cdot(-0{,}0625)\)\(=1\). As duas dão \(1\). Qual delas tem os termos menores? (A regressiva: \(x\) está perto do fim.)
Deduza a fórmula central para \(f\)
Mostre que \(\tfrac{f(x+h)-2f(x)+f(x-h)}{h^2}=f''(x)+\tfrac{h^2}{12}f^{(4)}(x)+O(h^4)\) expandindo \(f(x\pm h)\) em série de Taylor, e confira no aplicativo que \(\delta^2=\Delta^2E^{-1}\), de modo que \(\delta^2y_i=\Delta^2y_{i-1}\). Dica: os termos ímpares se cancelam, e \(2\tfrac{h^4}{4!}=\tfrac{h^4}{12}\).
O melhor passo por experimento
Tome \(f=e^x\), \(m=1\), e leia no gráfico o melhor passo da fórmula progressiva de dois pontos. Explique o valor com a lição d3, depois acrescente um ruído relativo de \(10^{-8}\) e explique o que muda. Resposta: cerca de \(h_*\approx10^{-8}\) com erro cerca de \(10^{-8}\), pois \(u^{1/2}\approx10^{-8}\); com o ruído \(10^{-8}\) no lugar de \(u\) o melhor passo vai para cerca de \(10^{-4}\) e o erro para cerca de \(10^{-4}\).
Experimente você mesmo em Python
Um script autônomo para a sua fórmula ou tabela de valores igualmente espaçados: monta a tabela de diferenças, calcula os polinômios de Newton–Gregory progressivo e regressivo (e os confere com o polinômio interpolador), mostra o ruído crescendo por um fator próximo de 2 por coluna, calcula os pesos de diferenças finitas para as derivadas com frações exatas e grava o gráfico do erro contra o passo. Precisa de numpy e matplotlib (pip install numpy matplotlib). Mude as configurações no começo e rode de novo.
# Finite differences, the Newton-Gregory polynomial and finite-difference derivatives.
#
# forward: p(x_0 + s h) = sum_k binom(s, k) Delta^k y_0 (s = (x - x_0) / h)
# backward: p(x_n + s h) = sum_k binom(s + k - 1, k) nabla^k y_n (s = (x - x_n) / h)
# derivative: h D = ln(1 + Delta) = Delta - Delta^2/2 + Delta^3/3 - ...
#
# Needs: pip install numpy matplotlib Run: python finite_differences.py
# Edit the settings just below and run again.
from fractions import Fraction
from math import comb, factorial
import numpy as np
import matplotlib.pyplot as plt
# ------------------------------------------------------------------ settings: play with these
SOURCE = "function" # "function": y_i = f(x_i) or "data": your own values below
def f(x): # any numpy expression of x
return np.exp(x)
X0, H, N = -1.0, 0.25, 8 # nodes x_i = X0 + i H, i = 0..N (the data list sets N when SOURCE = "data")
DATA = [1, 2, 0, 5, 4.5, 8]
K = 3 # degree used in the plot of the polynomial
EVAL_AT = -0.6 # point where both formulas are evaluated
NOISE = 1e-3 # size of the disturbance in the noise experiment (alternating signs: the worst case)
DERIVATIVE_ORDER = 1 # 1 or 2: the derivative in the step experiment
SAVE = True
# ------------------------------------------------------------------
def difference_table(y):
"""T[k][i] = Delta^k y_i; T[k] has N + 1 - k entries."""
T = [np.array(y, dtype=float)]
for _ in range(len(y) - 1):
T.append(np.diff(T[-1]))
return T
def binom_s(s, k):
"""binom(s, k) for real s."""
b = 1.0
for j in range(k):
b *= (s - j) / (j + 1)
return b
def forward_eval(x, x0, h, T, k):
s = (x - x0) / h
return sum(binom_s(s, j) * T[j][0] for j in range(k + 1))
def backward_eval(x, xn, h, T, k):
n = len(T) - 1
s = (x - xn) / h
return sum(binom_s(s + j - 1, j) * T[j][n - j] for j in range(k + 1))
def lagrange_check(x, xs, ys):
"""The same polynomial from the Lagrange form, to compare (n + 1 nodes, degree n)."""
tot = 0.0
for j in range(len(xs)):
term = ys[j]
for m in range(len(xs)):
if m != j:
term *= (x - xs[m]) / (xs[j] - xs[m])
tot += term
return tot
def forward_weights(m, K):
"""Weights w_j with D^m f(x_0) ~ h^-m sum_j w_j y_j from differentiating the forward polynomial, in exact fractions."""
def binom_poly(k): # coefficients of binom(s, k) in powers of s
c = [Fraction(1)]
for j in range(k):
nc = [Fraction(0)] * (len(c) + 1)
for i, ci in enumerate(c):
nc[i + 1] += ci
nc[i] -= j * ci
c = [q / (j + 1) for q in nc]
return c
w = [Fraction(0)] * (K + 1)
for k in range(m, K + 1):
a_k = binom_poly(k)[m] * factorial(m) # m-th derivative at s = 0
for j in range(k + 1):
w[j] += a_k * (-1) ** (k - j) * comb(k, j)
return w
def central_weights(m, r):
"""Weights on the offsets -r..r from sum_j w_j o_j^q = m! delta_{qm}."""
o = np.arange(-r, r + 1)
A = np.vander(o, increasing=True).T.astype(float)
b = np.zeros(2 * r + 1)
b[m] = factorial(m)
return np.linalg.solve(A, b)
def main():
if SOURCE == "data":
y = np.array(DATA, dtype=float)
n = len(y) - 1
x = X0 + H * np.arange(n + 1)
else:
n = N
x = X0 + H * np.arange(n + 1)
y = f(x)
T = difference_table(y)
print("difference table (column k = Delta^k y_i):")
for k, col in enumerate(T):
print(f" k={k}:", np.array2string(col, precision=6, suppress_small=True, max_line_width=110))
scale = np.max(np.abs(y))
for k in range(1, n + 1):
if np.max(np.abs(T[k])) <= 64 * 2.3e-16 * scale * 2 ** k:
print(f"column {k} vanishes to rounding error: the data are those of a polynomial of degree {k - 1}")
break
# ---- the two formulas against the interpolating polynomial
pf, pb = forward_eval(EVAL_AT, X0, H, T, n), backward_eval(EVAL_AT, x[n], H, T, n)
pl = lagrange_check(EVAL_AT, x, y)
print(f"\nat x = {EVAL_AT}: forward {pf:.12g} backward {pb:.12g} Lagrange {pl:.12g}")
for k in range(n + 1):
print(f" k={k}: forward {forward_eval(EVAL_AT, X0, H, T, k):.10g} backward {backward_eval(EVAL_AT, x[n], H, T, k):.10g}")
# ---- noise: alternating signs give the worst case 2^k
yn = y + NOISE * (-1.0) ** np.arange(n + 1)
Tn = difference_table(yn)
print(f"\nlargest entry of each column, clean / disturbed (noise {NOISE}):")
for k in range(n + 1):
print(f" k={k}: {np.max(np.abs(T[k])):.3e} {np.max(np.abs(Tn[k])):.3e} bound 2^k * noise = {2 ** k * NOISE:.3e}")
# ---- derivative formulas
m = DERIVATIVE_ORDER
print(f"\nforward formulas for the derivative of order {m}:")
for kk in range(m, m + 5):
w = forward_weights(m, kk)
den = np.lcm.reduce([q.denominator for q in w])
print(f" {kk + 1} points: (1/({den} h^{m})) * {[int(q * den) for q in w]}")
print("central formulas:")
for r in (1, 2, 3):
w = central_weights(m, r)
print(f" {2 * r + 1} points:", np.round(w, 8))
# ---- plots
fig, ax = plt.subplots(1, 3, figsize=(15, 4.2))
xs = np.linspace(x[0], x[n], 500)
if SOURCE == "function":
ax[0].plot(xs, f(xs), "k", label="f")
ax[0].plot(xs, [forward_eval(t, X0, H, T, K) for t in xs], "r", label=f"forward, degree {K}")
ax[0].plot(xs, [backward_eval(t, x[n], H, T, K) for t in xs], "b--", label=f"backward, degree {K}")
ax[0].plot(x, y, "o", color="gray")
ax[0].legend(); ax[0].set_title("Newton-Gregory polynomials")
ks = np.arange(n + 1)
ax[1].semilogy(ks, [max(np.max(np.abs(c)), 1e-17) for c in T], "o-", label="clean")
ax[1].semilogy(ks, [max(np.max(np.abs(c)), 1e-17) for c in Tn], "o-", label="disturbed")
ax[1].semilogy(ks, 2.0 ** ks * NOISE, "k--", label="2^k noise")
ax[1].set_xlabel("k"); ax[1].set_title("largest |difference| in column k"); ax[1].legend()
if SOURCE == "function":
hs = 10.0 ** np.linspace(-12, -0.5, 200)
hr = 0.005 * max(abs(n * H), 1e-3)
wr = central_weights(m, 6)
ref = sum(wr[j + 6] * f(X0 + j * hr) for j in range(-6, 7)) / hr ** m
for kk in range(m, m + 4):
w = [float(q) for q in forward_weights(m, kk)]
err = [abs(sum(w[j] * f(X0 + j * h) for j in range(kk + 1)) / h ** m - ref) for h in hs]
ax[2].loglog(hs, err, label=f"forward, order {kk + 1 - m}")
for r in (1, 2):
if 2 * r + 1 >= m + 2:
w = central_weights(m, r)
err = [abs(sum(w[j + r] * f(X0 + j * h) for j in range(-r, r + 1)) / h ** m - ref) for h in hs]
ax[2].loglog(hs, err, "--", label=f"central, order {2 * r}")
ax[2].set_xlabel("h"); ax[2].set_ylabel("|error|"); ax[2].set_title(f"derivative of order {m} at x0"); ax[2].legend()
plt.tight_layout()
if SAVE:
plt.savefig("finite_differences.png", dpi=130)
plt.show()
if __name__ == "__main__":
main()
Referências: J. Meijering, A chronology of interpolation: from ancient astronomy to modern signal and image processing, Proc. IEEE 90 (2002) 319–342; H. H. Goldstine, A History of Numerical Analysis from the 16th through the 19th Century, Springer 1977; G. Boole, A Treatise on the Calculus of Finite Differences, 1860; F. B. Hildebrand, Introduction to Numerical Analysis, 2ª ed., McGraw-Hill 1974 (capítulos 3 e 4); B. Fornberg, Generation of finite difference formulas on arbitrarily spaced grids, Math. Comp. 51 (1988) 699–706; N. J. Higham, Accuracy and Stability of Numerical Algorithms, 2ª ed., SIAM 2002; I. Newton, Principia, Livro III, Lema V, e Methodus differentialis (1711).
Espirais de Ulam, de Sacks e de girassol, linhas de qualquer largura e cores por resto ou número de fatores: veja por que os primos se alinham em diagonais quadráticas e clique em um número para achar o polinômio que passa por ele.
Troque o integrando por um polinômio que passa por pontos igualmente espaçados e integre o polinômio: isso é uma regra de Newton–Cotes. Este aplicativo mostra a regra do trapézio, a regra 1/3 de Simpson e a regra 3/8 de Simpson, cada uma simples (um painel) ou composta (vários painéis), desenhadas sobre a função. Ele informa o erro, confere-o com o termo de erro, mede a ordem de convergência e mostra quais polinômios cada regra integra exatamente. Segue um curso curto, escrito para caber em duas aulas.
A regra sobre uma função
Painéis e seus polinômios
Pronto
f (integrando)polinômio de cada painelnós
VALOR DA REGRA \(Q\)—
INTEGRAL EXATA \(I\)—
ERRO \(E=I-Q\)—
O erro é E = I − Q, integral exata menos a regra, então sinal negativo significa que a regra superestima.
Em um relance
As três regras compostas e seus termos de erro
Trapézio: qualquer n. Erro de ordem h², envolve f″.
Os números abaixo são recalculados para a regra, a versão, o n e a função escolhidos agora.
Ordem de convergência
Erro contra n, as três regras
Erro absoluto das regras compostas para n = 6, 12, 24, … na função escolhida. Neste gráfico log–log uma reta de inclinação −p significa ordem p.
número de subintervalos n
“ordem” é o log₂ da razão entre erros consecutivos: deve se aproximar de 2 para o trapézio e de 4 para as duas regras de Simpson em uma f suave genérica (uma f de sorte pode ir além: 1/(1 + x²) em [0, 1] dá 6 para Simpson). Valores perto do nível de arredondamento (10⁻¹⁴) são omitidos.
Grau de precisão
Quais potências cada regra integra exatamente?
Erro das regras simples em [0, 1] para f = xᵏ. “exata” significa abaixo de 10⁻¹⁴.
A regra do trapézio é exata até o grau 1, Simpson 1/3 e 3/8 até o grau 3. Simpson 1/3 ganha um grau de graça graças à simetria.
Pesos de Newton–Cotes fechados
n = 1 a 10 subintervalos
Pesos cⱼ com ∫ ≈ h Σ cⱼ f(xⱼ), calculados aqui resolvendo as equações dos momentos. Só a primeira metade é listada (os pesos são simétricos). Linhas coloridas têm pesos negativos.
Σ|c|/n é 1 quando todos os pesos são positivos e cresce quando não são: mede quanto erros de arredondamento em f podem ser amplificados. A partir de n = 8 (exceto n = 9) aparecem pesos negativos.
Curso para duas aulas
Regras de Newton–Cotes, da ideia aos termos de erro
Cinco grupos de lições curtas. Os grupos 1 e 2 formam a primeira aula (ideia, pesos, trapézio); os grupos 3 e 4 formam a segunda (Simpson 1/3 e 3/8, prática); o grupo 5 traz o plano e exercícios com respostas. Todo número citado foi medido com o código que roda nesta página.
1 · A ideia: integrar o polinômio interpolador
Quadratura interpolatória e os pesos
Para integrar \(f\) em \([a,b]\), escolha nós \(x_0,\dots,x_n\), seja \(p_n\) o polinômio de grau \(\le n\) pelos pontos \((x_j,f(x_j))\), e tome \(\int_a^b p_n\) como resposta. Na forma de Lagrange \(p_n=\sum f(x_j)\ell_j\), logo
Os pesos dependem só dos nós, nunca de \(f\). Uma regra de Newton–Cotes fechada usa nós igualmente espaçados \(x_j=a+jh\), \(h=(b-a)/n\), com os extremos incluídos. Substituindo \(x=a+th\) obtém-se \(w_j=h\,c_j\) com \(c_j=\int_0^n\prod_{k\ne j}\frac{t-k}{j-k}\,dt\), um número que se calcula uma vez. O painel “Pesos de Newton–Cotes fechados” os lista: \(n=1\) dá \(\tfrac12,\tfrac12\) (trapézio), \(n=2\) dá \(\tfrac13,\tfrac43,\tfrac13\) (Simpson 1/3), \(n=3\) dá \(\tfrac38,\tfrac98,\tfrac98,\tfrac38\) (Simpson 3/8).
Ligação com o aplicativo anterior: isto é exatamente “integrar o interpolador de Lagrange”. O erro da regra é a integral do erro de interpolação, e é assim que se obtém cada termo de erro abaixo.
Grau de precisão, e o grau grátis da simetria
Uma regra tem grau de precisão \(d\) se é exata para todo polinômio de grau \(\le d\) e não é para algum polinômio de grau \(d+1\). Basta testar nos monômios \(1,x,x^2,\dots\), por linearidade. O painel “Grau de precisão” faz isso em \([0,1]\).
Uma regra interpolatória com \(n+1\) nós tem \(d\ge n\), pois \(p_n=f\) quando \(\deg f\le n\). Para \(n\) par há mais um grau: seja \(m\) o ponto médio de \([a,b]\); os nós são simétricos em torno de \(m\) e os pesos também, logo \(\int (x-m)^{n+1}\) e a regra aplicada a ele se anulam (função ímpar, soma simétrica). Assim
No aplicativo, escolha \(x^3\) em \([0,1]\), Simpson 1/3, simples: o erro é zero (abaixo de \(10^{-16}\)), embora a parábola por três pontos de uma cúbica não seja a cúbica. Para \(x^4\) os erros simples são \(-1/120\approx-8{,}3\cdot10^{-3}\) (Simpson 1/3) e \(-1/270\approx-3{,}7\cdot10^{-3}\) (Simpson 3/8); eles fixarão as constantes dos termos de erro.
2 · A regra do trapézio, simples e composta
A regra do trapézio simples
Com \(n=1\) o interpolador é a corda, e sua integral é a área de um trapézio:
Escolha “Trapézio”, “Simples”, função \(\sin x\) em \([0,\pi]\): a corda é o eixo \(x\), a regra dá \(0\), a integral é \(2\), o erro é \(2\). Um único painel é uma ferramenta grosseira; o objetivo das próximas lições é quantificar o quanto, e curar isso cortando \([a,b]\) em muitos painéis.
Termo de erro do trapézio simples (demonstração)
Seja \(f\in C^2[a,b]\). O erro de interpolação por \(a,b\) é \(f(x)-p_1(x)=\tfrac12 f''(\xi_x)(x-a)(x-b)\). Integrando:
O fator \((x-a)(x-b)\) é \(\le0\) em todo \([a,b]\): não muda de sinal. Então o teorema do valor médio para integrais tira \(f''\) para fora, em algum \(\xi\in(a,b)\):
Lendo: \(f\) convexa (\(f''>0\)) dá \(E<0\), a corda fica acima do gráfico e a regra superestima. Exemplo no aplicativo: \(e^x\) em \([0,1]\), trapézio simples. A regra dá \(1{,}8591\), \(E=-0{,}14086\); a cota é \(e/12=0{,}2265\); resolvendo \(-\tfrac1{12}e^{\xi}=E\) obtém-se \(\xi=0{,}525\), dentro de \((0,1)\), como o teorema promete. O cartão “Termo de erro” refaz tudo isso para o caso escolhido.
O trapézio composto e seu erro
Corte \([a,b]\) em \(n\) painéis de largura \(h=(b-a)/n\) e aplique a regra simples em cada um. Os nós interiores são contados duas vezes e os extremos uma:
Cada painel contribui \(-\tfrac{h^3}{12}f''(\xi_i)\). Somando, \(-\tfrac{h^3}{12}\sum_{i=1}^n f''(\xi_i)\). A média \(\frac1n\sum f''(\xi_i)\) fica entre o mínimo e o máximo da \(f''\) contínua, então pelo teorema do valor intermediário é igual a \(f''(\xi)\) para algum \(\xi\), e com \(nh=b-a\):
\[E=-\frac{(b-a)\,h^2}{12}\,f''(\xi).\]
O erro é de ordem 2: dividir \(h\) por 2 divide o erro por 4. Confira no aplicativo com \(\sin x\) em \([0,\pi]\): para \(n=6,12,24,48\) os erros são \(4{,}59\cdot10^{-2}\), \(1{,}144\cdot10^{-2}\), \(2{,}857\cdot10^{-3}\), \(7{,}14\cdot10^{-4}\), e a tabela de convergência mostra ordem \(2{,}00\). No gráfico log–log é uma reta de inclinação \(-2\).
Por que a cota é pessimista: a expansão de Euler–Maclaurin
A forma do valor médio esconde o comportamento verdadeiro. Para \(f\) suave o erro tem uma expansão em potências pares de \(h\) (Euler–Maclaurin):
Só aparecem os extremos. Duas consequências. Primeiro, o termo principal é \(-\tfrac{h^2}{12}(f'(b)-f'(a))\), que é a integral de \(f''\) disfarçada, então o erro verdadeiro costuma ser um pouco menor que a cota com \(\max|f''|\). Para \(\sin x\) em \([0,\pi]\) o termo principal é \(h^2/6\), que é o erro observado com três dígitos.
Segundo, se \(f\) é periódica (ou só tem derivadas ímpares iguais em \(a\) e \(b\)) todos os termos se anulam e o trapézio converge mais depressa que qualquer potência de \(h\). Para \(e^{\cos x}\) em \([0,2\pi]\) o erro é \(3{,}4\cdot10^{-2}\) com \(n=4\), \(2{,}8\cdot10^{-4}\) com \(n=6\), \(1{,}3\cdot10^{-6}\) com \(n=8\), \(6{,}5\cdot10^{-12}\) com \(n=12\): nada de reta de inclinação \(-2\) aqui. Por isso o trapézio é o método de escolha para integrandos periódicos, e isso prepara o terreno para a quadratura gaussiana, o próximo tópico.
Richardson: o trapézio produz a regra de Simpson
Como \(I-T_n=c_2h^2+c_4h^4+\cdots\) com as mesmas constantes para \(h\) e \(h/2\), a combinação que elimina o termo em \(h^2\) é
\[S=\frac{4\,T_{2n}-T_n}{3}.\]
Escrevendo os pesos nos \(2n+1\) pontos, obtém-se \(\tfrac13(1,4,2,4,\dots,4,1)\) vezes o passo mais fino: esta é a regra de Simpson 1/3 composta. Numericamente, para \(\sin x\) em \([0,\pi]\): \(T_6\) e \(T_{12}\) dão \((4T_{12}-T_6)/3=2{,}0000526243\), idêntico a Simpson 1/3 com \(n=12\). Repetir a ideia no termo em \(h^4\) dá a integração de Romberg. A lição: o trapézio e Simpson são uma só família, e a ordem extra de Simpson vem de cancelar o termo principal da série de Euler–Maclaurin.
3 · As regras de Simpson: 1/3 e 3/8
Regra 1/3 de Simpson: dedução dos pesos
Tome três nós \(m-h,\,m,\,m+h\) (com \(m=\tfrac{a+b}2\), \(h=\tfrac{b-a}2\)) e a parábola por eles. Em vez de integrar polinômios de Lagrange, use o grau de precisão: a regra \(w_0f_0+w_1f_1+w_2f_2\) deve ser exata em \(1\) e em \((x-m)^2\), e por simetria \(w_0=w_2\). Então
Em \(\sin x\) sobre \([0,\pi]\) a regra simples dá \(2{,}0944\) (erro \(-0{,}0944\)) contra \(0\) do trapézio simples: três pontos e um ganho enorme. Geometricamente, integramos uma parábola pelo ponto médio em vez de uma corda.
Termo de erro de Simpson 1/3 (demonstração)
O erro de Lagrange daria \(f'''\), mas a regra tem grau 3, então esperamos \(f^{(4)}\). O truque: seja \(q\) a cúbica com \(q=f\) em \(m-h,m,m+h\) e \(q'(m)=f'(m)\) (Hermite). A regra só enxerga os três valores, então \(Q(f)=Q(q)=\int q\), pois Simpson é exata em cúbicas. Logo \(E=\int(f-q)\), e o erro de Hermite é
Confira com o teste de \(x^4\): \(f^{(4)}=24\), \(h=\tfrac12\): \(-\tfrac{1}{32\cdot90}\cdot24=-\tfrac1{120}\), o valor da tabela de exatidão. Para \(e^x\) em \([0,1]\) a cota é \(\tfrac{e}{90\cdot32}=9{,}4\cdot10^{-4}\) e o erro real é \(-5{,}8\cdot10^{-4}\).
Simpson 1/3 composta: ordem 4
Tome \(n\) par e aplique a regra simples em cada um dos \(n/2\) pares de subintervalos (cada um de largura \(2h\)):
Ordem 4: dividir \(h\) por 2 divide o erro por 16. No aplicativo, \(e^{-x^2}\) em \([0,2]\) com \(n=6,12\): \(4{,}98\cdot10^{-5}\) e depois \(3{,}14\cdot10^{-6}\), razão \(15{,}9\). E a comparação de custo impressiona: para \(\sin x\) em \([0,\pi]\) com \(n=12\), trapézio e Simpson usam os mesmos 13 pontos, mas os erros são \(1{,}1\cdot10^{-2}\) e \(5{,}3\cdot10^{-5}\), um fator de 200.
Simpson 3/8: pesos e termo de erro
Quatro nós, espaçamento \(h=\tfrac{b-a}3\), interpolador cúbico. A simetria dá \(w_0=w_3\), \(w_1=w_2\). Com \(m\) o ponto médio os nós são \(m\pm\tfrac{3h}2,\ m\pm\tfrac h2\). Exatidão em \(1\) e \((x-m)^2\):
Seu grau de precisão é 3 (não 4: o bônus da simetria vale só para \(n\) par), então \(E=K\,h^5f^{(4)}(\xi)\) com constante de sinal \(-\) (o núcleo de Peano da regra tem sinal constante, fato que citamos). A constante é fixada pelo teste \(f=x^4\): em \([0,1]\) a tabela dá \(E=-\tfrac1{270}\), com \(h=\tfrac13\), \(f^{(4)}=24\), então \(K\,\tfrac1{243}\cdot24=-\tfrac1{270}\), o que dá
\[E=-\frac{3h^5}{80}\,f^{(4)}(\xi).\]
A regra composta exige \(n\) múltiplo de 3, tem coeficientes \(1,3,3,2,3,3,2,\dots,3,3,1\), e erro \(-\tfrac{(b-a)h^4}{80}f^{(4)}(\xi)\) (há \(n/3\) grupos, cada um contribuindo \(-\tfrac{3h^5}{80}f^{(4)}\)).
1/3 ou 3/8? Comparação a custo igual
As duas regras são de ordem 4; as constantes dos erros compostos são \(\tfrac1{180}\) e \(\tfrac1{80}\). Com o mesmo \(n\) (logo o mesmo \(h\) e o mesmo número de avaliações) o erro da 3/8 é \(\tfrac{180}{80}=2{,}25\) vezes maior. Observado com \(\sin x\) em \([0,\pi]\), \(n=12\): \(5{,}26\cdot10^{-5}\) para a 1/3 contra \(1{,}19\cdot10^{-4}\) para a 3/8, razão \(2{,}27\).
Logo, quando \(n\) é par, use a 1/3. A 3/8 se justifica quando \(n\) é ímpar: tome \(n-3\) (par) subintervalos com Simpson 1/3 e os três últimos com Simpson 3/8; a regra combinada tem a mesma ordem. Exemplo: \(n=9\) é uma 3/8 mais três painéis 1/3. As duas regras são também os primeiros membros de um padrão: a regra de Boole (\(n=4\), grau 5) é a próxima com \(n\) par.
4 · Na prática: quantos pontos, funções ásperas, regras maiores
Escolhendo n pela cota de erro
Para garantir \(|E|\le\varepsilon\) resolva a cota para \(n\). Tome \(\int_0^\pi\sin x\,dx\) com \(\varepsilon=10^{-8}\) e \(\max|f''|=\max|f^{(4)}|=1\):
Experimentos diretos mostram o quanto a cota é pessimista: o trapézio atinge \(10^{-8}\) com cerca de \(12\,830\) subintervalos (o termo de Euler–Maclaurin \(h^2/6\) prevê \(\pi/\sqrt{6\cdot10^{-8}}\approx12\,826\)) e Simpson com \(102\). A razão \(16\,075/114\) já diz por que Simpson é a escolha padrão para integrandos suaves. Na prática faz-se também o inverso: dobra-se \(n\) até que dois valores sucessivos concordem na tolerância.
Funções ásperas: quando f'' ou f⁗ não existe
Os termos de erro supõem \(f\in C^2\) ou \(C^4\). Teste o aplicativo em duas funções que violam isso.
\(\sqrt x\) em \([0,1]\): \(f''\) explode em 0, então a cota é infinita. Ordens medidas: \(1{,}46\) a \(1{,}49\) para o trapézio, \(1{,}50\) para as duas regras de Simpson. A singularidade \(x^{1/2}\) no extremo limita toda regra à ordem \(3/2\), e a precisão extra de Simpson é desperdiçada. Remédio: substituir \(x=t^2\) para eliminar a singularidade, ou dividir o intervalo.
\(|x-1/\pi|\) em \([0,1]\): uma quina dentro do intervalo. O erro é irregular porque depende de onde a quina cai em relação aos nós (uma quina exatamente sobre um nó daria uma resposta enganosamente exata, por isso a quina está no irracional \(1/\pi\)). A tabela de convergência mostra ordens que saltam e podem até ficar negativas. A lição: uma regra de ordem alta precisa de suavidade em todo o intervalo; ponha um nó em cada quina, isto é, integre por partes.
A ordem é propriedade do par (regra, função)
As ordens 2 e 4 valem para uma \(f\) suave genérica; funções especiais podem render mais. Tome \(1/(1+x^2)\) em \([0,1]\), cuja integral é \(\pi/4\). O trapézio tem ordem \(2{,}00\), como esperado (\(f'(1)=-\tfrac12\ne0\)). Mas Simpson 1/3 e 3/8 mostram ordem \(6{,}0\): erros \(2{,}2\cdot10^{-7}\), \(3{,}3\cdot10^{-9}\), \(5{,}2\cdot10^{-11}\) para \(n=6,12,24\).
A razão está na série de Euler–Maclaurin de Simpson, cujo coeficiente de \(h^4\) é proporcional a \(f'''(b)-f'''(a)\). Aqui \(f'''(x)=-24x(1-x^2)/(1+x^2)^4\) se anula em \(0\) e em \(1\), então o termo em \(h^4\) some e \(h^6\) lidera. A cota de erro com \(f^{(4)}\) continua verdadeira, só que longe de justa. Consequência prática: estime a ordem a partir dos dados (a tabela de convergência), não confie cegamente no número do livro. De bônus, \(4\,S_6\) com este integrando é \(3{,}14159178\), seis dígitos corretos de \(\pi\) com sete valores da função.
Regras de Newton–Cotes maiores e pesos negativos
Por que parar em painéis de \(n=3\)? Porque as regras fechadas maiores herdam a fraqueza da interpolação em nós igualmente espaçados (o fenômeno de Runge do aplicativo anterior). A tabela de pesos mostra isso. Para \(n=6\) (vizinha de Boole, grau 7) todos os pesos são positivos. A partir de \(n=8\) os pesos mudam de sinal:
e para \(n=10\) o maior peso é \(7{,}14\) e a quantidade \(\sum|c_j|/n\) cresceu de \(1\) para \(3{,}06\) (já é \(1{,}45\) em \(n=8\)). Como \(\sum c_j=n\) sempre, pesos grandes positivos e negativos se cancelam, e qualquer erro de arredondamento em \(f\) é amplificado por esse fator: a regra fica instável. A alternativa estável é o que fizemos: manter uma regra de grau baixo (trapézio, Simpson) e refinar \(h\). A única maneira de obter grau alto sem perder estabilidade é abandonar os nós igualmente espaçados, assunto da próxima aula, a quadratura gaussiana.
5 · Plano das duas aulas e exercícios
Plano das duas aulas
Aula 1: da interpolação ao trapézio.
Lições 1.1–1.2: quadratura interpolatória, pesos \(w_j=\int\ell_j\), grau de precisão, bônus da simetria (abra os painéis de pesos e de exatidão).
Lições 2.1–2.3: trapézio simples, demonstração do erro com o teorema do valor médio para integrais, regra composta e ordem 2. No aplicativo: seno, trapézio, simples e depois composta, leia a ordem na tabela de convergência.
Se sobrar tempo, 2.4 (Euler–Maclaurin e funções periódicas) como observação.
Aula 2: Simpson e prática.
Lições 3.1–3.3: Simpson 1/3, a demonstração de Hermite de \(-h^5f^{(4)}/90\), composta de ordem 4. A lição 2.5 (Richardson) liga com a primeira aula.
Lições 3.4–3.5: Simpson 3/8, comparação a custo igual, a combinação para \(n\) ímpar.
Lições 4.1–4.4 como discussão: escolha de \(n\), funções ásperas (\(\sqrt x\), a quina), a afortunada \(1/(1+x^2)\), pesos negativos como ponte para a quadratura gaussiana.
Exercícios, com respostas
Deduza os pesos \(\tfrac38,\tfrac98,\tfrac98,\tfrac38\) resolvendo as equações dos momentos para \(1,x,x^2,x^3\) em \([0,3]\). Resposta: o sistema é o do painel de pesos; a solução é \(c=(\tfrac38,\tfrac98,\tfrac98,\tfrac38)\) em unidades de \(h\), somando \(3\).
Para \(\int_0^1e^x\,dx\) com o trapézio composto e \(n=10\), dê a cota e compare com o aplicativo. Resposta: cota \(e/1200=2{,}27\cdot10^{-3}\); real \(-1{,}43\cdot10^{-3}\). Com Simpson 1/3, \(n=10\): cota \(e/(180\cdot10^4)=1{,}51\cdot10^{-6}\); real \(-9{,}5\cdot10^{-7}\).
Mostre que Simpson 1/3 integra \(x^3\) exatamente em qualquer \([a,b]\). Resposta: escreva \(x^3=(x-m)^3+3m(x-m)^2+3m^2(x-m)+m^3\); as potências ímpares de \(x-m\) se cancelam por simetria e o resto tem grau \(\le2\).
Integre \(e^x\) em \([0,1]\) com \(n=9\) usando Simpson 1/3 nos seis primeiros subintervalos e Simpson 3/8 nos três últimos, e depois o contrário. Resposta: erros \(-2{,}27\cdot10^{-6}\) e \(-1{,}87\cdot10^{-6}\); a 3/8 composta pura com \(n=9\) dá \(-3{,}26\cdot10^{-6}\). Pôr o bloco 3/8 (de erro maior) onde \(f^{(4)}\) é menor, perto de \(x=0\), é melhor.
Explique por que o trapézio com \(n=8\) em \(e^{\cos x}\), \([0,2\pi]\), tem precisão de cerca de \(10^{-6}\) enquanto em \(e^x\), \([0,1]\), precisa de \(n\approx 380\) (trapézio) para o mesmo. Resposta: lição 2.4, periodicidade.
Referências: R. L. Burden e J. D. Faires, Numerical Analysis, capítulo 4; E. Süli e D. Mayers, An Introduction to Numerical Analysis, capítulo 7; K. Atkinson, An Introduction to Numerical Analysis, capítulo 5; P. J. Davis e P. Rabinowitz, Methods of Numerical Integration, Academic Press; J. Stoer e R. Bulirsch, Introduction to Numerical Analysis (Euler–Maclaurin, Romberg).
Cálculo numérico · Newton–Cotes e diferenças finitas
Tipografia ao longo de uma curva
Para compor texto sobre uma curva são precisos dois números por letra: a que distância ao longo da curva ela está (uma integral, o comprimento de arco) e para onde aponta (uma derivada, a tangente). Escolha uma curva, uma regra de Newton–Cotes e uma fórmula de diferenças finitas, e veja as letras se afastarem de suas posições exatas (em cinza) à medida que os erros numéricos crescem.
Bancada
Letras sobre uma curva
posição numéricaposição exata
Comprimento de arco (erro relativo)—
Maior erro de posição—
Maior erro de ângulo—
Subintervalos usados—
Convergência
Comprimento de arco: a ordem da regra
Erro relativo do comprimento da curva inteira em função de \(n\), calculado com a velocidade exata para que apareça só o erro de quadratura. As guias tracejadas têm inclinações \(-2\), \(-4\) e \(-6\). A linha vermelha marca seu \(n\) atual.
Escala log–log; erros abaixo de \(10^{-16}\) estão no piso da precisão dupla.
Derivação
Tangente e curvatura: truncamento contra arredondamento
Erro do ângulo da tangente (ou da curvatura) em função do passo \(h\). Sem ruído aparecem os erros de truncamento \(h\), \(h^2\), \(h^4\); com ruído as curvas sobem para \(h\) pequeno: um passo menor nem sempre é melhor.
Erro quadrático médio em 24 pontos de amostra; a linha vermelha tracejada marca seu \(h\) atual. Na elipse as fórmulas centrais são exatas a menos de arredondamento (veja o Exercício 1).
Em resumo
As fórmulas
Comprimento de arco, ângulo da tangente e curvatura de \(\gamma(t)=(x(t),y(t))\):
Posicionando o glifo \(i\) de largura \(w_i\) (o glifo é girado pela tangente em seu ponto médio):
\[s_i=s_0+\sum_{j\lt i}w_j+\tfrac12w_i,\qquad S(t_i)=s_i\ \ (\text{bisection}),\qquad \text{glyph } i \text{ at } \gamma(t_i),\ \text{rotated by }\theta(t_i)\]
Erros das regras compostas, com passo \(h=(b-a)/n\) e \(g\) a velocidade:
\[\text{sagitta of a straight glyph of width }w:\quad \sigma\approx\frac{w^2\kappa}{8}\]
Ressalvas
Onde as ordens do livro-texto falham
Integrandos periódicos. Quando as derivadas ímpares da velocidade se anulam nas duas extremidades (uma curva fechada e suave, ou meio período da senoide), a regra do trapézio é espectralmente precisa pela fórmula de Euler–Maclaurin e vence Simpson e Boole. Experimente a elipse com o trapézio e compare o comprimento total (excelente) com as posições das letras (nem tanto: os comprimentos parciais \(s(t)\) não são integrais sobre um período inteiro). Num arco aberto como a espiral, as ordens 2, 4, 6 do livro-texto voltam.
Cúspides e velocidade nula. Na cúspide da parábola semicúbica a velocidade \(\lVert\gamma'\rVert=|t|\sqrt{4+9t^2}\) tem uma quina, de modo que o integrando não é suave e as três regras caem para a ordem 2, a menos que um nó caia exatamente na quina. A direção da tangente também se inverte ali, e as letras perto de uma cúspide giram bruscamente. A cardioide tem o mesmo tipo de cúspide nas duas extremidades.
A segunda derivada (opcional). A curvatura \(\kappa=(x'y''-y'x'')/\lVert\gamma'\rVert^3\) diz quanto um glifo reto de largura \(w\) se projeta para fora, cerca de \(w^2\kappa/8\). A correção da flecha a usa e o pente de curvatura a desenha. Mas diferenças segundas perdem metade dos dígitos (erro \(\varepsilon/h^2\), melhor \(h\sim\varepsilon^{1/4}\)): ligue o ruído, troque o gráfico de baixo para curvatura e veja o menor erro subir.
Os motores de composição de verdade também ajustam pares e evitam sobreposições em curvas fechadas. Aqui cada glifo é uma caixa rígida centrada na curva, o modelo mais simples, escolhido para que o que se vê sejam os erros numéricos.
Exercícios
Questões
Tente antes de abrir as respostas.
1. Por que o ângulo da tangente por diferença central na elipse é exato até a precisão de máquina?
A elipse é a imagem afim \((1{,}6\cos t,\ \sin t)\) de uma circunferência. A corda de \(t-h\) a \(t+h\) é \((-3{,}2\sin t\sin h,\ 2\cos t\sin h)\), proporcional a \((-1{,}6\sin t,\ \cos t)\): exatamente a direção da tangente. O que o gráfico mostra é só arredondamento.
2. Por que \(n\) deve ser par para Simpson e múltiplo de 4 para Boole? O que o app faz?
Simpson agrupa os subintervalos de dois em dois (pesos \(1,4,2,\dots,4,1\)) e Boole de quatro em quatro (pesos \(7,32,12,32,14,\dots,7\)). O app arredonda \(n\) para cima até o próximo valor admissível e o mostra como "Subintervalos usados".
3. Equilibre truncamento e arredondamento para achar o melhor passo da diferença central primeira quando os dados têm ruído \(\varepsilon\). Faça o mesmo para a diferença segunda.
Diferença primeira: erro \(\approx h^2M/6+\varepsilon/h\) com \(M=\lVert\gamma'''\rVert\); minimizando, \(h=(3\varepsilon/M)^{1/3}\) e erro da ordem de \(\varepsilon^{2/3}\). Diferença segunda: \(h^2M_4/12+4\varepsilon/h^2\), logo \(h=(48\varepsilon/M_4)^{1/4}\) e erro da ordem de \(\varepsilon^{1/2}\).
4. Para um glifo de largura \(w\) sobre uma circunferência de raio \(R\), compare a direção da corda que une as extremidades do glifo com a tangente em seu início e em seu ponto médio.
A corda tem exatamente a direção da tangente no ponto médio, enquanto a tangente no início difere dela por \(w/(2R)\) radianos. É por isso que o glifo \(i\) é girado por \(\theta(t_i)\) no ponto médio \(s_i\) do arco.
Newton–Cotes fixa os nós e escolhe os pesos. A quadratura gaussiana escolhe os dois, e os melhores nós são as raízes de polinômios ortogonais: com n nós a regra integra exatamente todo polinômio de grau até 2n − 1. Este aplicativo deixa você escolher a família (Legendre, Chebyshev, Laguerre, Hermite), o número de nós e uma função de teste; ele desenha os polinômios e suas raízes, lista nós e pesos, confere o termo de erro, compara com a regra de Simpson e verifica o grau de precisão. Segue um curso curto, escrito para caber em duas aulas.
A regra sobre uma função
Nós, pesos e o polinômio interpolador
Pronto
f (integrando)polinômio pelos nóspeso w(x)nós
VALOR DA REGRA \(Q\)—
INTEGRAL EXATA \(I\)—
ERRO \(E=I-Q\)—
A regra aproxima a integral de f(x)·w(x) no intervalo da família; o gráfico mostra f, não f·w. E = I − Q.
Em um relance
As quatro famílias clássicas
Legendre: peso 1 em [−1, 1]. Qualquer integrando suave.
\[\text{degree of precision }2n-1,\qquad E=\frac{f^{(2n)}(\xi)}{(2n)!}\int w(x)\,\tilde p_n(x)^2\,dx\quad(\tilde p_n\text{ monic})\]
Polinômios ortogonais
Os polinômios e suas raízes
Os polinômios ortonormais pₖ/√hₖ da família escolhida, para os últimos graus até n. As raízes de pₙ (pontos) são os nós da regra; as raízes de pₙ₋₁ (pontos pequenos) ficam estritamente entre elas.
A tabela é a matriz de Gram ⟨pⱼ, pₖ⟩ = ∫ pⱼ pₖ w calculada numericamente: zeros fora da diagonal (ortogonalidade) e os números hₖ = ⟨pₖ, pₖ⟩ na diagonal.
Termo de erro
O que a fórmula do erro diz sobre este caso
Recalculado para a família, o n e a função escolhidos agora. A constante é hₙ/(kₙ²(2n)!), onde kₙ é o coeficiente líder de pₙ.
Convergência
Erro contra o número de nós
Erro absoluto da regra de Gauss para n = 1, …, 24 (escala log). Para Legendre a linha tracejada é a regra de Simpson composta com o mesmo número de avaliações da função (um número ímpar).
número de nós n (avaliações da função)
Para f analítica o erro cai mais depressa que qualquer reta neste gráfico (ele se curva para baixo): convergência geométrica ou melhor. Para funções com quina ou singularidade (|x|, √x, log x) ele cai só como uma potência de n. O piso entre 10⁻¹⁶ e 10⁻¹⁴ é arredondamento.
Nós e pesos
A regra para o n escolhido
Nós xⱼ (raízes de pₙ) e pesos wⱼ, calculados aqui pela fórmula de Christoffel. Todos os pesos são positivos.
Pesos positivos tornam a regra estável: sem cancelamento, ao contrário das regras de Newton–Cotes de ordem alta do aplicativo anterior.
Grau de precisão
Exata até o grau 2n − 1, e não além
Para k = 0, …, 2n + 1: o valor exato de ∫ xᵏ w, o valor da regra e o erro relativo a Σ wⱼ|xⱼ|ᵏ (para poder comparar momentos nulos). Mostrado para n ≤ 10.
A primeira falha é em k = 2n, um grau acima de 2n − 1 (marcado), como a teoria diz. Acima de n = 10 os momentos monomiais de Laguerre e Hermite são mal condicionados demais para a precisão dupla mostrar isso com clareza.
Curso para duas aulas
Polinômios ortogonais e quadratura gaussiana
Cinco grupos de lições curtas. A primeira aula são os grupos 1 e 2 (por que os nós podem ser escolhidos, polinômios ortogonais e suas raízes) mais as lições 3.1 e 4.1; a segunda aula é o resto (termo de erro, Chebyshev, Laguerre, Hermite, prática). Todo número citado foi medido com o código que roda nesta página.
1 · Escolher também os nós
Contando parâmetros: 2n incógnitas, grau 2n − 1
Uma regra \(Q(f)=\sum_{j=1}^n w_jf(x_j)\) para \(\int f\,w\) tem \(2n\) números livres: \(n\) pesos e \(n\) nós. Newton–Cotes fixa os nós e usa só os pesos, e chega ao grau \(n-1\) (ou \(n\)). Se os nós também são livres, podemos exigir exatidão em \(1,x,\dots,x^{2n-1}\), que são \(2n\) equações:
n = 1 (Legendre, \([-1,1]\)): \(w_1=2\) e \(w_1x_1=0\), logo \(x_1=0\): a regra do ponto médio, uma avaliação, grau 1. n = 2: por simetria \(w_1=w_2=1\), e \(2x^2=\mu_2=\tfrac23\) dá \(x=\pm\tfrac1{\sqrt3}=\pm0{,}5774\). Duas avaliações e grau 3, o mesmo que Simpson usa com três. O sistema é não linear nos nós, e por isso as próximas lições precisam de estrutura.
Nenhuma regra faz melhor que \(2n-1\). Tome \(q(x)=\prod_j(x-x_j)^2\), de grau \(2n\): \(q\ge0\), então \(\int q\,w>0\), enquanto \(Q(q)=0\).
O teorema-chave: os nós devem ser raízes de um polinômio ortogonal
Teorema. Sejam \(x_1,\dots,x_n\) distintos, \(\omega(x)=\prod(x-x_j)\), e sejam os pesos os da quadratura interpolatória (\(w_j=\int\ell_jw\)). A regra tem grau de precisão \(\ge2n-1\) se e somente se \(\int\omega\,q\,w=0\) para todo polinômio \(q\) de grau \(\le n-1\).
Demonstração. (⇐) Seja \(\deg f\le2n-1\). Divida: \(f=q\,\omega+r\) com \(\deg q,\deg r\le n-1\). Então \(\int fw=\int q\omega w+\int rw=\int rw\) por ortogonalidade. Do outro lado, \(f(x_j)=r(x_j)\) pois \(\omega(x_j)=0\), logo \(Q(f)=Q(r)=\int rw\), o último passo porque a regra é interpolatória e \(\deg r\le n-1\). (⇒) Tome \(f=q\,\omega\) com \(\deg q\le n-1\), então \(\deg f\le2n-1\): a exatidão dá \(\int q\omega w=Q(q\omega)=0\), pois \(\omega\) se anula nos nós. ∎
Assim o problema de escolher os nós vira: achar o polinômio mônico \(\omega\) de grau \(n\) ortogonal a todos os graus menores, e tomar suas raízes. Esse polinômio é \(p_n\), o \(n\)-ésimo polinômio ortogonal para o peso \(w\).
2 · Polinômios ortogonais e suas raízes
Produto interno, Gram–Schmidt e as quatro famílias
Para um peso \(w>0\) em um intervalo (com momentos finitos) ponha \(\langle f,g\rangle=\int fg\,w\). Aplicando Gram–Schmidt a \(1,x,x^2,\dots\) obtém-se uma única sequência de polinômios mônicos \(p_k\), \(\deg p_k=k\), com \(\langle p_j,p_k\rangle=0\) para \(j\ne k\). Equivalentemente, \(p_k\perp\) todos os polinômios de grau \(\lt k\) (eles geram o mesmo espaço que \(p_0,\dots,p_{k-1}\)).
A tabela de Gram do aplicativo confere isso numericamente: para Legendre a diagonal é \(2,\ 0{,}6667,\ 0{,}4,\ 0{,}2857,\ 0{,}2222\), isto é, \(2/(2k+1)\), e toda entrada fora da diagonal é zero a menos de arredondamento.
A recorrência de três termos (demonstração)
Os polinômios ortogonais satisfazem, para \(p_k\) mônicos,
Demonstração. \(xp_k-p_{k+1}\) tem grau \(\le k\), então \(xp_k=p_{k+1}+\sum_{j\le k}c_jp_j\) com \(c_j=\langle xp_k,p_j\rangle/h_j\). Para \(j\lt k-1\): \(\langle xp_k,p_j\rangle=\langle p_k,xp_j\rangle=0\), porque \(\deg(xp_j)=j+1\lt k\). Só sobrevivem \(j=k\) e \(j=k-1\). ∎
Os coeficientes são explícitos: \(\alpha_k=\langle xp_k,p_k\rangle/h_k\) e \(\beta_k=h_k/h_{k-1}\). Nas normalizações usuais as recorrências são, para Legendre \((k+1)P_{k+1}=(2k+1)xP_k-kP_{k-1}\); Chebyshev \(T_{k+1}=2xT_k-T_{k-1}\); Laguerre \((k+1)L_{k+1}=(2k+1-x)L_k-kL_{k-1}\); Hermite \(H_{k+1}=2xH_k-2kH_{k-1}\). O código desta página avalia as quatro com um só laço; a recorrência é também a melhor forma de calcular \(p_n(x)\) (é barata e estável).
As raízes são reais, simples e estão dentro do intervalo (demonstração)
Afirmação. \(p_n\) tem \(n\) raízes reais distintas, todas no intervalo aberto \((a,b)\).
Demonstração. Sejam \(t_1,\dots,t_m\) os pontos de \((a,b)\) onde \(p_n\) muda de sinal (raízes de multiplicidade ímpar); \(m\le n\). Ponha \(q=\prod_{i\le m}(x-t_i)\). Então \(p_nq\) não muda de sinal em \((a,b)\), logo \(\int p_nq\,w\ne0\). Se \(m\lt n\), a ortogonalidade de \(p_n\) a polinômios de grau \(\lt n\) daria \(0\): contradição. Portanto \(m=n\): as \(n\) raízes são reais, simples e estão em \((a,b)\). ∎
É isto que torna a regra utilizável: os nós são reais, dentro do domínio de integração, nunca repetidos. Veja o gráfico: para Legendre com \(n=4\) as raízes estão em \(\pm0{,}3400\) e \(\pm0{,}8611\), e os nós se aglomeram perto dos extremos de \([-1,1]\) quando \(n\) cresce (experimente \(n=30\)); para Laguerre e Hermite as raízes se espalham em \([0,\approx4n]\) e \([-2\sqrt n,2\sqrt n]\).
Entrelaçamento das raízes e como o código as encontra
Entre duas raízes consecutivas de \(p_n\) há exatamente uma raiz de \(p_{n-1}\), e \(p_{n-1}\) não tem raiz fora de \([x_1,x_n]\): as raízes se entrelaçam. O gráfico mostra: os pontos pequenos (raízes de \(p_{n-1}\)) ficam nos intervalos entre os pontos grandes (raízes de \(p_n\)). Isso segue da identidade de Christoffel–Darboux, ou da recorrência por indução: \(p_{n+1}(t_i)=-\beta_np_{n-1}(t_i)\) em uma raiz \(t_i\) de \(p_n\), então \(p_{n+1}\) e \(p_{n-1}\) têm sinais opostos nas raízes de \(p_n\), o que força uma mudança de sinal de \(p_{n+1}\) em cada intervalo.
Uso prático: para achar todas as raízes de \(p_n\) precisa-se de um intervalo para cada uma. Os intervalos entre as raízes de \(p_{n-1}\), mais os dois intervalos das pontas, são \(n\) intervalos disjuntos, cada um com exatamente uma raiz. O código calcula as linhas de raízes de \(p_1,p_2,\dots,p_n\) sucessivamente e em cada intervalo roda o método de Newton mantido dentro do intervalo (bisseção quando um passo de Newton escapa). Nunca se precisa de chute inicial e nenhuma raiz pode ser perdida ou achada duas vezes, que é a falha usual dos localizadores gerais de raízes polinomiais em grau 20 ou 30.
Com os nós fixados, os pesos são os da quadratura interpolatória, \(w_j=\int\ell_j\,w\), onde \(\ell_j\) é o polinômio de base de Lagrange. Dois fatos:
Positividade. \(\ell_j^2\) tem grau \(2n-2\le2n-1\), então a regra o integra exatamente: \(0\lt \int\ell_j^2w=\sum_kw_k\ell_j(x_k)^2=w_j\), pois \(\ell_j(x_k)=\delta_{jk}\). Todo peso é positivo, e \(\sum w_j=\int w=\mu_0\).
Fórmula de Christoffel. \(w_j=\dfrac{k_n\,h_{n-1}}{k_{n-1}\,p_n'(x_j)\,p_{n-1}(x_j)}\), com \(k_m\) o coeficiente líder de \(p_m\). É o que o código usa, com \(p_n'\) obtido derivando a recorrência. Confira no aplicativo (cartão Nós e pesos): Legendre \(n=3\) dá pesos \(\tfrac59,\tfrac89,\tfrac59\) em \(0,\pm0{,}7746\); Chebyshev dá \(\pi/n\) em todo nó.
Pesos positivos são a diferença profunda em relação a Newton–Cotes de ordem alta (cujos pesos, a partir de \(n=8\), mudam de sinal): sem cancelamento, a regra é numericamente estável para todo \(n\).
O termo de erro (demonstração)
Seja \(f\in C^{2n}\) e seja \(q\) o interpolador de Hermite: grau \(\le2n-1\), \(q(x_j)=f(x_j)\), \(q'(x_j)=f'(x_j)\). A regra só enxerga os valores, então \(Q(f)=Q(q)=\int qw\) (exata, grau \(2n-1\)). Assim \(E=\int(f-q)\,w\), e a fórmula do erro de Hermite é
Formas fechadas: Legendre \(\frac{(b-a)^{2n+1}(n!)^4}{(2n+1)((2n)!)^3}\); Chebyshev \(\frac{2\pi}{2^{2n}(2n)!}\); Laguerre \(\frac{(n!)^2}{(2n)!}\); Hermite \(\frac{n!\sqrt\pi}{2^n(2n)!}\). Para \(n=2\), Legendre: \(E=f^{(4)}(\xi)/135\) em \([-1,1]\). Confira com \(f=x^4\) (\(f^{(4)}=24\)): a regra dá \(2\cdot\tfrac19=\tfrac29\), a integral é \(\tfrac25\), a diferença \(\tfrac8{45}=\tfrac{24}{135}\). ✓. Com \(e^x\): a constante para \(n=2\) é \(1/135\), a cota \(e/135=2{,}0\cdot10^{-2}\), o erro real \(7{,}7\cdot10^{-3}\); para \(n=3\) a constante é \(6{,}35\cdot10^{-5}\) e o erro \(6{,}5\cdot10^{-5}\); o aplicativo imprime ambos, e o valor implícito \(f^{(6)}(\xi)=1{,}03\in[1,e]\).
Convergência, e Gauss contra Simpson
Como os pesos são positivos e \(\sum w_j=\mu_0\), para \(f\) contínua em um intervalo finito e qualquer polinômio \(r\) de grau \(\le2n-1\): \(|I-Q|\le|\int(f-r)w|+|Q(r-f)|\le2\mu_0\max|f-r|\). Escolhendo o melhor \(r\) (Weierstrass), a quadratura de Gauss converge para toda \(f\) contínua, e tão depressa quanto a melhor aproximação polinomial de grau \(2n-1\): geometricamente para funções analíticas. Newton–Cotes não pode prometer isso (pesos negativos).
Números (Legendre, \(e^x\) em \([-1,1]\), mesmo número de avaliações): 3 pontos: Gauss \(6{,}5\cdot10^{-5}\), Simpson \(1{,}2\cdot10^{-2}\); 5 pontos: Gauss \(8{,}2\cdot10^{-10}\), Simpson \(7{,}9\cdot10^{-4}\); com \(n=6\) Gauss já está em \(1{,}6\cdot10^{-12}\), enquanto Simpson com 11 pontos está em \(2{,}1\cdot10^{-5}\). Outro exemplo, do aplicativo de Newton–Cotes: \(\int_0^\pi\sin x\,dx\) com três avaliações: Simpson \(2{,}0944\) (erro \(-0{,}094\)), Gauss–Legendre \(2{,}00139\) (erro \(-1{,}4\cdot10^{-3}\)). Abra o cartão de convergência: a curva de Gauss se curva para baixo mais depressa que qualquer reta, enquanto a de Simpson decai como \(n^{-4}\).
Calculando nós e pesos na prática
Três maneiras de obter a regra para um dado \(n\). (1) Tabelas, boas para \(n\le5\) à mão. (2) O método desta página: raízes de \(p_n\) por Newton protegido dentro dos intervalos de entrelaçamento, pesos pela fórmula de Christoffel. (3) Golub–Welsch (1969): a recorrência diz \(xp_k=p_{k+1}+\alpha_kp_k+\beta_kp_{k-1}\), isto é, os nós são os autovalores da matriz de Jacobi tridiagonal simétrica com diagonal \(\alpha_k\) e fora da diagonal \(\sqrt{\beta_k}\), e \(w_j=\mu_0\,v_{j,1}^2\) onde \(v_{j,1}\) é a primeira componente do autovetor normalizado. É o padrão nas bibliotecas.
Limites da precisão dupla. Os nós e pesos são precisos perto do arredondamento para todo \(n\le30\) aqui (Legendre \(n=20\): \(\sum w_j=2\) a \(4\cdot10^{-14}\)). Os pesos de Laguerre e Hermite decaem super-exponencialmente: para \(n=10\) o menor peso de Laguerre é \(9{,}9\cdot10^{-13}\) no nó \(29{,}9\), e o menor peso de Hermite é \(7{,}6\cdot10^{-6}\). É por isso que a tabela de “grau de precisão” só é mostrada para \(n\le10\): os monômios \(x^k\), \(k\) perto de \(2n\), são uma base ruim e o próprio teste, não a regra, perde dígitos.
4 · Os quatro casos clássicos
Gauss–Legendre
Peso \(1\) em \([-1,1]\); raízes do polinômio de Legendre \(P_n\). Casos pequenos explícitos:
Para \([a,b]\): \(x=\frac{b-a}2t+\frac{a+b}2\), \(\int_a^bf=\frac{b-a}2\sum w_jf(x(t_j))\), e a constante do erro vira \(\frac{(b-a)^{2n+1}(n!)^4}{(2n+1)((2n)!)^3}\) (para \(n=2\): \((b-a)^5/4320\)). É a regra para todo uso com integrandos suaves em intervalo finito. No aplicativo, Legendre, \(e^x\), \(n=1,2,3,4,5\): erros \(3{,}5\cdot10^{-1}\), \(7{,}7\cdot10^{-3}\), \(6{,}5\cdot10^{-5}\), \(2{,}9\cdot10^{-7}\), \(8{,}2\cdot10^{-10}\): cada nó multiplica a precisão por um fator entre \(45\) e \(360\). A função de teste \(x^6\) é exata para \(n\ge4\) (grau \(7\ge6\)) e tem erro \(4{,}6\cdot10^{-2}\) para \(n=3\), que é \(720\cdot6{,}35\cdot10^{-5}\), exatamente o termo de erro, já que \(f^{(6)}=720\).
Gauss–Chebyshev
Peso \((1-x^2)^{-1/2}\) em \([-1,1]\). Aqui as raízes de \(T_n\) são explícitas, porque \(T_n(\cos\theta)=\cos n\theta\):
Por que pesos iguais: com \(x=\cos\theta\), \(\int_{-1}^1\frac{f(x)}{\sqrt{1-x^2}}dx=\int_0^\pi f(\cos\theta)\,d\theta\), e a regra é a do ponto médio em \(\theta\) para a função par e periódica \(f(\cos\theta)\), o caso em que as regras do trapézio e do ponto médio são espectralmente precisas (lição de Euler–Maclaurin do aplicativo de Newton–Cotes). Use-a em integrais com o fator \(1/\sqrt{1-x^2}\), que torna inofensivas as singularidades nos extremos. Exemplo no aplicativo: \(\int_{-1}^1\frac{e^x}{\sqrt{1-x^2}}dx=\pi I_0(1)=3{,}97746326\); \(n=4\) dá \(3{,}97746264\), erro \(6{,}3\cdot10^{-7}\), abaixo da cota \(6{,}09\cdot10^{-7}\cdot e=1{,}7\cdot10^{-6}\); para \(n=2\): nós \(\pm0{,}7071\), valor \(\pi\cosh0{,}7071=3{,}9603\), erro \(1{,}7\cdot10^{-2}\).
Gauss–Laguerre
Peso \(e^{-x}\) em \([0,\infty)\): \(\int_0^\infty e^{-x}f(x)\,dx\approx\sum w_jf(x_j)\), \(E=\frac{(n!)^2}{(2n)!}f^{(2n)}(\xi)\). Para \(n=2\): nós \(2\mp\sqrt2=0{,}5858,\ 3{,}4142\), pesos \(\frac{2\pm\sqrt2}4=0{,}8536,\ 0{,}1464\). A regra tem grau 3: \(\int_0^\infty x^3e^{-x}=6\) é reproduzida (\(5{,}99999\ldots\)) enquanto para \(x^4\) dá \(20\) em vez de \(24\). A função de teste \(x^5\) é exata para \(n\ge3\).
Use-a quando o integrando decai como \(e^{-x}\) vezes algo suave. Para integrar \(\int_0^\infty g\) tome \(f=ge^{x}\), o que só faz sentido se \(g\) já decai pelo menos como \(e^{-x}\). No aplicativo: \(\int_0^\infty e^{-x}\sin x\,dx=\tfrac12\): o erro oscila de sinal e cai a \(-1{,}9\cdot10^{-8}\) para \(n=12\) e \(1{,}5\cdot10^{-11}\) para \(n=16\). Com uma função que tem singularidade no extremo, \(\sqrt x\) (exato \(\sqrt\pi/2\)) ou \(\ln x\) (exato \(-\gamma\)), a convergência é só algébrica: para \(\sqrt x\) o erro é \(1{,}3\cdot10^{-2},\ 4{,}6\cdot10^{-3},\ 1{,}6\cdot10^{-3}\) para \(n=4,8,16\), um fator \(2^{3/2}\) a cada dobra.
Gauss–Hermite
Peso \(e^{-x^2}\) em \((-\infty,\infty)\), \(E=\frac{n!\sqrt\pi}{2^n(2n)!}f^{(2n)}(\xi)\). Casos pequenos:
Os nós são simétricos, então funções ímpares são integradas exatamente para qualquer \(n\). Com \(n=2\): \(\int x^2e^{-x^2}=\tfrac{\sqrt\pi}2\) é exata (grau 3), \(x^4\) dá \(0{,}4431\) contra \(\tfrac{3\sqrt\pi}4=1{,}3293\). Teste \(x^6\) (exato \(\tfrac{15\sqrt\pi}8\)): erro \(1{,}33\) para \(n=3\), zero para \(n\ge4\). Exemplo com função transcendente: \(\int e^{-x^2}\cos x\,dx=\sqrt\pi\,e^{-1/4}=1{,}38038845\); os erros para \(n=4,6,8\) são \(5{,}9\cdot10^{-5}\), \(3{,}7\cdot10^{-8}\), \(1{,}2\cdot10^{-11}\), e para \(n=12\) nível de arredondamento. Use Gauss–Hermite para esperanças sob uma distribuição normal (com a reescala \(x\mapsto\sqrt2\,x\)), integrais em mecânica quântica e qualquer integrando com fator gaussiano. Para \(1/(1+x^2)\) (exato \(1{,}3433\)) a convergência é lenta e algébrica: os polos em \(\pm i\) estão perto demais do eixo real.
A suavidade decide. Para \(|x|\) em \([-1,1]\) (uma quina no meio) os erros para \(n=2,4,8,16,32\) são \(1{,}5\cdot10^{-1}\), \(4{,}3\cdot10^{-2}\), \(1{,}2\cdot10^{-2}\), \(3{,}0\cdot10^{-3}\), \(7{,}8\cdot10^{-4}\): só ordem \(n^{-2}\), a mesma do trapézio composto. Divida o intervalo na quina e use Gauss em cada pedaço. Para \(1/(1+25x^2)\) os erros são \(3{,}4\cdot10^{-1}\), \(1{,}8\cdot10^{-1}\), \(4{,}1\cdot10^{-2}\), \(1{,}8\cdot10^{-3}\), \(3{,}1\cdot10^{-6}\): Gauss converge aqui (a interpolação em nós equiespaçados não), mas tarde, pois os polos em \(\pm i/5\) estão perto do intervalo.
Oscilação exige nós. Para \(\cos10x\) em \([-1,1]\): \(n=2,4\) são lixo (\(-1{,}85\), \(1{,}63\)), depois \(5{,}3\cdot10^{-3}\) em \(n=8\), \(3{,}8\cdot10^{-5}\) em \(n=10\), \(1{,}6\cdot10^{-13}\) em \(n=16\). Regra prática: cerca de \(\pi\) nós por comprimento de onda antes de começar o regime geométrico.
Gauss composta. Para intervalo longo ou função áspera, corte em painéis e use um \(n\) fixo (3 a 7) em cada um, como Simpson composta mas com ordem \(2n\). Os nós de Gauss não são aninhados, então refinar \(n\to2n\) não reaproveita avaliações; as regras de Gauss–Kronrod e de Clenshaw–Curtis resolvem isso e são o que as bibliotecas adaptativas usam.
Escolha a família pelo peso, não pelo intervalo. Se o integrando é \(e^{-x^2}g(x)\) com \(g\) suave, Gauss–Hermite com \(f=g\) é exponencialmente melhor que truncar a integral e usar Legendre.
Plano das duas aulas
Aula 1: por que os nós são raízes de polinômios ortogonais.
1.1–1.2: contagem de parâmetros, grau \(2n-1\), o teorema da ortogonalidade (a demonstração é curta e é o coração do assunto).
2.1–2.4: produto interno, Gram–Schmidt, recorrência de três termos, raízes reais e simples, entrelaçamento. No aplicativo: mude \(n\) e observe as raízes e os pontos pequenos; leia a tabela de Gram.
3.1 (pesos, positividade) e 4.1 (Gauss–Legendre, \(n=2,3\) à mão, depois o aplicativo).
Aula 2: erro, as outras três famílias, prática.
3.2 (demonstração do termo de erro por interpolação de Hermite; reaproveite a demonstração de Simpson da aula anterior), 3.3 (convergência e Gauss contra Simpson no cartão de convergência).
4.2–4.4: Chebyshev (nós explícitos), Laguerre, Hermite: para cada uma, o peso, um cálculo explícito com \(n=2\) e um experimento no aplicativo.
3.4 e 5.1 como discussão: Golub–Welsch, Gauss composta, funções ásperas.
Exercícios, com respostas
Deduza a regra de Gauss–Legendre com \(n=2\) a partir das quatro equações de momentos. Resposta: \(w_1=w_2=1\), \(x=\pm1/\sqrt3\) (lição 1.1).
Mostre que ela não é exata para \(x^4\) e calcule o erro de duas maneiras. Resposta: \(\int x^4=\tfrac25\), \(Q=\tfrac29\), \(E=\tfrac8{45}\); a fórmula dá \(24/135=\tfrac8{45}\).
Estime \(\int_0^\pi\sin x\,dx\) com Gauss–Legendre \(n=2\) e \(n=3\) (mude as variáveis para \([-1,1]\)). Resposta: \(1{,}93582\) (erro \(6{,}4\cdot10^{-2}\)) e \(2{,}00139\) (erro \(-1{,}4\cdot10^{-3}\)).
Com a regra de Chebyshev, \(n=2\), estime \(\int_{-1}^1\frac{e^x}{\sqrt{1-x^2}}dx\). Resposta: \(\pi\cosh(1/\sqrt2)=3{,}9603\); o valor exato é \(3{,}97746\), erro \(1{,}7\cdot10^{-2}\).
Verifique que a regra de Laguerre com \(n=2\) é exata para \(x^3\) mas não para \(x^4\). Resposta: \(0{,}8536\cdot0{,}5858^3+0{,}1464\cdot3{,}4142^3=6\); para \(x^4\) dá \(20\neq24\).
Mostre que Gauss–Hermite com \(n=2\) integra \(x^2e^{-x^2}\) exatamente. Resposta: \(2\cdot\tfrac{\sqrt\pi}2\cdot\tfrac12=\tfrac{\sqrt\pi}2\).
Prove que nenhuma regra de quadratura com \(n\) nós é exata para todos os polinômios de grau \(2n\). Resposta: \(q=\prod(x-x_j)^2\) (lição 1.1).
Referências: R. L. Burden e J. D. Faires, Numerical Analysis, seções 4.7 e 8.2; E. Süli e D. Mayers, An Introduction to Numerical Analysis, capítulo 9; K. Atkinson, An Introduction to Numerical Analysis, seção 5.3; P. J. Davis e P. Rabinowitz, Methods of Numerical Integration, capítulos 2–3; G. Szegő, Orthogonal Polynomials, AMS; G. H. Golub e J. H. Welsch, Calculation of Gauss quadrature rules, Math. Comp. 23 (1969) 221–230; L. N. Trefethen, Is Gauss quadrature better than Clenshaw–Curtis?, SIAM Review 50 (2008) 67–87.
Uma seção transversal do tabuleiro de uma ponte pênsil com pendurais que só puxam, integrada com Euler, Heun ou Runge–Kutta. Empurre-a com uma rajada vertical e veja se o tabuleiro só sobe e desce ou começa a torcer; depois veja como o passo e o método decidem se a resposta merece confiança.
Simulação
Uma seção do tabuleiro sob uma rajada vertical
pronto
tempo (s)0
deslocamento \(y\) (m)—
torção \(\theta\) (°)—
pendurais E / D—
maior torção \(\max|\theta|\) (°)—
A metade direita é uma ilustração: o modelo tem uma única seção, e a forma do vão (torção com nó no meio, deslocamento sem nó) é suposta. O deslocamento \(y\) é positivo para baixo; a torção \(\theta\) é positiva quando a borda direita desce. As linhas tracejadas marcam o limiar de torção \(\theta = 0{,}1\) rad.
Retrato de fase
Torção contra taxa de torção
A trajetória de \((\theta,\dot\theta)\). Uma elipse pequena é uma oscilação pequena do modo de torção; uma volta larga indica que o tabuleiro balança por ângulos grandes. O ponto laranja é o estado atual.
Horizontal: \(\theta\) (rad). Vertical: \(d\theta\)/dt (rad/s). Estão desenhadas as últimas 1500 amostras (\(75\,\mathrm{s}\) de tempo simulado).
Energia
Energia mecânica por metro de tabuleiro
Energia cinética mais a energia armazenada nos pendurais mais a gravitacional, nula em repouso. Sem vento e sem amortecimento ela deve permanecer constante; portanto qualquer deriva é erro do método, não física: experimente os dois experimentos de queda livre.
Unidade: kJ por metro de tabuleiro. A linha tracejada é a energia inicial (mostrada só com o vento desligado). Com vento, a energia entra e sai e não se conserva. A linha vermelha tracejada é a energia de ruptura: o tabuleiro quebra quando a curva a toca.
Vento crítico
Quão forte deve ser a rajada para torcer o tabuleiro?
ainda não calculado
Para cada frequência da rajada a varredura acha a menor intensidade que torce o tabuleiro além de 0,1 rad em \(120\,\mathrm{s}\) simulados: uma busca crescente numa grade geométrica, depois bisseção. Ela usa o método, o passo, o amortecimento, a rigidez e a opção de afrouxar que você escolheu; rode de novo depois de mudar qualquer um deles.
frequência da rajada \(\mu / \omega_y\) (eixo vertical: \(\varepsilon_{\mathrm{crit}}\) em \(\mathrm{m/s^2}\), logarítmico, de 0,01 a 10)
Um ponto cinza no topo significa nenhuma torção até \(\varepsilon = 8\,\mathrm{m/s^2}\). Com os pendurais sempre esticados todos os pontos são cinza: o modelo linear nunca torce. A curva é irregular de propósito: a resposta não é monótona em \(\varepsilon\), então a bisseção acha um limiar, não o único.
Passo
Erro contra o passo
Uma trajetória de queda livre (sem vento, sem amortecimento, \(2\,\mathrm{s}\)) é calculada com cada método em sete passos e comparada com RK4 em \(h=0{,}0001\,\mathrm{s}\). O erro é o maior entre o erro do deslocamento e o da elevação da borda, em metros. Num gráfico log-log uma reta de inclinação \(p\) significa erro ∝ \(h^p\).
passo \(h\) (s), logarítmico. Contínuo: pendurais sempre esticados (suave). Tracejado: os pendurais afrouxam e voltam a esticar (quinas).
método
ordem esticados
ordem frouxos
erro esticados
erro frouxos
As ordens são inclinações de mínimos quadrados nos quatro menores passos; as duas colunas de erro são em \(h=0{,}036\,\mathrm{s}\), em metros. A troca liga/desliga dos pendurais deixa o lado direito apenas contínuo, não suave, e a ordem efetiva do RK4 cai de 4 para cerca de 2,4 aqui, e fica irregular.
Estabilidade
O método mantém limitada uma oscilação pura?
Aplique um método a uma oscilação sem amortecimento de frequência \(\omega\). Cada passo multiplica a amplitude por |R(z)|, com \(z = \omega h\). Qualquer valor acima de 1 cresce sem limite. Seus dois modos de vibração, torção e deslocamento vertical, são os pontos para o método e o passo escolhidos.
\(z = \omega h\). Linhas tracejadas: |R| = 1 e o limite do RK4, \(z = 2\sqrt{2} \approx 2{,}83\).
História sem enfeite
O que está, e o que não está, modelado aqui
A ponte Tacoma Narrows foi aberta em 1.º de julho de 1940 e caiu em 7 de novembro de 1940 com vento de cerca de 64 km/h (40 mph), depois de meses de oscilações verticais que lhe deram o apelido “Galloping Gertie”. Na última manhã o movimento mudou para uma grande torção do tabuleiro, a cerca de \(0{,}2\,\mathrm{Hz}\).
Muitos livros dizem que a ressonância com o desprendimento de vórtices destruiu a ponte. Os especialistas discordam: a explicação moderna mais comum é o flutter aeroelástico, um movimento autoexcitado em que o próprio vento alimenta a torção, e ainda não há uma descrição universalmente aceita de todos os detalhes. Este aplicativo não modela o flutter.
O que ele modela é outro mecanismo, proposto por Lazer e McKenna: os pendurais puxam mas não empurram, então quando afrouxam as equações do tabuleiro deixam de ser lineares e a força vertical pode alimentar a torção. Se os pendurais de Tacoma realmente afrouxaram é discutido. Os parâmetros aqui dão uma forma plausível, não uma réplica: a frequência de torção do modelo é \(0{,}70\,\mathrm{Hz}\), não os \(0{,}2\,\mathrm{Hz}\) reais.
Em resumo
O modelo e as ferramentas
Alongamento de cada pendural (\(y\) para baixo, \(\theta\) positivo com a borda direita para baixo). A tração só existe quando o pendural está esticado.
Equações do movimento por metro de tabuleiro: uma barra de meia largura \(\ell = 6\,\mathrm{m}\), massa \(m = 2500\,\mathrm{kg/m}\) e momento de inércia \(m\ell^2/3\). Amortecimento \(\delta e\) uma rajada vertical de intensidade \(\varepsilon e\) frequência \(\mu\).
Quatro grupos: a ponte e a história honesta, a matemática do modelo, os métodos numéricos e os experimentos para rodar. Abra uma pergunta, pense e só então leia a resposta.
1. A ponte e a história
O que aconteceu em Tacoma?
A ponte Tacoma Narrows, no estado de Washington, tinha vão principal de 2.800 pés (\(853\,\mathrm{m}\)) e um tabuleiro com apenas cerca de 39 pés (\(12\,\mathrm{m}\)) de largura, esbelto para o comprimento. Foi aberta em 1.º de julho de 1940 e, desde os primeiros dias, balançava com vento moderado. Em 7 de novembro de 1940 as oscilações verticais deram lugar a um grande movimento de torção, com as duas bordas do tabuleiro subindo e descendo em oposição, e em cerca de uma hora o vão principal caiu. Ninguém morreu; um cachorro dentro de um carro foi a única vítima. O vento era de cerca de 64 km/h (40 mph). As fontes divergem em alguns números (relatos antigos dão o dia 10 de novembro), então trate os valores como aproximados.
Foi ressonância?
Não no sentido dos livros-texto. A história popular diz que o vento empurrava na frequência natural da ponte, como uma criança num balanço. Billah e Scanlan (1991) mostraram que livros de física repetiram isso e que não é o que a evidência sustenta. Os vórtices desprendidos pelo tabuleiro tinham frequência bem diferente da frequência de torção que apareceu. A explicação aceita pela maioria dos engenheiros é o flutter aeroelástico: quando o tabuleiro torce, o escoamento do ar ao redor muda de modo a empurrá-lo ainda mais, uma realimentação autoexcitada que se comporta como amortecimento negativo acima de uma velocidade crítica do vento. A ressonância exige um ritmo externo; o flutter cria o seu próprio.
Outros mecanismos foram propostos, e levantamentos publicados afirmam que nenhuma explicação de todos os detalhes é universalmente aceita. Este aplicativo trata de um deles, não do veredito.
Então por que simular pendurais frouxos?
Porque é um exemplo limpo de mecanismo não linear que acopla dois movimentos que a teoria linear mantém separados. Lazer e McKenna (1990) observaram que um cabo estica mas não comprime, então um pendural é uma mola que se desliga quando frouxa. McKenna e Tuama (2001) mostraram num modelo simples que a força vertical pode então criar uma resposta de torção. Críticos, como Green e Unruh, argumentam que os pendurais de Tacoma de fato não afrouxaram e que os parâmetros necessários são irreais. Portanto trate o cartão como um laboratório para o mecanismo e para a numérica, não como reconstituição de 7 de novembro de 1940.
2. A matemática do modelo
De onde vêm as equações?
A seção do tabuleiro é uma barra rígida de meia largura \(\ell\), massa \(m\) por metro. Seu centro desce \(y\) e ela gira \(\theta\), de modo que as bordas esquerda e direita descem \(y\mp\ell\sin\theta\). Cada pendural é alongado por \(f=y_0+y\mp\ell\sin\theta\), em que \(y_0=mg/(2K)\) é o alongamento estático, e puxa com \(K f^{+}\), com \(f^+=\max(f,0)\). Newton para o centro dá \(m\ddot y=-K(f_L^++f_R^+-2y_0)\) mais amortecimento e força externa. Para a rotação, o torque de uma força vertical \(F\) à distância \(\ell\cos\theta\) do centro é \(F\ell\cos\theta\), e o momento de inércia de uma barra em torno do centro é \(\int_{-\ell}^{\ell}(m/2\ell)\,x^2\,dx=m\ell^2/3\). Isso dá a segunda equação do cartão-resumo.
O que acontece se os pendurais nunca afrouxam?
Então \(f^+=f\), e para \(\theta\) pequeno as equações viram \(\ddot y+\delta\dot y+\tfrac{2K}{m}y=\varepsilon\sin\mu t\) e \(\ddot\theta+\delta\dot\theta+\tfrac{6K}{m}\theta=0\): dois osciladores independentes. A força vertical excita só \(y\); a torção \(\theta\) não tem força externa e qualquer torção inicial simplesmente se extingue. Com \(K=8000\,\mathrm{N/m^2} e\) \(m=2500\,\mathrm{kg/m}\), \(\omega_y=\sqrt{2K/m}=2{,}53\) rad/s (período \(2{,}48\,\mathrm{s}\)) e \(\omega_\theta=\sqrt3\,\omega_y=4{,}38\) rad/s (período \(1{,}43\,\mathrm{s}\)). Rode “Mesma rajada, pendurais sempre esticados”: a torção fica em cerca de 0,06°, a semente que lhe demos. A razão \(\sqrt3\) não é coincidência dos números: vem só da geometria, inércia \(m\ell^2/3\) contra duas molas à distância \(\ell\).
Por que o afundamento estático é \(1{,}5\,\mathrm{m}\)?
Em repouso os dois pendurais sustentam o peso: \(2Ky_0=mg\), logo \(y_0=mg/(2K)=2500\cdot9{,}8/16000=1{,}53\) m. Esse número importa para o afrouxamento: um pendural afrouxa quando seu alongamento \(y_0+y\mp\ell\sin\theta\) fica negativo, isto é, quando o centro do tabuleiro sobe mais que \(y_0\) acima da posição de repouso (com \(\theta=0\)), ou antes, quando o tabuleiro está inclinado. Um pendural mais rígido (\(K\) maior) dá \(y_0\) menor, então o afrouxamento ocorre com movimento menor, mas \(\omega_y\) também sobe. Tentativas anteriores com \(K=1000\) deram um afundamento irreal de \(12\,\mathrm{m}\) e torções de dezenas de radianos, por isso o padrão é \(K=8000\).
Como um empurrão vertical faz o tabuleiro torcer?
No modelo esticado o torque é \(-2K\ell^2\sin\theta\cos\theta\) e não depende de \(y\). Com afrouxamento ele passa a ser \(K\ell\cos\theta\,(f_L^+-f_R^+)\). Se o tabuleiro sobe o bastante, os dois pendurais afrouxam e o torque some, liberando a torção da sua mola restauradora. Quando um lado afrouxa antes do outro, o que acontece assim que \(\theta\neq0\), o torque não é simétrico e depende do deslocamento vertical. Assim o movimento vertical muda a rigidez do modo de torção a cada ciclo, e uma rigidez que varia no ritmo certo pode bombear energia numa oscilação (excitação paramétrica, como uma criança que bombeia o balanço ficando de pé e agachando). Essa é uma leitura plausível, não uma prova: os experimentos mostram o que acontece; a matemática de quando é difícil.
Rode “Rajada na frequência vertical, pendurais frouxos” e observe a curva da elevação da borda: uma torção minúscula de 0,06° é amplificada até o limiar de 5,7° e além.
O que diz a curva do vento crítico?
Com RK4 e \(h=0{,}02\) s a varredura dá, por exemplo, \(\varepsilon_{crit}\approx6{,}6\,\mathrm{m/s^2}\) em \(\mu/\omega_y=0{,}6\), 3,2 em 0,8, 0,78 em 1,0, 1,4 em 1,04, 7,4 em 1,08 e nenhuma torção até \(8\,\mathrm{m/s^2}\) de 1,16 em diante. Três lições. Primeira, há um vale perto da frequência vertical, como a ressonância sugere. Segunda, ele é assimétrico: basta uma força menor do lado das baixas frequências que do lado das altas, o que combina com a imagem de uma mola que amolece quando os pendurais afrouxam (uma mola que amolece entra em ressonância em frequência menor quando excitada com força); é uma leitura plausível, não algo que o aplicativo prove. Terceira, a curva é irregular: com acoplamento não linear a resposta não é monótona em \(\varepsilon\), então “o menor \(\varepsilon\) que torce” depende de como se procura. Varremos para cima numa grade geométrica, delimitamos o primeiro cruzamento e fazemos bisseção dentro dele; um limiar escondido entre dois pontos da varredura pode passar despercebido.
3. Métodos numéricos
Por que não usar simplesmente Euler?
O método de Euler transforma \(y''=-\omega^2y\) numa aplicação cuja amplitude cresce a cada passo por \(\sqrt{1+z^2}\), \(z=\omega h\): uma oscilação sem amortecimento espirala para fora qualquer que seja o \(h\). Para o modo de torção com \(h=0{,}02\) s, \(z=0{,}088\) e a amplitude cresce 0,4% por passo, cerca de 21% por segundo simulado, e a energia cerca de 47% por segundo no início. Experimente “Queda livre, sem vento: Euler”: a curva de energia sobe e a linha de status avisa que a energia cresceu sem vento. A mesma trajetória com RK4 e o mesmo \(h\) fica \(a 3\cdot 10^{-4}\) da energia inicial em \(30\,\mathrm{s}\), e Heun \(a 5\cdot 10^{-3}\) (deriva relativa máxima em \(30\,\mathrm{s}\): Euler 4,9, Heun \(4{,}7\cdot 10^{-3}\), RK4 \(2{,}9\cdot 10^{-4}\) com \(h=0{,}02\); com \(h=0{,}005\): 1,1, \(1{,}3\cdot 10^{-4}\), \(1{,}8\cdot 10^{-5}\).
A consequência para o vento crítico: com Euler a varredura devolve limiares próximos de zero em todo lugar, porque o próprio método excita a torção.
Quais são as ordens dos métodos?
Euler tem erro local \(O(h^2)\) e global \(O(h)\); Heun (a regra do trapézio explícita) global \(O(h^2)\); o método clássico de Runge–Kutta global \(O(h^4)\). No cartão do passo, numa trajetória suave (pendurais sempre esticados), as inclinações medidas são 0,95, 2,02 e 4,02. Quando os pendurais ligam e desligam, o lado direito tem quinas, então a expansão de Taylor por trás das provas de ordem falha perto de cada troca: Euler e Heun mantêm aproximadamente sua ordem (0,99 e 2,04), mas o RK4 cai para cerca de 2,4 e sua curva de erro é irregular, dependendo de onde as quinas caem entre os passos. Moral: um método de ordem alta não dá alta precisão num problema não suave; para recuperá-la seria preciso localizar cada instante de troca e reiniciar o integrador ali (tratamento de eventos).
Por que o RK4 explode com um passo enorme?
Para \(y''=-\omega^2y\) um passo de RK4 multiplica o estado por \(R(z)=1-\tfrac{z^2}{2}+\tfrac{z^4}{24}+i\bigl(z-\tfrac{z^3}{6}\bigr)\), \(z=\omega h\), e \(|R|\le1\) apenas para \(z\le2\sqrt2\approx2{,}83\). Com \(h=0{,}7\) s o modo de torção tem \(z=4{,}38\cdot0{,}7=3{,}07\), logo além do limite, e \(|R|=1{,}75\): a oscilação cresce 75% por passo. Rode “RK4 com um passo enorme”: a energia sobe por um fator de várias centenas, embora haja amortecimento e não haja vento. No modelo não linear a torção não cresce sem limite (o torque \(\sin\theta\cos\theta\) satura), então você vê um movimento errático de grande amplitude em vez de um estouro: a curva de energia é o alarme confiável. Abaixo do limite o RK4 é estável e amortece levemente as altas frequências (em \(z=2\) a amplitude perde cerca de 25% por passo), então um passo grande demais também pode fazer uma oscilação real morrer só por amortecimento numérico.
Como sei que a resposta está certa?
Nunca se sabe com certeza; coleta-se evidência. (1) Verifique um caso com resposta conhecida: o modelo esticado tem períodos \(2\pi/\omega_y=2{,}484\) s e \(2\pi/\omega_\theta=1{,}434\) s, e a simulação os reproduz com quatro dígitos. (2) Verifique um invariante: sem vento e sem amortecimento a energia deve ser constante. (3) Divida o passo ao meio e veja se a resposta muda por cerca de \(2^{-p}\); para RK4 em trechos suaves, um fator 16. (4) Compare dois métodos: Heun e RK4 dão os mesmos limiares críticos com três dígitos (0,776 contra 0,78 em \(\mu/\omega_y=1\)), enquanto Euler não, o que diz em qual desconfiar. Concordância não é prova, mas discordância é um aviso certo.
Por que passo fixo e não adaptativo?
Para ensino: com passo fixo, as fórmulas do fator de amplificação e da ordem se aplicam diretamente, e dá para ver como o erro depende de \(h\). Um código de produção usaria um par embutido adaptativo, como Dormand–Prince, para escolher \(h\) a partir de uma estimativa de erro, e um localizador de eventos para pousar exatamente em cada troca frouxo/esticado. Passos adaptativos encolhem sozinhos perto das trocas, que é onde o RK4 de passo fixo perde sua ordem.
4. Experimentos e exercícios
Experimento: rajada contra frequência
Comece com “Rajada na frequência vertical”. Mantenha a intensidade em 1,2 e mova o controle de frequência de 0,90 a 1,10 em passos de 0,02. Em nossas execuções o tabuleiro só torce para \(0{,}94\lesssim\mu/\omega_y\lesssim1{,}04\), chegando a 12° a 22° em dois minutos, e leva cerca de \(25\,\mathrm{s}\) para cruzar o limiar de 5,7° em 1,00. Fora dessa faixa a torção fica na semente. Depois baixe a intensidade para 0,5: nenhuma frequência torce o tabuleiro, e o menor limiar de toda a varredura é \(0{,}78\,\mathrm{m/s^2}\). Compare com a curva do vento crítico (rode a varredura antes): a faixa em que ela fica abaixo de 1,2 é a faixa que você achou.
Exercício: mude a rigidez
Mude \(K\) de 8000 para 2000 e depois para 30000, com a frequência da rajada fixa em 1,0 vez \(\omega_y\). Preveja primeiro: como \(\omega_y\), \(\omega_\theta\) e \(y_0\) variam com \(K\)? (Respostas: \(\omega\propto\sqrt K\), caindo pela metade, para 1,26 e \(2{,}53\,\mathrm{rad/s}\), quando \(K\) é dividido por 4, e \(y_0\propto1/K\), crescendo para \(6{,}1\,\mathrm{m}\).) Depois confira a leitura ao lado do controle. Qual ajuste torce com mais facilidade? Note que o menu de experimentos vai para “Personalizado” e a simulação reinicia, porque mudar \(K\) muda o que significa “repouso”.
Exercício: deduza os fatores de amplificação
Escreva \(y''=-\omega^2y\) como sistema de primeira ordem \(u'=Au\), \(u=(y,y')\), e aplique um passo de cada método. Como \(A\) tem autovalores \(\pm i\omega\), basta aplicar o método à equação escalar de teste \(u'=\lambda u\), \(\lambda=i\omega\). Euler: \(R=1+\lambda h=1+iz\), logo \(|R|=\sqrt{1+z^2}\). Heun: \(R=1+\lambda h+\tfrac12(\lambda h)^2=1-\tfrac{z^2}2+iz\), e \(|R|^2=(1-\tfrac{z^2}{2})^2+z^2=1+\tfrac{z^4}{4}\). RK4: \(R\) é o polinômio de Taylor de \(e^{\lambda h}\) até a ordem 4: \(1+\lambda h+\tfrac{(\lambda h)^2}{2}+\tfrac{(\lambda h)^3}{6}+\tfrac{(\lambda h)^4}{24}\). Mostre que \(|R|=1\) é atingido em \(z=2\sqrt2\) (ali \(R=-\tfrac13-\tfrac{2\sqrt2}{3}i\)) e que perto de \(z=0\), \(|R|^2=1-z^6/72+\ldots\), de modo que o RK4 amortece levemente. Confira com o gráfico.
Exercício: o que um modelo melhor incluiria?
Liste o que o modelo deixa de fora e diga o que mais importaria. Uma lista parcial: a força do vento depende do ângulo de ataque e, portanto, de \(\theta\) e \(\dot\theta\) (isto é o flutter); os cabos e as torres têm movimento próprio; a ponte é uma estrutura longa com muitos modos, não uma seção; os pendurais têm comprimentos e tensões diferentes; o amortecimento não é uma única constante viscosa. Depois decida qual termo novo tornaria o amortecimento \(\delta\) negativo acima de uma velocidade crítica do vento, que é a assinatura do flutter. (Dica: uma força proporcional a \(+\dot\theta\) na equação do torque.)
Referências: Lazer e McKenna, SIAM Review 32 (1990) 537–578. McKenna, American Mathematical Monthly 106 (1999) 1–18. McKenna e Tuama, American Mathematical Monthly 108 (2001) 738–745. Billah e Scanlan, American Journal of Physics 59 (1991) 118–124. Gazzola, levantamento das explicações concorrentes, arXiv:1306.0080. Datas e medidas do colapso de 1940 diferem entre as fontes e são citadas como aproximadas.
Experimente em Python
O mesmo modelo e os mesmos três métodos em um script curto: o teste de energia, as ordens de convergência e o vento crítico numa frequência. Precisa só de numpy.
"""Tacoma Narrows toy model: a deck cross-section on one-sided hangers (Lazer-McKenna / McKenna).
State s = (y, y', theta, theta'); y is the downward heave of the centre, theta > 0 when the right edge is down.
Run: python3 tacoma_bridge.py (needs only numpy; takes a few seconds)"""
import numpy as np
m, K, ell, delta, G = 2500.0, 8000.0, 6.0, 0.15, 9.8
y0 = m * G / (2 * K) # static stretch of each hanger
wy, wt = np.sqrt(2 * K / m), np.sqrt(6 * K / m) # heave and torsion frequencies when the hangers stay taut
def rhs(s, t, eps, mu, d=delta, slack=True):
y, v, th, w = s
fL, fR = y0 + y - ell * np.sin(th), y0 + y + ell * np.sin(th)
if slack:
fL, fR = max(fL, 0.0), max(fR, 0.0) # a hanger pulls but never pushes
return np.array([v,
-(K / m) * (fL + fR - 2 * y0) - d * v + eps * np.sin(mu * t),
w,
3 * K * np.cos(th) * (fL - fR) / (m * ell) - d * w])
def step(method, s, t, h, *a, **k):
f = lambda u, tt: rhs(u, tt, *a, **k)
if method == "euler":
return s + h * f(s, t)
if method == "heun":
k1 = f(s, t); return s + 0.5 * h * (k1 + f(s + h * k1, t + h))
k1 = f(s, t); k2 = f(s + 0.5 * h * k1, t + 0.5 * h); k3 = f(s + 0.5 * h * k2, t + 0.5 * h); k4 = f(s + h * k3, t + h)
return s + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
def energy(s, slack=True):
y, v, th, w = s
fL, fR = y0 + y - ell * np.sin(th), y0 + y + ell * np.sin(th)
if slack:
fL, fR = max(fL, 0.0), max(fR, 0.0)
return 0.5 * m * v**2 + 0.5 * (m * ell**2 / 3) * w**2 + 0.5 * K * (fL**2 + fR**2 - 2 * y0**2) - m * G * y
def run(method, s0, T, h, **k):
s, t = np.array(s0, float), 0.0
for i in range(int(round(T / h))):
s = step(method, s, t, h, **k); t = (i + 1) * h
return s
def max_theta(eps, mu, T=120.0, h=0.02, stop=0.1, method="rk4", slack=True):
s, t, big = np.array([0, 0, 0.001, 0.0]), 0.0, 0.0
for i in range(int(round(T / h))):
s = step(method, s, t, h, eps, mu, slack=slack); t = (i + 1) * h
big = max(big, abs(s[2]))
if not np.isfinite(big) or big > stop:
break
return big
print(f"y0 = {y0:.3f} m, omega_y = {wy:.4f} rad/s (period {2*np.pi/wy:.3f} s), omega_theta = {wt:.4f} rad/s (period {2*np.pi/wt:.3f} s)")
# 1. energy test: free fall, no wind, no damping
s0 = [-2.5 * y0, 0, 0.3, 0]
print("\nenergy drift over 30 s (max |E - E0| / E0), h = 0.02")
for meth in ("euler", "heun", "rk4"):
s, t, worst, E0 = np.array(s0, float), 0.0, 0.0, energy(s0)
for i in range(1500):
s = step(meth, s, t, 0.02, 0.0, 1.0, d=0.0); t = (i + 1) * 0.02
worst = max(worst, abs(energy(s) - E0) / E0)
print(f" {meth:6s} {worst:.2e}")
# 2. orders of convergence against RK4 with h = 1e-4 (T = 2 s)
print("\nconvergence orders (T = 2 s, error = max(|dy|, ell |dtheta|)), taut vs slack-crossing")
for slack in (False, True):
ref = run("rk4", s0, 2.0, 1e-4, eps=0.0, mu=1.0, d=0.0, slack=slack)
for meth in ("euler", "heun", "rk4"):
hs = np.array([2.0 / n for n in (56, 112, 224, 448, 896)])
er = [max(abs(a[0] - ref[0]), ell * abs(a[2] - ref[2]))
for a in (run(meth, s0, 2.0, h, eps=0.0, mu=1.0, d=0.0, slack=slack) for h in hs)]
p = np.polyfit(np.log(hs[-4:]), np.log(er[-4:]), 1)[0]
print(f" {'slack' if slack else 'taut ':5s} {meth:6s} order {p:5.2f}")
# 3. critical wind at one frequency: scan eps upward on a geometric grid, then bisect the first crossing
def critical(ratio, **kw):
grid = 0.02 * (8 / 0.02) ** (np.arange(14) / 13)
for i, e in enumerate(grid):
if max_theta(e, ratio * wy, **kw) > 0.1:
lo, hi = (grid[i - 1] if i else 0.0), e
for _ in range(9):
mid = 0.5 * (lo + hi)
lo, hi = (lo, mid) if max_theta(mid, ratio * wy, **kw) > 0.1 else (mid, hi)
return hi
return None
print("\ncritical gust strength eps (m/s^2) that twists the deck beyond 0.1 rad within 120 s")
for r in (0.8, 1.0, 1.3):
print(f" mu/omega_y = {r}: RK4 {critical(r)}")
print(" mu/omega_y = 1.0, hangers always taut:", critical(1.0, slack=False))
Ponte do Milênio: quando uma multidão entra no mesmo passo
Uma passarela balança um pouco, cada pedestre ajusta o passo ao balanço e, acima de um tamanho crítico de multidão, todos entram no mesmo passo e o balanço cresce. Simule centenas de pedestres sobre um modo da ponte, ache a multidão crítica, depois instale amortecedores e veja o balanço morrer. A mesma página mostra como um resolvedor descuidado pode fabricar um balanço do nada.
Simulação
Uma multidão numa passarela
pronto
tempo (s)0
pedestres na ponte \(n\)—
amplitude do balanço \(A\) (cm)—
em sintonia \(r\)—
multidão crítica \(N_c\)—
balanço final previsto \(A_\ast\) (cm)—
A ponte é um modo lateral visto de cima; o balanço é desenhado exagerado, com 12 cm atingindo a maior curvatura desenhada. O ponto de um pedestre se move de lado com a fase do seu passo; sua cor é a fase em relação à ponte, de modo que uma multidão em sintonia mostra uma só cor. A sintonia \(r\) vale 0 para pedestres em fases aleatórias e 1 para pedestres todos em fase com o balanço. A linha pontilhada do gráfico marca 1 cm. Massa, amortecimento e frequência são números redondos ilustrativos, não medidas da ponte real.
Sincronia
Quanto da multidão está em sintonia
O parâmetro de ordem \(r\) é o comprimento da média dos vetores de fase dos pedestres em relação à ponte. Para pedestres aleatórios é da ordem de \(1/\sqrt{N}\); quando a multidão trava no balanço, sobe em direção a 1. A linha tracejada é a previsão \(r^*\) para o estado final.
tempo (s)
Nem todos os pedestres travam: os de passo natural distante da frequência da ponte continuam à deriva, e por isso \(r\) fica abaixo de 1 e é preciso uma multidão mínima para o balanço se alimentar. A previsão é calculada para a lorentziana truncada realmente usada; por isso \(r^*\) pode chegar a 1/\(Z\), um pouco acima de 1, para multidões enormes, antes de a fórmula deixar de valer.
Bifurcação
A multidão crítica
ainda não rodou
Rode a simulação inteira para 15 tamanhos de multidão, de 0,4 a 1,8 vez a multidão crítica prevista, e desenhe o balanço que cada um atinge. Abaixo do tamanho crítico nada acontece; acima dele o balanço cresce como a raiz de \(N(N - N_c)\).
número de pedestres \(N\)
Cada ponto é uma simulação de \(1500\,\mathrm{s}\) com RK4, \(h=0{,}08\,\mathrm{s}\), com média nos últimos \(150\,\mathrm{s}\), com o amortecimento, a dispersão e a sensibilidade atuais. Os pontos logo acima de \(N_c\) ficam abaixo da curva porque o balanço leva muito tempo para crescer ali: sua taxa de crescimento é cerca de \(\zeta \Omega_0(N/N_c - 1)\), isto é, 0,005 por segundo em \(N = 1{,}1 N_c\).
A correção
Quanto amortecimento basta
ainda não rodou
Fixe a multidão no número ajustado acima e varie, em vez disso, a razão de amortecimento. A multidão crítica é proporcional \(a \zeta\), de modo que o balanço desaparece assim que \(\zeta\) passa de \(N\) dividido pela multidão crítica por unidade de \(\zeta\). Por isso a ponte real foi curada com amortecedores e não com um tabuleiro mais robusto.
razão de amortecimento \(\zeta\) (%)
As mesmas simulações da outra varredura (\(1500\,\mathrm{s}\), RK4, \(h=0{,}08\,\mathrm{s}\)). Com os ajustes iniciais e \(N\) = 250, o amortecimento necessário é \(\zeta = 1{,}75\) %: um pouco menos que o dobro do que a ponte tem. É preciso uma margem de segurança, pois também há multidões maiores que \(N\) e pedestres diferentes balançam em frequências diferentes.
Numérica
Um resolvedor que faz um balanço do nada
Pegue a ponte sozinha, sem pedestres, dê um empurrão de 1 cm e integre \(300\,\mathrm{s}\). O movimento verdadeiro se extingue. Desenhe a amplitude depois de \(300\,\mathrm{s}\) contra o passo \(h\) para três métodos. O Euler explícito injeta energia num oscilador a cada passo e, a menos que \(h\) seja minúsculo, transforma uma ponte amortecida numa que balança sozinha.
passo de tempo \(h\) (s)
\(h\) (s)
Euler
Heun
RK4
Os números são a amplitude após \(300\,\mathrm{s}\) dividida pelo 1 cm inicial; o valor exato é 2,8e-7. Uma razão acima de 1 significa que o método inventou um balanço. O Euler só é estável para \(h < 2\zeta/\Omega_0 = 0{,}004\,\mathrm{s}\), o Heun para \(h < (8\zeta/\Omega_0^3)^{1/3} = 0{,}086\,\mathrm{s}\). O RK4 nunca cresce aqui, mas acima de \(h=0{,}1\,\mathrm{s}\) amortece depressa demais (o valor em \(h=0{,}12\) é a metade do verdadeiro), o que esconderia uma instabilidade real.
A história
O que aconteceu na ponte de Londres
A Ponte do Milênio, uma passarela de aço sobre o Tâmisa, em Londres, foi aberta ao público em junho de 2000. Nos dias de abertura, com multidões sobre ela, começou a balançar de lado, e os pedestres instintivamente alargaram o passo e entraram no ritmo do movimento. Foi fechada depois de dois dias.
Os engenheiros mediram o efeito com testes de multidão e concluíram que, acima de um número crítico de pessoas, a multidão age como amortecimento negativo no modo lateral. A cura foi acrescentar amortecimento, não rigidez: instalaram amortecedores viscosos e amortecedores de massa sintonizada, e a ponte reabriu em fevereiro de 2002.
O modelo desta página é o proposto por Strogatz e colaboradores em 2005: um modo da ponte excitado por pedestres cujo passo responde ao balanço, um problema do tipo Kuramoto. A previsão de que existe um tamanho crítico de multidão, e de que ele cresce na proporção do amortecimento, concorda com o remédio dos engenheiros.
Limites honestos
O que o modelo deixa de fora
Ele tem um só modo da ponte e pedestres que dependem da ponte apenas pela amplitude e fase. Multidões reais não são uniformes ao longo do vão, as pessoas diferem em peso e passo, e a massa dos pedestres também muda a frequência da ponte.
Os números são ilustrativos. A massa modal de 113 t, a frequência de \(0{,}8\,\mathrm{Hz}\), a razão de amortecimento de 1 %, a força \(G=35\) \(N\) por pedestre e a dispersão \(\gamma = 0{,}8\) rad/s são valores redondos na faixa dessas pontes, não medidas da estrutura real; só a sensibilidade \(C = 16\,\mathrm{m}^{-1}\mathrm{s}^{-1}\) é o valor citado no artigo de 2005. A multidão crítica de cerca de 143 é, portanto, uma propriedade desta ponte de brinquedo.
Se os pedestres realmente travam seus passos é tema de debate. Trabalhos posteriores sobre a caminhada, como modelos de pêndulo invertido para cada pedestre, mostram que uma multidão pode alimentar um balanço pela sua resposta ao movimento mesmo sem travamento estrito de fase. Este aplicativo mostra uma explicação, a da sincronização, e não o único mecanismo possível.
Em resumo
O modelo e suas previsões
A ponte é um oscilador amortecido empurrado pela soma das forças laterais dos pedestres:
Quatro grupos: a história, a matemática do modelo, métodos numéricos e experimentos. Abra uma pergunta, pense e depois leia a resposta.
1. A ponte e a história
Por que uma multidão faz a ponte balançar mais?
Andar empurra o tabuleiro de lado com uma força que alterna esquerda e direita uma vez a cada dois passos, a cerca de \(1\,\mathrm{Hz}\), perto das frequências laterais de muitas passarelas. Se os empurrões de pessoas diferentes são aleatórios, eles em grande parte se cancelam e a ponte sente uma força da ordem de \(\sqrt N\). Se as pessoas estão em passo entre si e com o balanço, as forças somam-se até a ordem \(N\) e empurram a ponte em fase com a sua própria velocidade, que é exatamente o que significa amortecimento negativo.
Por que um número crítico de pessoas e não um efeito gradual?
É uma malha de realimentação. Mais balanço faz mais pedestres ajustarem o passo, mais pedestres em passo fazem mais balanço. Se a malha amplifica ou se extingue depende de o empurrão da multidão superar o amortecimento da ponte. Abaixo do limiar qualquer balanço pequeno é amortecido e os pedestres ficam nos seus passos; acima dele a malha dispara até saturar, porque pedestres de passo natural distante do da ponte não conseguem travar. Teste os experimentos “abaixo do crítico” (um empurrão se extingue) e “acima do crítico” (uma semente minúscula cresce em dois minutos).
Por que a correção acrescentou amortecedores em vez de enrijecer a ponte?
A multidão crítica é proporcional ao coeficiente de amortecimento: \(N_c=4\zeta K\gamma/(GC\sin\alpha)\propto B\). Dobrar o amortecimento dobra o limiar. A rigidez entra só por \(K\); triplicar o limiar enrijecendo exigiria três vezes a rigidez, movendo a frequência por um fator \(\sqrt3\), e uma ponte mais rígida continua a ser excitada por uma multidão na própria frequência. Acrescentar amortecimento eleva o limiar diretamente e a baixo custo. No aplicativo, o botão “Instalar amortecedores” leva \(\zeta\) a 3 %, de modo que \(N_c\) vai de 143 a 428 e uma multidão de 250 que balançava tem o balanço levado abaixo de 1 cm em cerca de \(35\,\mathrm{s}\).
2. A matemática
Como o modelo é construído?
Um modo lateral da ponte é um oscilador \(M\ddot X+B\dot X+KX=G\sum\sin\Theta_i\), em que \(\Theta_i\) é a fase do ciclo de balanço do \(i\)-ésimo pedestre e \(G\) a amplitude da força lateral de um pedestre. Cada pedestre obedece a \(\dot\Theta_i=\omega_i+CA\sin(\Psi-\Theta_i+\alpha)\): seu ritmo próprio \(\omega_i\) mais uma atração para a fase \(\Psi\) da ponte, proporcional à amplitude \(A\) da ponte. Com \(X=A\sin\Psi\), \(\dot X=\Omega_0A\cos\Psi\), a amplitude e a fase são calculadas de \(X\) e \(\dot X\) a cada passo. Com \(\alpha=\pi/2\) a força dos pedestres fica um quarto de volta à frente do deslocamento e assim empurra em fase com a velocidade. As \(N+2\) equações são integradas juntas. É um modelo de Kuramoto em que o acoplamento não é fixo, mas carregado pela própria ponte.
De onde vem a multidão crítica?
Procure um estado estacionário com amplitude de balanço \(A\). No referencial que gira com a ponte, um pedestre com dessintonia \(\nu=\omega_i-\Omega_0\) obedece a \(\dot\varphi=\nu-CA\sin\varphi\). Os de \(|\nu|\lt CA\) travam em \(\sin\varphi=\nu/CA\); os demais derivam e, em média, não contribuem para a força. Os travados dão o parâmetro de ordem \(r=\int_{-CA}^{CA}P(\nu)\sqrt{1-\nu^2/(CA)^2}\,d\nu\), e a ponte, excitada na ressonância, tem seu amortecimento equilibrado pela parte da força da multidão em fase com a sua velocidade: \(B\Omega_0A=GNr\sin\alpha\). Para \(A\) pequeno, \(r\approx\tfrac\pi2P(0)\,CA\); substituindo, só há \(A\) não nulo se \(N>N_c=\dfrac{2B\Omega_0}{\pi\,G\,C\,P(0)\sin\alpha}\). Com uma lorentziana, \(P(0)=1/(\pi\gamma)\) e \(N_c=2\gamma B\Omega_0/(GC\sin\alpha)\). Equivalentemente \(N_c=4\zeta K\gamma/(GC\sin\alpha)\), proporcional à razão de amortecimento \(\zeta\).
Por que a lorentziana é conveniente e o que muda o corte?
Para uma lorentziana a integral sai em forma fechada: \(r=(\sqrt{a^2+\gamma^2}-\gamma)/a\) com \(a=CA\). O balanço \(B\Omega_0A=GNr\sin\alpha\) vira então \(\sqrt{a^2+\gamma^2}-\gamma=q\,a^2\), cuja solução é \(a^2=(1-2\gamma q)/q^2\); daí \(A_\ast=\dfrac{G\sin\alpha}{B\Omega_0}\sqrt{N(N-N_c)}\) e \(r_\ast=\sqrt{1-N_c/N}\). Uma lorentziana verdadeira tem caudas que chegam a frequências de caminhada negativas; por isso o aplicativo a corta em \(\pm T=\pm\min(5\gamma,0{,}8\Omega_0)\) e renormaliza; a fração mantida é \(Z=\tfrac2\pi\arctan(T/\gamma)=0{,}874\) nos ajustes iniciais. Tudo acima vale então com \(N_c\) multiplicado por \(Z\), e \(A_\ast\) e \(r_\ast\) divididos por \(Z\), enquanto \(CA_\ast\le T\).
Quão bem a teoria concorda com a simulação?
Com os ajustes iniciais a multidão crítica prevista é \(N_c=142{,}6\). Simulando \(1500\,\mathrm{s}\) e tomando a média dos últimos \(150\,\mathrm{s}\), para \(N=150,175,200,250,300,400\) os balanços são 2,15, 5,15, 7,40, 11,36, 15,09 e 22,31 cm contra os previstos 2,33, 5,28, 7,51, 11,48, 15,23 e 22,49 cm, com diferença de 1 a 8 %; a discrepância é maior perto do limiar, onde o crescimento é lento. O parâmetro de ordem concorda a menos de 0,005 para \(N\ge200\). Ajustando \(A^2/N\) contra \(N\) aos balanços simulados de \(N=175\) a \(300\) e lendo o intercepto, obtém-se \(N_c=143{,}7\), a 1 % da fórmula. Os pedestres são amostrados por quantis, então não há aleatoriedade: as simulações são exatamente reproduzíveis.
3. Métodos numéricos
Por que integrar tudo junto com RK4?
O estado tem \(N+2\) números: deslocamento e velocidade da ponte e \(N\) fases. A parte rápida é a oscilação da ponte em \(\Omega_0\) e das fases dos pedestres nos seus ritmos, tudo dentro de alguns rad/s, e a parte lenta é o crescimento ou decaimento da amplitude ao longo de minutos. Um método de quarta ordem permite que um passo cubra boa fração de um período, de modo que 25 minutos de tempo simulado custam menos de 20 000 passos. O custo por passo é proporcional a \(N\) (quatro avaliações, cada uma um seno por pedestre), então uma simulação com 250 pedestres leva menos de um segundo.
Quão pequeno deve ser o passo?
Dois limites. Para a ponte sozinha, o fator de amplificação por passo de cada método é função de \(z=\Omega_0h\): \(|R|=\sqrt{1+z^2}\) para Euler, \(\sqrt{1+z^4/4}\) para Heun, ambos maiores que 1 para todo \(z>0\), de modo que injetam energia à taxa \(\Omega_0^2h/2\) (Euler) e \(\Omega_0^4h^3/8\) (Heun) por segundo. O amortecimento verdadeiro é \(\zeta\Omega_0\), então um método fabrica um balanço quando sua injeção o supera: \(h>2\zeta/\Omega_0=0{,}004\) s para Euler e \(h>(8\zeta/\Omega_0^3)^{1/3}=0{,}086\) s para Heun. Isso concorda com a tabela acima (o Euler já cresce em \(0{,}004\,\mathrm{s}\), o Heun em \(0{,}09\,\mathrm{s}\)). Para o sistema acoplado com RK4, o erro no balanço final em relação a \(h=0{,}01\) é \(-76\%\) em \(h=0{,}2\), \(-3{,}4\%\) em 0,1, \(-0{,}12\%\) em 0,05 e abaixo de 0,005 % em 0,02.
Por que amostrar os pedestres por quantis?
Frequências aleatórias tornariam cada simulação diferente, e um limiar medido em algumas centenas de pedestres carregaria ruído de vários por cento. Colocar o pedestre \(i\) no quantil \((i+\tfrac12)/N\) da distribuição faz da soma sobre os pedestres uma regra do ponto médio para a integral que define \(r\), de modo que a simulação é determinística e o erro de \(N\) finito é suave. As fases iniciais são uma sequência da razão áurea \(2\pi\{i\varphi\}\), que se espalha uniformemente (o parâmetro de ordem inicial é pequeno), e as duas sequências são embaralhadas para que os primeiros \(n\) pedestres, os que já entraram quando a multidão chega aos poucos, ainda representem toda a distribuição.
4. Experimentos e exercícios
Exercício: ache a multidão crítica por experimento
Escolha o experimento “abaixo do crítico”, aperte “Empurrar a ponte” algumas vezes e veja o balanço morrer. Aumente \(N\) de 10 em 10 e repita. Em que \(N\) um empurrão de 1 cm deixa de morrer e passa a crescer? Como o crescimento perto do limiar é lento, espere alguns minutos de tempo simulado (velocidade \(32\times ) e\) compare com o \(N_c\) previsto na linha de métricas. Depois dobre \(\zeta\) e veja como o limiar se move.
Exercício: o que torna o limiar mais fácil de cruzar?
Rode “Pedestres com passos quase iguais”. A multidão crítica cai de 143 para 54, porque \(N_c\) é proporcional à dispersão \(\gamma\): quando todos caminham naturalmente quase no mesmo ritmo, mais gente está ao alcance da frequência da ponte e uma multidão menor basta. Com os ajustes desse experimento e \(N=100\), o balanço previsto é 4,8 cm e o simulado 4,7 cm. Agora baixe \(C\) para 8 e confira que \(N_c\) dobra: é inversamente proporcional à sensibilidade.
Exercício: o resolvedor que inventa um balanço
Rode “Sem pedestres, Euler explícito”. A ponte está vazia e amortecida, mas a amplitude cresce. Baixe \(h\) para \(0{,}004\,\mathrm{s}\) e veja o crescimento parar; baixe mais e veja o decaimento que deveria estar ali. Troque para Heun com \(h=0{,}1\): também crescimento. Depois troque para RK4. O que um modelo da ponte de Tacoma, uma ponte real cujo comportamento dependia de um amortecimento pequeno, teria dito se o autor tivesse usado Euler explícito?
Referências: Strogatz, Abrams, McRobie, Eckhardt e Ott, “Crowd synchrony on the Millennium Bridge”, Nature 438 (2005) 43–44. Dallard et al., “London Millennium Bridge: pedestrian-induced lateral vibration”, Journal of Bridge Engineering 6 (2001) 412–417. Eckhardt, Ott, Strogatz, Abrams e McRobie, “Modeling walker synchronization on the Millennium Bridge”, Physical Review E 75 (2007) 021110. As datas são as amplamente divulgadas; os parâmetros do modelo do aplicativo são ilustrativos.
Experimente em Python
O mesmo modelo num script curto: a multidão crítica, o balanço simulado e previsto para quatro tamanhos de multidão, o efeito de 3 % de amortecimento e um Euler explícito que fabrica um balanço do nada. Precisa só de numpy.
"""Millennium Bridge toy model (Strogatz, Abrams, McRobie, Eckhardt and Ott, Nature 2005): a bridge mode driven by walkers who adjust their pace to the sway.
Bridge: M X'' + B X' + K X = G sum sin(Theta_i) Walker: Theta_i' = omega_i + C A sin(Psi - Theta_i + alpha), X = A sin Psi, X' = Omega0 A cos Psi.
Run: python3 mb_bridge.py (needs only numpy; takes about ten seconds)"""
import numpy as np
M, f0, zeta, G, C, alpha, gamma = 1.13e5, 0.8, 0.01, 35.0, 16.0, np.pi / 2, 0.8 # illustrative values
Om = 2 * np.pi * f0
B, K = 2 * zeta * M * Om, M * Om**2
T = min(5 * gamma, 0.8 * Om) # the Lorentzian of walking frequencies is cut at +-T
Z = 2 / np.pi * np.arctan(T / gamma) # share of the Lorentzian that is kept
Nc = Z * 2 * gamma * B * Om / (G * C * np.sin(alpha))
print(f"omega0 = {Om:.3f} rad/s, B = {B:.0f} kg/s, Z = {Z:.4f}, critical crowd Nc = {Nc:.1f}")
def walkers(N):
"""natural frequencies at the quantiles of the cut Lorentzian, golden-ratio phases (no random numbers)"""
u = (np.arange(N) + 0.5) / N
w = Om + gamma * np.tan(np.arctan(T / gamma) * (2 * u - 1))
th = 2 * np.pi * ((np.arange(N) * 0.6180339887498949) % 1)
p = (np.arange(N) * 7919) % N, (np.arange(N) * 4973) % N
return w[p[1]], th[p[0]]
def rhs(s, w, zeta=zeta):
X, V, th = s[0], s[1], s[2:]
A, psi = np.hypot(X, V / Om), np.arctan2(X, V / Om)
return np.concatenate(([V, (G * np.sin(th).sum() - 2 * zeta * M * Om * V - K * X) / M], w + C * A * np.sin(psi - th + alpha)))
def rk4(s, w, h, **k):
k1 = rhs(s, w, **k); k2 = rhs(s + h / 2 * k1, w, **k); k3 = rhs(s + h / 2 * k2, w, **k); k4 = rhs(s + h * k3, w, **k)
return s + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
def wobble(N, Tend=1500.0, h=0.08, **k):
"""mean amplitude A (m) and order parameter r over the last 150 s"""
w, th = walkers(N); s = np.concatenate(([1e-3, 0.0], th)); n = round(Tend / h); a = []; r = []
for i in range(n):
s = rk4(s, w, h, **k)
if i * h > Tend - 150 and i % 5 == 0:
A, psi = np.hypot(s[0], s[1] / Om), np.arctan2(s[0], s[1] / Om); a.append(A); r.append(abs(np.exp(1j * (s[2:] - psi)).mean()))
return np.mean(a), np.mean(r)
print("\n crowd A (cm) simulated A (cm) theory r simulated r theory")
for N in (100, 150, 200, 250):
A, r = wobble(N)
At = G / (Z * B * Om) * np.sqrt(N * (N - Nc)) if N > Nc else 0.0
rt = np.sqrt(1 - Nc / N) / Z if N > Nc else 0.0
print(f" {N:5d} {100 * A:12.2f} {100 * At:13.2f} {r:11.3f} {rt:8.3f}")
print("\nthe fix: with zeta = 3 % the critical crowd is", round(3 * Nc, 0), "- a crowd of 250 no longer wobbles")
A, r = wobble(250, zeta=0.03)
print(f" simulated: A = {100 * A:.2f} cm, r = {r:.2f}")
# a bad solver can fake a wobble: the bridge alone (no walkers), explicit Euler
for h in (0.002, 0.004, 0.01):
s = np.array([0.01, 0.0])
for _ in range(round(300 / h)):
d = np.array([s[1], (-2 * zeta * M * Om * s[1] - K * s[0]) / M]); s = s + h * d
print(f"Euler, bridge alone, h = {h}: amplitude after 300 s = {np.hypot(s[0], s[1] / Om):.2e} m (exact decay: {0.01 * np.exp(-zeta * Om * 300):.1e} m)")
Um edifício de vários pavimentos como uma cadeia de massas e molas sobre uma mesa vibratória. Escolha um movimento do solo, deixe os pavimentos plastificarem, enfraqueça o térreo ou coloque o edifício inteiro sobre isoladores, e acompanhe os deslocamentos relativos, os laços de histerese, o espectro de resposta e o balanço de energia. A integração no tempo é o método de Newmark, e a página mostra onde ele falha.
Simulação
O edifício na mesa vibratória
calculando…
Tempo0
Aceleração máx. do solo (g)—
Deslocamento máx. da cobertura (cm)—
Deriva máxima (%)—
Cortante máx. na base—
Erro do balanço de energia—
O edifício é desenhado em relação ao solo, com os deslocamentos ampliados pelo fator da linha de estado. A deriva é o deslocamento entre dois pavimentos dividido pela altura do pavimento, \(3{,}2\,\mathrm{m}\); as cores vão do verde (pequena) ao vermelho (3,5 % ou mais). O cortante na base é dado como fração do peso W.
Espectro de resposta
O que este registro faz com cada período
O espectro dá, para um oscilador de uma massa com período \(T\) e o amortecimento escolhido, a pseudo-aceleração máxima que ele atinge sob este movimento do solo. O edifício tem um oscilador desses por modo: as linhas tracejadas marcam seus três primeiros períodos.
período \(T\) (s)
Modo
\(T\) (s)
Sa (g)
Participação \(\Gamma\)
Massa efetiva (%)
Os modos são os do edifício elástico de base fixa. A pseudo-aceleração é Sa =\(\omega^2\) Sd / g, calculada com o método de Newmark com \(h=0{,}005\,\mathrm{s}\) para 90 períodos.
Histerese
Força em função da deriva em um pavimento
Cada pavimento é uma mola elastoplástica com um pouco de endurecimento. Abaixo da força de escoamento o laço é uma reta e nenhuma energia se perde; acima dela o laço se abre, e sua área é a energia dissipada pelo dano.
deriva (%)
As linhas tracejadas são as forças de escoamento. Com endurecimento cinemático o laço de amplitude A tem área \(4 F_y (A - \delta_y)(1 - r)\), onde \(r=2\,\%\) é a razão de rigidez pós-escoamento.
Análise dinâmica incremental
Deriva máxima em função da intensidade do tremor
não executado
A mesma forma de registro é escalada para dez acelerações máximas, e o edifício é simulado de três modos: base fixa, com o primeiro pavimento fraco e sobre isoladores. As curvas mostram a maior deriva entre pavimentos. Um edifício com um pavimento fraco chega a uma deriva muito maior que a do uniforme sob o mesmo tremor.
aceleração máxima do solo (g)
Usa as configurações do edifício acima, com a resistência do pavimento fraco e o período isolado que você definiu, e o tipo de registro e a semente atuais. A linha vermelha tracejada é a deriva de 4 %, um nível ilustrativo de dano muito severo, não um limite de norma.
O método numérico
Quão grande pode ser o passo?
Para o edifício elástico sacudido na própria frequência, o deslocamento máximo da cobertura de cada método é dividido por uma referência bem fina. A aceleração média de Newmark permanece precisa até o passo ficar comparável ao menor período; a aceleração linear e a diferença central divergem quando \(\omega_{\max}\cdot h\) passa de \(2\sqrt{3} e\) de 2.
passo \(h\) (s, logarítmico)
passo \(h\) (s)
aceleração média
aceleração linear
diferença central
As linhas verticais tracejadas são os dois limites de estabilidade, \(2/\omega_{\max} e 2\sqrt{3}/\omega_{\max}\), para o modo mais alto do edifício como configurado acima. A aceleração média nunca diverge, mas com passos grandes distorce a resposta de alta frequência.
História
Dos registros de movimento forte aos isoladores
Os primeiros registros de acelerógrafos de movimento forte foram feitos no terremoto de Long Beach de 1933, e o registro de El Centro de 1940 virou o movimento de teste padrão. Maurice Biot introduziu o espectro de resposta no início da década de 1930; George Housner o transformou em ferramenta de trabalho nas décadas de 1940 e 1950.
Nathan Newmark publicou sua família de métodos de integração em 1959, e ela continua sendo a ferramenta básica da dinâmica das estruturas. O movimento do solo de ruído filtrado usado aqui é o modelo de Kanai (1957) e Tajimi (1960).
Pavimentos térreos fracos, abertos para lojas ou garagens, desabaram em muitos terremotos, de San Fernando em 1971 a Northridge em 1994 e à Turquia em 2023. O isolamento de base moderno, com apoios de borracha e chumbo inventados por William Robinson na Nova Zelândia nos anos 1970, é o remédio oposto: deixar o solo se mover e manter o edifício parado.
Limites honestos
O que este modelo deixa de fora
É um edifício de cisalhamento: pisos rígidos, colunas que agem como molas horizontais, movimento em uma direção, sem torção, sem efeito P–\(\Delta e\) sem interação solo–estrutura. Edifícios reais têm vigas, nós, paredes e muitas outras formas de falhar.
Os movimentos do solo são sintéticos, escalados até o pico escolhido, e não terremotos registrados. O amortecimento é de Rayleigh a partir da rigidez inicial, o que superestima o amortecimento depois que os pavimentos plastificam. O isolador é uma mola bilinear.
Nada aqui é ferramenta de projeto. As cores da deriva e a linha de 4 % são ilustrações. O que importa é a mecânica e a numérica: modos, espectros, histerese, energia e os limites do integrador.
Em resumo
As fórmulas
Equação do movimento (deslocamentos relativos ao solo):
Perguntas com respostas resolvidas, da equação do movimento aos limites do integrador. Abra cada uma e tente antes de ler.
Básico
O que é um edifício de cisalhamento?
Uma idealização em que cada piso é uma laje rígida com uma massa concentrada \(m_i\) e as colunas entre dois pisos agem como uma mola horizontal de rigidez \(k_i\) (a rigidez do pavimento). As únicas incógnitas são os deslocamentos horizontais dos pisos \(u_1,\dots,u_n\), e a deriva do pavimento é \(d_i=u_i-u_{i-1}\) com \(u_0=0\). A matriz de rigidez é tridiagonal: \(K_{ii}=k_i+k_{i+1}\), \(K_{i,i+1}=-k_{i+1}\).
Por que o movimento do solo age como força sobre as massas?
Escreva o deslocamento absoluto do piso \(i\) como \(u_g(t)+u_i(t)\), onde \(u_i\) é medido em relação ao solo. A lei de Newton para as massas dá \(M(\ddot u_g\mathbf 1+\ddot{\mathbf u})+C\dot{\mathbf u}+f(\mathbf u)=0\), porque molas e amortecedores sentem só o movimento relativo. Passando \(M\ddot u_g\mathbf 1\) para a direita obtém-se \(M\ddot{\mathbf u}+C\dot{\mathbf u}+f(\mathbf u)=-M\mathbf 1\,a_g(t)\): o edifício se comporta como se cada massa fosse empurrada por \(-m_ia_g\).
O que são modos e por que importam?
Vibração livre sem amortecimento \(\mathbf u=\boldsymbol\phi\cos\omega t\) exige \(K\boldsymbol\phi=\omega^2M\boldsymbol\phi\), um problema de autovalores resolvido aqui por rotações de Jacobi. Para massas e rigidezes iguais as frequências são exatamente \(\omega_j=2\sqrt{k/m}\,\sin\frac{(2j-1)\pi}{2(2n+1)}\), que o aplicativo compara com os autovalores numéricos (concordam em 15 dígitos). Para cinco pavimentos os períodos estão na razão \(1:0,34:0,22:0,17:0,15\), então um edifício alto é muito mais sensível a períodos longos. No caso elástico cada modo é um oscilador independente excitado por \(-\Gamma_ja_g\).
O método numérico
Como funciona o método de Newmark?
Ele avança deslocamento e velocidade a partir das acelerações nas duas pontas do passo: \(u_{k+1}=u_k+h\dot u_k+h^2[(\tfrac12-\beta)\ddot u_k+\beta\ddot u_{k+1}]\), \(\dot u_{k+1}=\dot u_k+h[(1-\gamma)\ddot u_k+\gamma\ddot u_{k+1}]\). Substituindo na equação do movimento em \(t_{k+1}\) sobra uma incógnita, \(\ddot u_{k+1}\), obtida de um sistema linear (ou, com plastificação, de Newton) com a matriz tridiagonal \(M+\gamma hC+\beta h^2K_t\). Com \(\gamma=\tfrac12\) o método é de segunda ordem; \(\beta=\tfrac14\) é a regra da aceleração média, incondicionalmente estável para sistemas lineares. O aplicativo mede a convergência de segunda ordem contra uma referência fina (os erros caem por um fator próximo de 4 quando o passo é dividido por 2).
De onde vêm os limites \(2 e 2\sqrt{3}\)?
Para um modo sem amortecimento com \(\omega h=z\), um passo multiplica o estado por uma matriz cujos autovalores ficam no círculo unitário exatamente quando \(z\le 1/\sqrt{\gamma/2-\beta}\) (para \(\gamma=\tfrac12\) e \(\beta\lt \tfrac14\)). A diferença central (\(\beta=0\)) dá \(z\le2\), a aceleração linear (\(\beta=\tfrac16\)) dá \(z\le\sqrt{12}=2\sqrt3\approx3{,}46\). O limite vale para o modo mais alto, mesmo que ele pouco importe fisicamente: para o padrão de cinco pavimentos \(\omega_{\max}\approx 85\) rad/s, então o esquema explícito exige \(h<0{,}024\) s. O cenário 6 usa \(h=0{,}03\) s e os deslocamentos explodem em poucos passos.
Como a plastificação é tratada?
Cada mola de pavimento é um elemento elastoplástico unidimensional com endurecimento cinemático linear. Dada a deriva, calcula-se uma força elástica de tentativa; se ela cai fora da faixa de escoamento, o excesso é devolvido à faixa por um incremento plástico (mapeamento de retorno), e a rigidez tangente cai para \(r\,k\). O passo de Newmark precisa então de iterações de Newton na aceleração; duas ou três por passo bastam, como mostram os testes da página. A energia é a verificação: cinética + amortecimento + trabalho interno deve igualar a energia de entrada, e o erro fica abaixo de \(10^{-3}\).
Comportamento sísmico
O que o espectro de resposta me diz?
Para cada período \(T\), toma-se um oscilador de uma massa com esse período, sacode-se com o registro e guarda-se o deslocamento máximo \(S_d\); a pseudo-aceleração é \(S_a=\omega^2S_d\). Lendo os períodos do edifício na curva obtém-se a resposta máxima de cada modo, e combinando os modos pela raiz da soma dos quadrados (SRSS) estima-se o deslocamento da cobertura. Nos casos elásticos a página imprime essa estimativa ao lado do pico do histórico no tempo; costumam concordar em 10 a 20 %. Para um registro harmônico na ressonância o espectro sobe a \(a_0/(2\zeta)\), verificado nos testes.
O que são ductilidade e amortecimento histerético?
A demanda de ductilidade é a deriva máxima dividida pela deriva de escoamento, \(\mu=\delta_{\max}/\delta_y\); a página a imprime para o pavimento escolhido. Um pavimento que plastifica dissipa energia a cada ciclo pela área de seu laço, \(4F_y(A-\delta_y)(1-r)\) para a amplitude \(A\), e é por isso que um edifício pode sobreviver a um tremor muito maior que sua resistência elástica. O preço é o dano: os mesmos laços que salvam a estrutura são colunas fissuradas.
Por que os pavimentos fracos falham?
Se um pavimento é mais fraco que os demais, ele plastifica primeiro, e então sua rigidez cai para \(r\,k\), de modo que ele não consegue mais transmitir muita força aos pavimentos de cima. Estes ficam quase elásticos e se movem quase como um bloco rígido, então toda a deformação se concentra no pavimento fraco. No cenário de pavimento fraco (6 pavimentos, 0,45 g, primeiro pavimento com 45 % da resistência, registro padrão) a deriva máxima é cerca de 4,1 % no pavimento 1, contra cerca de 2,1 % no edifício uniforme; a varredura mostra a diferença crescendo com a intensidade.
Como o isolamento de base ajuda?
Os isoladores são macios na direção horizontal (aqui um período efetivo de \(2{,}6\,\mathrm{s}\)) e a estrutura acima se move quase como corpo rígido sobre eles. Um período maior significa menor aceleração espectral para registros típicos de terremoto, de modo que a superestrutura vê forças e derivas menores: nos dois últimos cenários a deriva máxima cai para poucos décimos de por cento, enquanto o isolador absorve o deslocamento (cerca de 25 cm). As contrapartidas são o grande deslocamento que precisa ser acomodado, a resposta ao vento e os movimentos de período longo ou em forma de pulso, para os quais o isolamento ajuda bem menos (experimente o pulso com período isolado longo).
Indo além
Por que não usar um passo minúsculo com o método explícito?
Pode, e para problemas de impacto ou de ondas essa é a escolha certa, pois passos explícitos não exigem solução de matriz. Mas o passo deve satisfazer \(h<2/\omega_{\max}\), e \(\omega_{\max}\) cresce quando o modelo é refinado (mais pavimentos, elementos mais rígidos). Em problemas de terremoto a resposta é dominada pelos primeiros modos, com períodos de segundos, então um método incondicionalmente estável com \(h\approx0{,}01\) s é muito mais barato que um explícito obrigado a seguir o modo mais alto.
O que o balanço de energia verifica?
Multiplicando a equação do movimento por \(\dot{\mathbf u}^T\) e integrando obtém-se \(E_K+E_D+E_{\rm int}=E_I\) com \(E_I=-\int \dot{\mathbf u}^TM\mathbf 1\,a_g\,dt\). A página calcula cada integral pela regra do trapézio e imprime \(|E_K+E_D+E_{\rm int}-E_I|/E_I\). Isso não prova que o resultado esteja certo (um modelo errado pode conservar energia perfeitamente), mas pega erros no integrador, na rigidez tangente e na atualização da histerese.
O que uma avaliação real acrescentaria?
Registros reais escalados a um espectro de perigo específico do local, modelos de pórticos ou de fibras com as vigas, colunas e nós reais, efeitos P–\(\Delta\), torção de plantas assimétricas, interação solo–estrutura e um tratamento estatístico: muitos registros, muitas escalas e curvas de fragilidade em vez de um número de deriva. A análise dinâmica incremental, como na varredura aqui, é o primeiro passo nessa direção; Vamvatsikos e Cornell (2002) é a referência padrão.
Referências: A. Chopra, Dynamics of Structures (5ª ed., Pearson, 2017); N. M. Newmark, A method of computation for structural dynamics, J. Eng. Mech. Div. ASCE 85 (1959) 67–94; R. W. Clough e J. Penzien, Dynamics of Structures (McGraw-Hill); K. Kanai, Bull. Earthq. Res. Inst. 35 (1957); H. Tajimi, Proc. 2nd World Conf. Earthq. Eng. (1960); D. Vamvatsikos e C. A. Cornell, Earthq. Eng. Struct. Dyn. 31 (2002) 491–514; J. M. Kelly, Earthquake-Resistant Design with Rubber (Springer, 1997).
Experimente em Python
Um script só com a biblioteca padrão: a cadeia de cinco pavimentos, seus modos contra a fórmula analítica, a aceleração média de Newmark sob tremor harmônico, os limites de estabilidade dos esquemas de diferença central e aceleração linear e o balanço de energia.
"""Earthquake shake table, in Python: a uniform n-storey shear building (equal masses m, equal storey stiffness k, fixed base, free top) under
harmonic ground acceleration. Modes against the exact formula, Newmark's average acceleration method, the stability limits of the
central difference (omega h <= 2) and linear acceleration (omega h <= 2 sqrt 3) schemes, and the energy balance. Standard library only."""
from math import sin, cos, pi, sqrt
def build(n, T1, m=2.0e5, zeta=0.02):
k = m * (2 * pi / T1 / (2 * sin(pi / (4 * n + 2)))) ** 2
K = [[0.0] * n for _ in range(n)]
for i in range(n):
K[i][i] = k + (k if i + 1 < n else 0)
if i + 1 < n: K[i][i + 1] = K[i + 1][i] = -k
return k, m, K
def jacobi(A):
n = len(A); A = [r[:] for r in A]
for _ in range(60):
off = sum(A[i][j] ** 2 for i in range(n) for j in range(i + 1, n))
if off < 1e-24: break
for p in range(n):
for q in range(p + 1, n):
if abs(A[p][q]) < 1e-300: continue
th = (A[q][q] - A[p][p]) / (2 * A[p][q]); t = (1 if th >= 0 else -1) / (abs(th) + sqrt(th * th + 1)); c = 1 / sqrt(t * t + 1); s = t * c
for r in range(n): A[r][p], A[r][q] = c * A[r][p] - s * A[r][q], s * A[r][p] + c * A[r][q]
for r in range(n): A[p][r], A[q][r] = c * A[p][r] - s * A[q][r], s * A[p][r] + c * A[q][r]
return sorted(A[i][i] for i in range(n))
def solve(A, b):
n = len(b); M = [A[i][:] + [b[i]] for i in range(n)]
for i in range(n):
piv = max(range(i, n), key=lambda r: abs(M[r][i])); M[i], M[piv] = M[piv], M[i]
for r in range(i + 1, n):
f = M[r][i] / M[i][i]
for c in range(i, n + 1): M[r][c] -= f * M[i][c]
x = [0.0] * n
for i in range(n - 1, -1, -1): x[i] = (M[i][n] - sum(M[i][j] * x[j] for j in range(i + 1, n))) / M[i][i]
return x
def newmark(n, T1, f, amp, zeta, h, T, beta=0.25, gamma=0.5):
"""returns peak roof displacement and the energy balance error; ground acceleration amp*sin(2 pi f t)"""
k, m, K = build(n, T1); w2 = jacobi([[K[i][j] / m for j in range(n)] for i in range(n)])
wa, wb = sqrt(w2[0]), sqrt(w2[min(n - 1, 2)] if n > 1 else w2[0] * 2.25)
a0, a1 = 2 * zeta * wa * wb / (wa + wb), 2 * zeta / (wa + wb)
C = [[a0 * m * (i == j) + a1 * K[i][j] for j in range(n)] for i in range(n)]
u = [0.0] * n; v = [0.0] * n; ag0 = amp * sin(0.0); a = [-ag0] * n
mv = lambda A, x: [sum(A[i][j] * x[j] for j in range(n)) for i in range(n)]
Keff = [[m * (i == j) + gamma * h * C[i][j] + beta * h * h * K[i][j] for j in range(n)] for i in range(n)]
peak = 0.0; EI = ED = EW = 0.0; Ip = Dp = Wp = 0.0
for s in range(1, int(T / h) + 1):
t = s * h; ag = amp * sin(2 * pi * f * t)
up = [u[i] + h * v[i] + h * h * (0.5 - beta) * a[i] for i in range(n)]; vp = [v[i] + h * (1 - gamma) * a[i] for i in range(n)]
rhs = [-m * ag - c - kk for c, kk in zip(mv(C, vp), mv(K, up))]
an = solve(Keff, [rhs[i] - 0 for i in range(n)]) # (M + gamma h C + beta h^2 K) a_new = -M ag - C vp - K up
u = [up[i] + beta * h * h * an[i] for i in range(n)]; v = [vp[i] + gamma * h * an[i] for i in range(n)]; a = an
peak = max(peak, abs(u[-1]))
Ik = -m * sum(v) * ag; Dk = sum(x * y for x, y in zip(v, mv(C, v))); Wk = sum(x * y for x, y in zip(v, mv(K, u)))
EI += 0.5 * h * (Ip + Ik); ED += 0.5 * h * (Dp + Dk); EW += 0.5 * h * (Wp + Wk); Ip, Dp, Wp = Ik, Dk, Wk
EK = 0.5 * m * sum(x * x for x in v)
return peak, abs(EK + ED + EW - EI) / max(EI, 1e-30)
def central_difference_stable(n, T1, f, amp, zeta, h, T):
"""explicit central difference; returns True if the roof displacement stays finite and small"""
k, m, K = build(n, T1); w2 = jacobi([[K[i][j] / m for j in range(n)] for i in range(n)])
wa, wb = sqrt(w2[0]), sqrt(w2[min(n - 1, 2)])
a0, a1 = 2 * zeta * wa * wb / (wa + wb), 2 * zeta / (wa + wb)
C = [[a0 * m * (i == j) + a1 * K[i][j] for j in range(n)] for i in range(n)]
Lh = [[m / h ** 2 * (i == j) + C[i][j] / (2 * h) for j in range(n)] for i in range(n)]
u = [0.0] * n; up = [0.5 * h * h * 0.0] * n
mv = lambda A, x: [sum(A[i][j] * x[j] for j in range(n)) for i in range(n)]
for s in range(int(T / h)):
ag = amp * sin(2 * pi * f * s * h); Ku = mv(K, u); Cu = mv(C, up)
rhs = [-m * ag - Ku[i] + 2 * m * u[i] / h ** 2 - m * up[i] / h ** 2 + Cu[i] / (2 * h) for i in range(n)]
un = solve(Lh, rhs); up, u = u, un
if abs(u[-1]) > 1e3 or u[-1] != u[-1]: return False
return True
if __name__ == "__main__":
n, T1 = 5, 0.5; k, m, K = build(n, T1)
w = [sqrt(x) for x in jacobi([[K[i][j] / m for j in range(n)] for i in range(n)])]
exact = [2 * sqrt(k / m) * sin((2 * j - 1) * pi / (2 * (2 * n + 1))) for j in range(1, n + 1)]
print("periods (s):", [round(2 * pi / x, 4) for x in w]); print("max relative error against the exact formula:", max(abs(a - b) / b for a, b in zip(w, exact)))
ref = newmark(n, T1, 1 / T1, 0.5, 0.02, 0.0025, 8)[0]
for h in (0.02, 0.01, 0.005):
p, e = newmark(n, T1, 1 / T1, 0.5, 0.02, h, 8); print(f"h = {h}: peak roof {p:.5f} m (error vs h = 0.0025: {abs(p - ref):.2e}), energy error {e:.1e}")
wmax = w[-1]; print("omega_max =", round(wmax, 1), "-> central difference needs h <", round(2 / wmax, 4))
for h in (0.019, 0.022, 0.026, 0.03): print(f"central difference, h = {h}:", "stable" if central_difference_stable(n, T1, 1 / T1, 0.5, 0.02, h, 4) else "blows up")
Lance um raio de luz de cada vez perto de um buraco negro sem rotação e veja-o se curvar, dar voltas ou cair. O problema inteiro é uma única equação diferencial ordinária, \(u''+u=3u^2\) com \(u=1/r\); você mesmo pode resolvê-la com Euler, Heun ou Runge–Kutta e ver como o passo decide o que o buraco negro “faz”.
Simulação
Um raio de cada vez
pronto
Escolha a altura b do raio incidente com o controle, um experimento pronto ou clicando na vista de cima; depois aperte Lançar. Com o som ligado, o tom sobe quando o raio mergulha em direção ao buraco, e um sino toca quando ele cai.
ângulo percorrido \(\psi\) (graus) · eixo vertical: \(u=1/r\), em unidades de \(1/M\)
parâmetro de impacto \(b\) (M)—
distância \(r\) (M)—
ângulo percorrido \(\psi\) (°)—
erro da integral primeira—
resultado—
Unidades: \(G=c=1\) e comprimentos em \(M=GM_{\text{buraco}}/c^2\) (cerca de \(1{,}48\,\mathrm{km}\) por massa solar). A figura da esquerda é um diagrama de imersão: só a geometria do espaço é desenhada, e o raio é levantado sobre o funil para efeito visual; o raio em si é calculado no plano da vista de cima. A figura do buraco negro é uma ilustração, fora de escala. O raio cinza pontilhado é uma solução de referência (RK4 com \(h=0{,}002\)). O erro da integral primeira é \(|b^2(v^2+u^2-2u^3)-1|\), zero para um raio exato.
Deflexão
Quanto ela se curva?
Para os raios que escapam, o ângulo de desvio \(\alpha\) cresce quando \(b\) diminui e diverge em \(b_c\). Longe, ele segue o \(4M/b\) de Einstein (o dobro do palpite newtoniano), e um segundo termo o corrige mais perto. Seus raios lançados aparecem como pontos.
parâmetro de impacto \(b\) (em \(M\)) · eixo vertical: deflexão \(\alpha\), graus
A curva verde é calculada por este mesmo programa com RK4 e \(h=0{,}01\). O eixo vertical para em 260°, mas a curva continua subindo: \(\alpha\to\infty\) quando \(b\to b_c\), porque um raio que chega quase exatamente em \(b_c\) dá voltas em torno da esfera de fótons quantas vezes se quiser.
Medidor de erro
A integral primeira como verificação
Ao longo de um raio exato a quantidade \(v^2+u^2-2u^3\) vale \(1/b^2\) em todo ângulo. A solução numérica não sabe disso, então o afastamento é uma medida de erro de graça, o mesmo truque do gráfico de energia do app Tacoma. O Euler deixa a quantidade subir; Heun e RK4 a mantêm muito melhor.
ângulo percorrido \(\psi\) (graus) · eixo vertical: erro da integral primeira, logarítmico
Este gráfico usa o \(b\) do controle e o passo atual; raios que caem param cedo. O erro do Euler é sistemático: a quantidade sobe, o que equivale a lançar um raio com \(b\) menor. É por isso que o Euler “captura” raios que deveriam escapar (veja o experimento “Euler com passo grande mente”).
Fronteira de captura
Ache \(b_c\) por bisseção
parado
Faça bisseção sobre a única pergunta de sim ou não “o raio cai?”, entre \(b=4\) (cai) e \(b=6{,}5\) (não cai), com 32 divisões, usando cada método no passo atual. A resposta exata, \(3\sqrt3\,M\), sai da integral primeira à mão (veja o curso abaixo).
método
estimativa de \(b_c\)
erro
divisões
O erro do Euler é de primeira ordem em \(h\): divida o passo ao meio e o erro cai à metade. O de Heun é de segunda ordem e o do RK4 de quarta, então o RK4 já tem oito dígitos em \(h=0{,}02\). Os raios perto de \(b_c\) são os mais difíceis: um pequeno erro no início cresce como \(e^{\psi}\) enquanto o raio dá voltas na esfera de fótons.
Ordem de convergência
Quão rápido a resposta melhora?
O ângulo de desvio em \(b=8\) é calculado com cada método em sete passos e comparado com uma solução RK4 muito fina (\(h=0{,}0005\)). Num gráfico log–log o erro é uma reta cuja inclinação é a ordem do método: 1, 2 e 4.
passo angular \(h\) (radianos, logarítmico) · eixo vertical: erro de \(\alpha\) em radianos, logarítmico
método
ordem observada
erro em \(h=0{,}1\)
erro em \(h=0{,}025\)
As ordens são inclinações de mínimos quadrados nos quatro menores passos. Saem limpas (1, 2, 4) porque o ponto em que o raio chega ao horizonte, ou volta a sair, é localizado com o mesmo método e não por uma interpolação mais grosseira; com interpolação linear a ordem do RK4 cairia para cerca de 2.
Como funciona
Da relatividade geral a uma EDO
A luz no plano equatorial de um buraco negro de Schwarzschild segue uma geodésica nula. Duas grandezas conservadas, a energia e o momento angular, cuja razão é o parâmetro de impacto \(b\), reduzem o movimento a \((dr/d\lambda)^2=1-b^2(1-2M/r)/r^2\) e \(d\varphi/d\lambda=b/r^2\), com \(\lambda\) um parâmetro afim. Dividindo as duas e pondo \(u=1/r\) obtém-se a equação da órbita \(u''+u=3Mu^2\).
Sem o termo \(3Mu^2\) a equação seria \(u''+u=0\), cujas soluções são as retas \(u=\sin\psi/b\): esse termo é toda a gravidade. O problema é uma EDO de segunda ordem com valores iniciais \(u_0=1/r_0\) e \(u'_0\) fixado por \(b\), integrada no ângulo \(\psi\), e os únicos eventos são \(u=1/2\) (o raio chega ao horizonte: capturado) e \(u\) de volta a \(u_0\) (o raio escapa). Nada mais é preciso.
Por que o ângulo e não o tempo? O tempo coordenado congela no horizonte, enquanto no ângulo a equação é suave em todo lugar. O filme, porém, corre no parâmetro afim, para o qual \(d\psi/d\lambda=bu^2\): longe, \(\lambda\) é quase o tempo comum, e perto do buraco o raio corre em volta dele.
Notas honestas
O que a figura mostra e o que não mostra
O funil é o parabolóide de Flamm, \(z=2\sqrt{2M(r-2M)}\), a superfície cuja própria geometria reproduz a curvatura do espaço (não do espaço-tempo) no plano equatorial. É um auxílio de desenho. A luz não corre sobre essa superfície, e seu caminho sobre ela não é uma geodésica da superfície: o raio é calculado pela equação acima e depois levantado sobre o funil para efeito visual. A lona de borracha com uma bola é uma boa primeira imagem, mas o funil não é “o que a gravidade faz com a luz”.
O que o modelo inclui: um buraco sem rotação e sem carga (Schwarzschild), a luz tratada como raios, movimento em um plano e um raio que não perturba o buraco. As expedições do eclipse de 1919 testaram a previsão \(4M/b\approx1{,}75''\) na borda do Sol, o dobro do que a gravitação newtoniana dá para uma partícula à velocidade da luz (Soldner, 1801). Para um buraco de uma massa solar, \(M\approx1{,}48\,\mathrm{km}\), logo \(b_c\approx7{,}7\,\mathrm{km}\).
O que fica de fora: um buraco real gira (Kerr), o gás em volta brilha e sua luz é curvada nos anéis da figura, e uma imagem real exige muitíssimos raios traçados de volta a partir da câmera. O disco brilhante embaixo é só uma ilustração. A esfera de fótons \(r=3M\) é onde a luz pode circular o buraco numa órbita instável; a sombra que os telescópios veem, como na imagem de 2019 de M87*, tem raio \(b_c=3\sqrt3\,M\), e não \(3M\), porque é fixada pelo parâmetro de impacto no infinito e não por uma posição.
Em resumo
As equações e as ferramentas
Geodésica nula no plano equatorial (\(\lambda\) afim, \(b=L/E\)).
O funil da figura (diagrama de imersão, só geometria).
\[z(r)=2\sqrt{2M(r-2M)}\qquad(\text{Flamm's paraboloid: the funnel of the picture})\]
Curso
Da luz a um resolvedor de EDO
Quatro grupos: a física, a EDO e os métodos, as armadilhas numéricas, e experimentos com exercícios. Abra uma pergunta, pense e só então leia a resposta.
1. A física
Por que a luz se curva?
Na relatividade geral a gravidade é a curvatura do espaço-tempo, e a luz, que não tem massa para ser empurrada, simplesmente segue os caminhos mais retos possíveis nesse espaço-tempo curvo, as geodésicas nulas. Perto de uma massa esses caminhos deixam de ser retas no espaço que desenhamos. Um argumento newtoniano que trata a luz como partículas de velocidade \(c\) também prevê um desvio, mas pela metade: \(2M/b\) contra o \(4M/b\) de Einstein. A outra metade vem da curvatura do próprio espaço, e não só da parte temporal da métrica.
O que são o horizonte, a esfera de fótons e a sombra?
O horizonte \(r=2M\) é o ponto sem volta: nada que esteja dentro consegue sair, nem a luz. Em \(r=3M\), a esfera de fótons, a luz pode viajar em círculo em torno do buraco, mas a órbita é instável como uma bola equilibrada no topo de uma colina: o menor empurrão manda a luz para dentro ou para fora. Um raio que chega de longe é capturado se o seu parâmetro de impacto for menor que \(b_c=3\sqrt3\,M\approx5{,}196\,M\), que não é \(3M\) por causa da curvatura do raio na chegada. O disco escuro que um observador distante enxerga, a sombra, tem raio \(b_c\).
O que é o parâmetro de impacto?
Imagine o raio vindo de muito longe ao longo de uma reta. O parâmetro de impacto \(b\) é a distância entre essa reta e a paralela que passa pelo buraco: a altura do raio na vista de cima. É a razão \(L/E\) de duas grandezas conservadas, o momento angular e a energia, então é o mesmo em todos os pontos do raio e sozinho decide a órbita inteira. Por isso o app só precisa de um número para lançar um raio: \(b=8\) dá sempre a mesma curva.
2. A EDO e os métodos
Como chegamos das geodésicas a \(u''+u=3Mu^2\)?
Escreva as grandezas conservadas \(E=(1-2M/r)\dot t\) e \(L=r^2\dot\varphi\) (pontos são derivadas no parâmetro afim) e a condição nula \(0=-(1-2M/r)\dot t^2+\dot r^2/(1-2M/r)+r^2\dot\varphi^2\). Eliminando \(t\) obtém-se \(\dot r^2=E^2-(L^2/r^2)(1-2M/r)\). Com \(u=1/r\) e \(du/d\varphi=-\dot r/L\) isto vira \((du/d\varphi)^2=1/b^2-u^2+2Mu^3\), a integral primeira. Derivando uma vez em \(\varphi\) e dividindo por \(2u'\) vem \(u''+u=3Mu^2\).
Só as duas últimas linhas são necessárias neste curso; a dedução a partir da métrica é um bom exercício para uma aula de relatividade.
Como se escreve para Euler, Heun e RK4?
Ponha \(y_1=u\) e \(y_2=u'\). Então \(y_1'=y_2\) e \(y_2'=3y_1^2-y_1\) (com \(M=1\)): um sistema de primeira ordem \(\mathbf y'=\mathbf f(\mathbf y)\) em que o ângulo \(\psi\) não aparece à direita (um sistema autônomo). Euler: \(\mathbf y_{n+1}=\mathbf y_n+h\,\mathbf f(\mathbf y_n)\). Heun: média da inclinação no início e na previsão de Euler. RK4: quatro inclinações com pesos \(1,2,2,1\) sobre 6. O arquivo bh-core.js tem os três em umas vinte linhas, e o script Python no fim da página também.
Como se decide que o raio “cai”?
O horizonte está em \(u=1/2\). Depois de cada passo o programa verifica se \(u\ge1/2\); se sim, o raio é capturado, o sino toca e o último passo é encurtado para que o caminho termine exatamente no horizonte. O raio escapa quando \(u'<0\) e \(u\) volta ao valor inicial \(u_0=1/r_0\). Se nenhuma das duas coisas acontece depois de \(14\pi\) radianos, o raio é declarado indeciso, ainda circulando. Localizar o último passo é um problema de busca de raiz: algumas iterações de Newton sobre a fração do passo, feitas com o mesmo método, de modo que o método mantém sua ordem.
O que é o ângulo de desvio e como é medido?
Sem gravidade o raio varreria o ângulo polar de \(\psi_0=\arcsin(b/r_0)\) a \(\pi-\psi_0\). O raio curvado varre um ângulo maior \(\psi_{\text{saída}}-\psi_0\), e a diferença é o desvio \(\alpha=(\psi_{\text{saída}}-\psi_0)-\pi+2\psi_0\). O programa começa em \(r_0=1000M\), longe o bastante para que o resultado fique próximo do valor de um raio vindo do infinito. Em primeira ordem \(\alpha=4M/b\); a expansão continua como \(4M/b+15\pi M^2/(4b^2)+128M^3/(3b^3)+\dots\), e falha perto de \(b_c\), onde \(\alpha\) diverge.
3. Armadilhas numéricas
Por que a resposta é tão sensível perto de \(b_c\)?
Linearize a equação da órbita em torno da órbita circular de fótons \(u=1/3\): com \(u=1/3+\delta\) obtém-se \(\delta''=\delta+3\delta^2\), então pequenos erros crescem como \(e^{\psi}\) (uma sela, não um centro). Um raio com \(b-b_c\) igual a \(10^{-6}\) gasta cerca de \(\ln10^{6}\approx14\) radianos, mais de duas voltas, perto da esfera de fótons antes de se decidir. Um erro numérico desse tamanho é amplificado do mesmo modo, então localizar \(b_c\) com muitos dígitos exige um método cujo erro esteja bem abaixo dos dígitos desejados. O RK4 com \(h=0{,}02\) tem isso; o Euler não.
O que exatamente o Euler faz de errado aqui?
A equação é um oscilador não linear, \(u''=-u+3u^2\). O método de Euler aplicado a um oscilador multiplica a amplitude por \(\sqrt{1+h^2}\) a cada passo: a solução numérica ganha energia. Aqui a energia é a integral primeira \(1/b^2\), e ganhá-la significa se comportar como um raio de \(b\) menor: o Euler puxa para dentro raios que deveriam passar. O fator de amplificação do Heun é \(\sqrt{1+h^4/4}\), menor por duas potências de \(h\), e o do RK4 é cerca de \(1-h^6/144\) (perde um pouco), então esses dois são muito melhores. O mesmo estudo de estabilidade é feito no app Tacoma.
Por que integrar no ângulo e não no tempo?
No tempo coordenado de Schwarzschild um raio que se aproxima do horizonte desacelera e nunca chega: \(dr/dt\to0\). Um método que marcha em \(t\) se arrastaria e nunca veria a captura. No ângulo \(\psi\) a equação \(u''=3u^2-u\) é suave em todo lugar e o horizonte é simplesmente o valor \(u=1/2\). Para o filme o app usa o parâmetro afim, \(d\psi/d\lambda=bu^2\), que longe é quase o tempo comum e mantém o movimento vivo perto do buraco.
O que dá errado para um raio quase de frente?
Quando \(b\to0\) o raio entra quase em linha reta e o ângulo \(\psi\) quase não muda, então um passo fixo em \(\psi\) cobre quase toda a queda: o controle para em \(|b|=1\) por isso. Para raios radiais usa-se outra formulação, por exemplo \(r(\lambda)\) com \((dr/d\lambda)^2=1-b^2(1-2M/r)/r^2\), ou um passo adaptativo. Escolher bem a variável independente faz parte da modelagem.
4. Experimentos e exercícios
Experimento: quando o Euler mente?
Escolha “Euler com passo grande mente” (\(b=5{,}3\), \(h=0{,}1\)). A resposta exata é que o raio escapa, desviado de 204°, mas o Euler o faz cair, porque o erro da integral primeira empurra o valor crítico efetivo para \(b_c\approx5{,}356\). Aperte “Rodar a bisseção” para ver esse número. Depois diminua \(h\) no controle: abaixo de cerca de \(h=0{,}07\) o raio volta a escapar, e a estimativa de \(b_c\) tende a \(5{,}196\) por cima, aproximadamente em proporção a \(h\). Faça o mesmo com Heun e com RK4 em \(h=0{,}1\): os dois acertam o destino.
Experimento: contando as voltas
Lance \(b=6\), \(5{,}3\) e \(5{,}2\) em sequência com o menu de experimentos e leia o desvio na linha de status: 99°, 204° e 390°. Em \(b=5{,}2\), apenas \(0{,}004\) acima de \(b_c\), o raio dá mais de uma volta em torno do buraco antes de sair. Pela linearização da seção anterior cada volta completa a mais exige que o raio esteja \(e^{2\pi}\approx535\) vezes mais perto de \(b_c\), então o passo de \(0{,}05\) do controle é grosso demais para uma segunda volta; use a bisseção do script Python. A lei logarítmica \(\alpha\approx-\ln(b-b_c)+\text{const}\) se ajusta à curva verde perto de \(b_c\)?
Exercícios
Mostre pela integral primeira que a captura ocorre exatamente para \(b<3\sqrt3\,M\): o raio não pode voltar quando \(F(u)=1/b^2-u^2+2u^3\) permanece positiva em \([0,1/2]\); o mínimo de \(F\) ali está em \(u=1/3\), onde \(F=1/b^2-1/27\).
Escreva Euler, Heun e RK4 para \(u''+u=3u^2\) na sua linguagem e reproduza a tabela da fronteira de captura.
Use \(\alpha\approx4M/b\) para estimar o desvio da luz na borda do Sol (\(M=1{,}48\,\mathrm{km}\), \(b=6{,}96\times10^{5}\,\mathrm{km}\)) em segundos de arco e compare com \(1{,}75''\).
Tome \(r\) como variável independente e o parâmetro afim como tempo, e tente integrar um raio com \(b\) logo acima de \(b_c\). O que acontece no ponto de retorno, onde \(dr/d\lambda=0\)?
Com a linearização em torno de \(u=1/3\), estime quantas voltas em torno do buraco dá um raio com \(b-b_c=10^{-8}M\).
Referências: Misner, Thorne e Wheeler, Gravitation (1973), capítulo 25. Chandrasekhar, The Mathematical Theory of Black Holes (1983). Flamm, Physikalische Zeitschrift 17 (1916) 448–454. Dyson, Eddington e Davidson, Philosophical Transactions of the Royal Society A 220 (1920) 291–333 (o eclipse de 1919). Luminet, Astronomy and Astrophysics 75 (1979) 228–235 (a primeira imagem calculada de um buraco negro com disco). Event Horizon Telescope Collaboration, Astrophysical Journal Letters 875 (2019) L1.
Experimente em Python
A mesma EDO e os mesmos três métodos em um script curto, só com a biblioteca padrão: ângulos de desvio, a fronteira de captura por bisseção e as ordens de convergência observadas.
#!/usr/bin/env python3
"""Light bending near a Schwarzschild black hole with nothing but an ODE solver (standard library only).
Units G = c = 1 and M = 1. For a light ray in the equatorial plane put u = 1/r and use the polar angle psi as the
independent variable. The orbit equation is
u'' + u = 3 u^2 (' = d/dpsi), first integral: u'^2 + u^2 - 2 u^3 = 1/b^2 ,
where b is the impact parameter. The horizon is u = 1/2. A ray with b < 3*sqrt(3) = 5.196... falls in, a ray with
b > 3*sqrt(3) comes back out, bent by the angle alpha. Run: python3 black_hole_rays.py
"""
import math
BC = 3 * math.sqrt(3) # critical impact parameter
R0 = 1000.0 # start (and finish) distance for the deflection angle
def f(y):
"""right-hand side of the first-order system y = (u, v), v = du/dpsi"""
return (y[1], 3 * y[0] ** 2 - y[0])
def step(method, y, h):
k1 = f(y)
if method == "euler":
return (y[0] + h * k1[0], y[1] + h * k1[1])
if method == "heun":
k2 = f((y[0] + h * k1[0], y[1] + h * k1[1]))
return (y[0] + h / 2 * (k1[0] + k2[0]), y[1] + h / 2 * (k1[1] + k2[1]))
k2 = f((y[0] + h / 2 * k1[0], y[1] + h / 2 * k1[1]))
k3 = f((y[0] + h / 2 * k2[0], y[1] + h / 2 * k2[1]))
k4 = f((y[0] + h * k3[0], y[1] + h * k3[1]))
return tuple(y[i] + h / 6 * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) for i in range(2))
def locate(method, y, h, target, frac):
"""fraction of the step h at which the method reaches u = target (Newton iterations)"""
for _ in range(6):
z = step(method, y, frac * h)
frac = min(1.0, max(0.0, frac - (z[0] - target) / (z[1] * h)))
return frac
def trace(b, method="rk4", h=0.02, max_psi=14 * math.pi):
"""integrate one ray; returns ('captured' | 'escaped' | 'orbit', deflection angle in radians or None)"""
u0 = 1 / R0
y = (u0, math.sqrt(1 / b ** 2 - u0 ** 2 * (1 - 2 * u0)))
psi0 = math.asin(b / R0)
psi = psi0
while psi - psi0 < max_psi:
z = step(method, y, h)
if z[0] >= 0.5: # reached the horizon
return "captured", None
if z[1] < 0 and z[0] <= u0: # back at the starting distance, moving outward
fr = locate(method, y, h, u0, (y[0] - u0) / (y[0] - z[0]))
return "escaped", (psi + fr * h - psi0) - math.pi + 2 * psi0
y, psi = z, psi + h
return "orbit", None
def critical(method, h):
"""critical impact parameter by bisection on 'is the ray captured?'"""
lo, hi = 4.0, 6.5
while hi - lo > 1e-9:
mid = (lo + hi) / 2
if trace(mid, method, h)[0] == "captured":
lo = mid
else:
hi = mid
return (lo + hi) / 2
if __name__ == "__main__":
print("critical impact parameter 3*sqrt(3) = %.9f" % BC)
print("\n b fate alpha (deg) 4/b (deg) 4/b + 15 pi/(4 b^2) (deg)")
for b in (14, 10, 8, 6, 5.3, 5.2, 5.0, 3.0):
fate, al = trace(b, "rk4", 0.005)
w1, w2 = 4 / b, 4 / b + 15 * math.pi / (4 * b * b)
print("%5.2f %-9s %12s %10.3f %14.3f" % (b, fate, "%.3f" % math.degrees(al) if al is not None else "-", math.degrees(w1), math.degrees(w2)))
print("\nbisection for b_c, error versus 3*sqrt(3):")
for h in (0.1, 0.02):
for m in ("euler", "heun", "rk4"):
bc = critical(m, h)
print(" h = %-5s %-6s b_c = %.6f error %+.2e" % (h, m, bc, bc - BC))
print("\norder of convergence of the deflection angle at b = 8:")
ref = trace(8, "rk4", 0.0005)[1]
for m in ("euler", "heun", "rk4"):
e1 = abs(trace(8, m, 0.05)[1] - ref)
e2 = abs(trace(8, m, 0.025)[1] - ref)
print(" %-6s error(h=0.05) = %.2e error(h=0.025) = %.2e observed order %.2f" % (m, e1, e2, math.log(e1 / e2) / math.log(2)))
Veja a fórmula nascer só de álgebra: cada equação se transforma na seguinte, os termos deslizam pelo sinal de igual, aparecem e somem, e a área de um quadrado conta a mesma história. Depois teste números e veja por que a fórmula, como escrita, pode perder todos os dígitos em ponto flutuante.
Dedução
Completando o quadrado
1 / 11
Tocar roda a dedução inteira, ou avance com os botões ou com o controle deslizante. Cada quadro mantém as peças que não mudam, desliza as que se movem, apaga o que desaparece e faz surgir o que é novo. Tudo é composto com MathJax e animado no seu navegador; não há arquivo de vídeo. Supõe apenas que o coeficiente a é diferente de zero.
Laboratório numérico
Teste seus próprios números
Digite \(a\), \(b\) e \(c\) (decimais e expoentes como 1e8 valem) e veja as raízes calculadas de três formas: pela fórmula como está escrita, pela forma estável e exatamente com aritmética de 120 dígitos. As duas últimas colunas dão o erro relativo e o resíduo \(a x^2 + b x + c\) em cada raiz calculada.
Os doubles são IEEE 754 binary64 (cerca de 16 dígitos decimais). A coluna exata trunca a raiz verdadeira a 22 algarismos significativos. Os resíduos em precisão dupla também são arredondados, então um resíduo da ordem de \(10^{-16}\) vezes o tamanho dos termos significa só arredondamento. O gráfico é desenhado em unidades reescaladas (horizontal: distância ao vértice em unidades do espaçamento entre as raízes; vertical: o valor em unidades da altura do vértice), para que fique legível qualquer que seja o tamanho dos coeficientes.
Ponto flutuante
Quando a fórmula perde todos os dígitos
Pegue \(x^2 + b x + 1\) com \(b = 10^2\), \(10^3\), … \(10^{14}\). A raiz pequena é cerca de \(-1/b\). A fórmula como escrita calcula \(-b + \sqrt{b^2 - 4}\), subtraindo dois números quase iguais; a forma estável \(q = -(b + \sqrt{b^2 - 4})/2\), \(x=1/q\) nunca subtrai. Erro relativo da raiz pequena, contra o valor exato:
expoente \(k\) em \(b = 10^k\)
b
raiz exata
fórmula como escrita
forma estável
A forma estável é exata até o último dígito em todas as linhas, então seu erro é desenhado no piso do gráfico (\(10^{-17}\)). A partir de \(b = 2^{27} \approx 1{,}34 \times 10^8 a\) fórmula como escrita devolve exatamente 0 para a raiz pequena, porque \(b^2 - 4\) é arredondado para \(b^2\).
História
Quatro mil anos de uma fórmula
Escribas babilônios, há cerca de 4000 anos, resolviam em tábuas de argila problemas que equivalem a equações quadráticas, com uma receita equivalente a completar o quadrado e sem símbolos para a incógnita. Os geômetras gregos as resolviam com áreas, como na figura desta página.
Na Índia, Brahmagupta (628) deu uma regra que já trata juntos os casos negativos e positivos, e al-Khwārizmī (por volta de 820), cujo livro nos deu a palavra álgebra, ensinava a completar o quadrado com retângulos e com os seis tipos-padrão de equação, pois ainda não se usavam números negativos como coeficientes.
No Brasil esta fórmula é chamada de “fórmula de Báscara”, em referência ao matemático indiano Bhāskara II (1114–c. 1185), que tratou de equações quadráticas em seu livro de álgebra. Mas o nome é um costume brasileiro, que quase não se encontra em outros países, e é considerado historicamente injusto: Bhāskara não criou a fórmula. A regra geral já aparece em Brahmagupta (628), uma regra de completar o quadrado multiplicando por 4a é atribuída a Śrīdhara (por volta do ano 900), e os métodos para essa equação são ainda mais antigos, como vimos acima. Pesquisas sobre o ensino de matemática notam que o nome aparece em livros didáticos brasileiros de certas épocas, e a origem exata do costume é incerta. A forma compacta moderna, com uma só expressão simbólica para as duas raízes, é bem mais recente, fruto da álgebra simbólica dos séculos XVI e XVII.
Limites honestos
O que a animação não mostra
A dedução só é prova para \(a \ne 0\), e extrai raízes quadradas nos números complexos quando \(\Delta < 0\), caso em que “\(x + b/2a = \pm \sqrt{\Delta} / 2a\)” significa um par de números conjugados. A figura de áreas cobre só o caso \(a=1\) com raiz positiva; nos outros casos a álgebra continua valendo, mas a geometria precisa de sinais.
A animação é uma apresentação, não um verificador de provas: cada quadro foi escrito à mão e verificado numericamente (o script em Python abaixo confere cada passo com frações exatas). O laboratório usa o valor verdadeiro da aritmética exata, mas só para coeficientes que são números decimais.
Ponto flutuante é um problema diferente da álgebra: a fórmula é exatamente correta nos reais e mesmo assim errada num computador. A forma estável corrige o cancelamento, mas não pode corrigir um discriminante que já é impreciso: as raízes perto de uma raiz dupla são mal condicionadas qualquer que seja a fórmula.
Em resumo
A dedução, a fórmula e a numérica
Três formas equivalentes, terminando num quadrado perfeito:
Erro da fórmula como escrita quando uma raiz é muito menor que a outra:
\[\text{naive small root: } \frac{|\hat x-x|}{|x|}\approx\varepsilon\,\frac{b^2}{|ac|}\quad(b^2\gg|4ac|),\qquad \varepsilon=2^{-53}\approx1.1\times10^{-16}\]
Curso
De uma tábua de argila a um erro de ponto flutuante
Quatro grupos: a ideia, a matemática, a numérica e exercícios. Abra uma pergunta, pense e depois leia a resposta.
1. A ideia
Por que completar o quadrado?
A equação \(y^2=k\) é fácil: \(y=\pm\sqrt k\). O problema de \(x^2+px=q\) é que \(x\) aparece duas vezes, uma ao quadrado e outra sozinha. Completar o quadrado reescreve o lado esquerdo como um só quadrado, \((x+p/2)^2\), de modo que \(x\) aparece uma vez e a raiz quadrada pode descascá-lo. A figura geométrica mostra por que funciona: um quadrado mais uma faixa de mesma altura é quase um quadrado maior, e o canto que falta tem área \((p/2)^2\).
Por que \(a\) deve ser diferente de zero?
O primeiro passo de verdade divide por \(a\). Se \(a=0\) a equação \(bx+c=0\) é linear, com a única solução \(x=-c/b\), e a fórmula dividiria por zero. Há um limite agradável: quando \(a\to0\) com \(b>0\), a raiz \(\frac{-b+\sqrt{b^2-4ac}}{2a}\) tende a \(-c/b\) enquanto a outra foge para o infinito. A forma estável \(x=c/q\) mostra esse limite de imediato, o que a forma ingênua esconde atrás de \(0/0\). Teste o exemplo com \(a\) minúsculo.
O que significa \(o \pm\)?
Os dois sinais dão uma solução: se \(y^2=k\) então \((-y)^2=k\) também. Assim a fórmula é uma maneira curta de escrever dois números, \(x_1=\frac{-b+\sqrt\Delta}{2a}\) e \(x_2=\frac{-b-\sqrt\Delta}{2a}\), que são imagens espelhadas em torno do vértice \(x=-b/2a\). Se \(\Delta=0\) eles coincidem (raiz dupla, a parábola só toca o eixo); se \(\Delta<0\) são complexos conjugados e a parábola não alcança o eixo. Na animação o sinal aparece no passo da raiz quadrada e sobrevive até o fim.
2. A matemática
Por que cada passo é reversível?
Dividir por \(a\ne0\), somar o mesmo número aos dois lados e reescrever uma expressão como outra igual podem ser desfeitos, então toda equação da cadeia tem exatamente as mesmas soluções que a anterior. Só o passo da raiz quadrada exige cuidado: de \(y^2=k\) para \(y=\pm\sqrt k\) ele mantém as duas soluções. Uma verificação concreta: para qualquer \(x\), a diferença entre os dois lados de cada um dos sete primeiros quadros vale \(f(x)/a\) com \(f(x)=ax^2+bx+c\) (ou o próprio \(f(x)\) no primeiro quadro), então os sete se anulam exatamente nos mesmos \(x\). O script em Python abaixo confere isso com frações exatas.
O que o discriminante nos diz?
\(\Delta=b^2-4ac\) é o número sob a raiz, e a raiz é real exatamente quando \(\Delta\ge0\). Geometricamente, a parábola \(y=ax^2+bx+c\) tem vértice em \(x=-b/2a\) com altura \(-\Delta/4a\), então cruza o eixo duas vezes quando \(a\) e \(-\Delta\) têm o mesmo sinal (\(\Delta>0\)), toca uma vez quando \(\Delta=0\) e não o alcança quando \(\Delta<0\). A distância entre as duas raízes é \(\sqrt\Delta/|a|\). Para coeficientes inteiros \(\Delta\) é inteiro, e as raízes são racionais exatamente quando \(\Delta\) é um quadrado perfeito.
Como conferir a fórmula sem refazer a dedução?
Some e multiplique as duas raízes, com \(s=\sqrt\Delta\): \(x_1+x_2=\frac{-b+s}{2a}+\frac{-b-s}{2a}=-\frac ba\) e \(x_1x_2=\frac{(-b)^2-s^2}{4a^2}=\frac{b^2-(b^2-4ac)}{4a^2}=\frac ca\). São as relações de Viète, e elas dizem que \(a(x-x_1)(x-x_2)=ax^2+bx+c\), o que é o mesmo que dizer que \(x_1\) e \(x_2\) são as raízes. A relação do produto também é a chave da forma estável da próxima seção.
A figura é uma prova?
Para \(a=1\), \(p>0\), \(q>0\) é: um quadrado de lado \(x\) e uma faixa \(p\times x\) têm área \(x^2+px=q\); cortar a faixa em duas metades \(\frac p2\times x\) e colá-las em dois lados do quadrado dá um L de área \(q\); somar o canto \((p/2)^2\) faz um quadrado de lado \(x+p/2\) e área \(q+(p/2)^2\), de modo que \(x+\frac p2=\sqrt{q+p^2/4}\). É exatamente a fórmula da raiz positiva, \(x=-\frac p2+\sqrt{\frac{p^2}{4}+q}\). Para outros sinais as peças teriam comprimentos negativos e a figura deixa de ser figura, enquanto a álgebra não se importa.
3. Análise numérica
Por que a fórmula perde dígitos?
Quando \(b^2\gg|4ac|\), \(\sqrt{b^2-4ac}\) é quase \(|b|\), e para um dos dois sinais a fórmula calcula \(-b+\sqrt\Delta\) (para \(b>0\)) como diferença de dois números quase iguais. Cada um carrega um erro de arredondamento de cerca de \(\varepsilon|b|\), com \(\varepsilon=2^{-53}\approx1{,}1\times10^{-16}\), e a subtração cancela os dígitos principais e deixa esse erro na frente: o erro absoluto do resultado continua cerca de \(\varepsilon|b|/(2|a|)\), enquanto a raiz mesma vale só \(|c/b|\). O erro relativo é da ordem de \(\varepsilon\,b^2/|ac|\). Para \(x^2+10^8x+1\): a raiz pequena é \(-10^{-8}\), a fórmula em precisão dupla devolve \(-7{,}45\times10^{-9}\) (erro de 25 %), e para \(b\ge2^{27}\approx1{,}34\times10^8\) devolve exatamente 0. A outra raiz, \(-b-\sqrt\Delta\), não tem cancelamento e está certa.
O que é a forma estável e por que funciona?
Calcule primeiro a raiz que não tem cancelamento, escolhendo o sinal que soma módulos: \(q=-\tfrac12\bigl(b+\operatorname{sgn}(b)\sqrt\Delta\bigr)\), de modo que \(q\) tem o tamanho de \(b\) e nenhum dígito se perde, e depois \(x_1=q/a\). A outra raiz vem do produto de Viète \(x_1x_2=c/a\): \(x_2=\frac{c/a}{q/a}=c/q\). Ambas são divisões e somas de números de mesmo sinal, então cada uma tem erro relativo de poucas unidades de \(\varepsilon\). Na tabela acima a coluna estável está correta até o último dígito impresso em todas as linhas. É o que as bibliotecas fazem: as rotinas-padrão para quadráticas usam essa forma, não a do livro-texto.
O que mais pode dar errado?
Primeiro, estouro: \(b^2\) passa do maior double (cerca de \(1{,}8\times10^{308}\)) para \(|b|>1{,}3\times10^{154}\) mesmo que as raízes sejam modestas; multiplicar todos os coeficientes por uma potência de dois resolve sem mudar as raízes. Segundo, um discriminante quase nulo: \(b^2\) e \(4ac\) quase iguais, e \(\Delta\) perde dígitos; perto de uma raiz dupla as raízes são mal condicionadas, uma perturbação \(\delta\) dos coeficientes as move cerca de \(\sqrt\delta\), então \(10^{-16}\) vira \(10^{-8}\) não importa como se escreva a fórmula. Um cálculo compensado de \(b^2-4ac\) (com multiplicação-soma fundida) recupera os dígitos perdidos quando os coeficientes são exatos. Terceiro, \(a\) minúsculo: com \(a=10^{-9}\) no exemplo, a fórmula para a raiz que tende a \(-c/b\) perde dígitos, e a forma estável não.
4. Exercícios
Exercício: use a figura
Ponha \(p=4\) e \(q=5\) na figura de áreas. A raiz positiva é \(x=-2+\sqrt{4+5}=1\). Confira com a figura: o quadrado tem lado 1, as duas faixas são \(2\times1\), o canto é \(2^2=4\), o quadrado grande tem lado \(x+2=3\) e área \(9=q+4\). Agora tome \(p=3\), \(q=10\) e calcule \(x\) e o quadrado grande à mão antes de olhar a leitura. Por que a leitura nunca pede \(q<0\)?
Exercício: ache onde a fórmula como escrita quebra
No laboratório, digite \(a=1\), \(c=1\) e \(b=10^6\), depois \(10^7\), \(10^8\) e \(1{,}5\times10^8\). Compare a fórmula como escrita com a raiz exata e note onde o erro relativo passa de 1 % e onde passa a ser exatamente 1. Confira a regra \(\varepsilon\,b^2/|ac|\): para \(b=10^6\) ela prevê \(10^{-4}\); para \(b=10^8\), cerca de \(1\). Depois tente \(a=1\), \(b=-10^8\), \(c=1\): qual raiz é a ruim agora, e por quê?
Exercício: raízes complexas
Tome \(x^2+2x+5\), cujo discriminante é \(-16\). O laboratório mostra \(x=-1\pm2i\); confira que \((x+1)^2=-4\) na forma do quinto quadro, e que \((-1+2i)+(-1-2i)=-2=-b/a\) e \((-1+2i)(-1-2i)=5=c/a\). Qual é o vértice da parábola, e como a altura dele diz que as raízes não são reais?
Referências: al-Khwārizmī, Al-Kitāb al-mukhtaṣar fī ḥisāb al-jabr wa-l-muqābala (cerca de 820). Goldberg, “What every computer scientist should know about floating-point arithmetic”, ACM Computing Surveys 23 (1991) 5–48. Higham, Accuracy and Stability of Numerical Algorithms, 2ª ed., SIAM (2002), seção 1.8. Kahan, “On the cost of floating-point computation without extra-precise arithmetic” (2004), sobre a equação quadrática. As datas e atribuições do cartão de História são resumidas e aproximadas.
Experimente em Python
Duas verificações num script curto: que cada quadro da dedução mantém as mesmas soluções (a diferença entre seus dois lados é f(\(x\))/a para qualquer \(x\), testada com frações exatas) e a tabela de cancelamento para \(x^2 + b x + 1\) com as raízes exatas do módulo decimal. Não precisa de nada além da biblioteca padrão.
"""Quadratic formula: exact check of the derivation, and the cancellation table. Standard library only.
Each derivation step is an identity between left and right sides; we verify with exact fractions that
every step keeps the same solution set, and that the final formula solves a x^2 + b x + c = 0."""
from fractions import Fraction as F
from decimal import Decimal, getcontext
import math
def steps(a, b, c, x):
"""(left, right) of each frame 0..7 evaluated at x; the difference L-R must be (a x^2+b x+c)/a^k for fixed k."""
a, b, c, x = map(F, (a, b, c, x))
p = b / (2 * a)
return [
(a*x*x + b*x + c, 0),
((a*x*x + b*x + c) / a, 0),
(x*x + b/a*x + c/a, 0),
(x*x + b/a*x, -c/a),
(x*x + b/a*x + p*p, -c/a + p*p),
((x + p)**2, -c/a + p*p),
((x + p)**2, -4*a*c/(4*a*a) + b*b/(4*a*a)),
((x + p)**2, (b*b - 4*a*c) / (4*a*a)),
]
def check(a, b, c):
a, b, c = map(F, (a, b, c))
for x in (F(0), F(1), F(-3, 7), F(5, 2)):
f = a*x*x + b*x + c
for i, (L, R) in enumerate(steps(a, b, c, x)):
want = f if i == 0 else f / a
assert L - R == want, (i, x)
return True
def exact_roots(a, b, c):
"""Roots as Decimals (60 digits) through exact discriminant; None for complex."""
getcontext().prec = 60
a, b, c = map(F, (a, b, c)); D = b*b - 4*a*c
if D < 0: return None
s = Decimal(D.numerator).sqrt() / Decimal(D.denominator).sqrt()
A, B = Decimal(a.numerator) / Decimal(a.denominator), Decimal(b.numerator) / Decimal(b.denominator)
return (-B - s) / (2*A), (-B + s) / (2*A)
def naive(a, b, c):
s = math.sqrt(b*b - 4*a*c); return (-b - s) / (2*a), (-b + s) / (2*a)
def stable(a, b, c):
s = math.sqrt(b*b - 4*a*c); q = -0.5 * (b + math.copysign(s, b)); return q / a, c / q
if __name__ == "__main__":
for abc in [(1, -5, 6), (2, 3, -7), (F(1, 3), F(-2, 5), F(1, 7))]:
print(abc, "derivation checks:", check(*abc))
print("\nroots of x^2 + 10^k x + 1: relative error of the small root")
print(" k naive stable")
for k in range(2, 15, 2):
b = 10.0**k; ex = exact_roots(1, int(b), 1)[1]
n = min(naive(1, b, 1), key=abs); s = min(stable(1, b, 1), key=abs)
err = lambda v: abs((Decimal(v) - ex) / ex)
print(f"{k:4d} {float(err(n)):.2e} {float(err(s)):.2e}")
Por que não existe uma estratégia ganhadora na Mega-Sena
Simule cartões com 6 a 20 números ou vários cartões, veja chance contra custo de cada esquema e leia por que a matemática exclui uma estratégia ganhadora, em dois níveis.
Uma só métrica ⟨ , ⟩ para dados e para funções: digite uma tabela de pontos ou uma função qualquer, ajuste até 32 funções de base (monômios, Fourier, Legendre, Chebyshev, Laguerre, Hermite) ou nove modelos não lineares, veja a matriz de Gram e o sistema normal aumentado, e leia uma referência completa para a aula.
Teoria de representações · Grupo simétrico, parte 1
Diagramas e tabelas de Young
Partições desenhadas como caixas, os comprimentos de gancho que contam as maneiras de preenchê-las e a correspondência de Robinson–Schensted, que transforma uma permutação num par de tabelas. Estes são os objetos combinatórios que indexam as representações irredutíveis do grupo simétrico, assunto dos próximos aplicativos.
Diagrama
Uma partição e seus ganchos
Clique numa caixa. O braço (caixas à direita) fica azul, a perna (caixas abaixo) fica rosa, e o comprimento do gancho é braço + perna + 1. O diagrama usa a notação inglesa: a linha mais longa fica em cima.
Correspondência
Robinson–Schensted: inserção por linhas
0
\(P\)
\(Q\)
Cada número é inserido na primeira linha: ele toma o lugar da menor entrada maior que ele, que é empurrada para a linha de baixo, e assim por diante, até que um número fique no fim de uma linha. As caixas azuis mudaram; a rosa é nova, e Q registra sua posição com o número do passo.
Tabelas
Tabelas padrão da forma escolhida
Uma tabela padrão preenche as caixas com 1, …, n, cada número uma vez, crescendo ao longo de cada linha e de cima para baixo em cada coluna. O passeio do gancho de Greene, Nijenhuis e Wilf sorteia uma delas com probabilidade uniforme.
O passeio coloca \(n\), depois \(n - 1\), e assim por diante: escolha uma caixa ao acaso e continue saltando para uma caixa aleatória do seu gancho até chegar a um canto, e coloque ali o maior número que resta.
Contagem
Duas identidades, verificadas
Somando sobre todas as partições de n: os quadrados dos números f somam n!, porque a correspondência é uma bijeção entre permutações e pares de tabelas padrão da mesma forma; e os próprios números f somam o número de involuções.
n
p(n)
\(\sum f^2\)
n!
\(\sum f\)
#\(\{w=w^{-1}\}\)
As involuções são contadas de forma independente, pela recorrência \(a(n) = a(n-1) + (n-1) a(n-2)\), então as marcas ✓ comparam dois cálculos diferentes.
História
Da análise substitucional às bijeções
Alfred Young introduziu seus diagramas e tabelas por volta de 1900, no trabalho sobre análise substitucional quantitativa, e no mesmo ano Ferdinand Georg Frobenius calculou os caracteres do grupo simétrico. A indexação das representações irredutíveis por partições nasceu dos dois trabalhos.
A fórmula dos comprimentos de gancho se deve a Frame, Robinson e Thrall (1954). Gilbert de Beauregard Robinson (1938) e Craige Schensted (1961) encontraram a correspondência, em formas diferentes, e Donald Knuth (1970) a estendeu para matrizes e palavras; Schützenberger depois explicou sua simetria.
A prova probabilística pelo passeio do gancho é de Greene, Nijenhuis e Wilf (1979).
Limites honestos
O que este aplicativo não faz
A correspondência é mostrada para permutações (números distintos, no máximo 12). Para palavras com letras repetidas, uma das tabelas é semipadrão; a mesma ideia vale, mas não é desenhada aqui.
As identidades da tabela são verificadas para n até 10, o que é evidência e não demonstração. As demonstrações estão no curso abaixo e nas referências.
Fórmula de gancho e conteúdo para tabelas semipadrão:
\[s_\lambda(1^m)=\#\{\text{semistandard tableaux of shape }\lambda,\ \text{entries}\le m\}=\prod_{(i,j)\in\lambda}\frac{m+j-i}{h(i,j)}\]
Curso
Um curso curto sobre diagramas e tabelas
Perguntas com respostas resolvidas, das definições à correspondência. Abra cada uma e tente antes de ler.
Básico
O que é um diagrama de Young?
Uma partição de \(n\) é uma lista \(\lambda=(\lambda_1\ge\lambda_2\ge\dots\ge\lambda_k>0)\) com \(\lambda_1+\dots+\lambda_k=n\), escrita \(\lambda\vdash n\). Seu diagrama de Young tem \(\lambda_i\) caixas na linha \(i\). Há \(p(n)\) partições: \(p(5)=7\). Lendo as colunas obtemos a partição conjugada \(\lambda'\); por exemplo \((4,2,1)'=(3,2,1,1)\).
O que é uma tabela de Young padrão?
Um preenchimento do diagrama com \(1,2,\dots,n\), cada número usado uma vez, crescente ao longo de cada linha e de cima para baixo em cada coluna. O número delas é \(f^\lambda\). Para \(\lambda=(2,1)\) há duas: primeira linha \(1\,2\) com \(3\) abaixo do \(1\), e primeira linha \(1\,3\) com \(2\) abaixo do \(1\). Logo \(f^{(2,1)}=2\).
O que é o gancho de uma caixa?
A própria caixa, as caixas à sua direita na mesma linha (o braço, \(a\)) e as caixas abaixo dela na mesma coluna (a perna, \(\ell\)). O comprimento do gancho é \(h=a+\ell+1\). Num canto da partição \(h=1\); na caixa \((1,1)\) de \(\lambda\) vale \(\lambda_1+\lambda'_1-1\).
A fórmula dos comprimentos de gancho
Calcule \(f^{(3,2)}\) com a fórmula dos comprimentos de gancho.
Os comprimentos de gancho são \(4,3,1\) na primeira linha e \(2,1\) na segunda. O produto é \(24\), logo \(f^{(3,2)}=5!/24=120/24=5\).
Verifique que \(\sum_{\lambda\vdash4}(f^\lambda)^2=4!\).
As cinco partições \((4),(3,1),(2,2),(2,1,1),(1^4)\) têm \(f=1,3,2,3,1\). Os quadrados somam \(1+9+4+9+1=24=4!\).
Mostre que \(f^{(n-1,1)}=n-1\).
Os comprimentos de gancho são \(n\) na caixa \((1,1)\), depois \(n-2,n-3,\dots,1\) no resto da linha 1, e \(1\) na caixa de baixo. O produto é \(n\,(n-2)!\), logo \(f=n!/(n\,(n-2)!)=n-1\). Diretamente: uma tabela padrão fica determinada por qual dos números \(2,\dots,n\) está na segunda linha.
Quantas tabelas semipadrão de forma \((2,1)\) têm entradas em \(\{1,2,3\}\)?
As linhas crescem fracamente, as colunas estritamente. Pela fórmula de gancho e conteúdo com \(m=3\): os conteúdos são \(0,1,-1\) e os ganchos \(3,1,1\), logo o número é \(\frac{(3+0)(3+1)(3-1)}{3\cdot1\cdot1}=8\). É a dimensão da representação adjunta de \(\mathfrak{sl}_3\).
Robinson–Schensted
Insira \(3\,1\,4\,2\,5\) e ache \(P\) e \(Q\).
Inserir 3: \(P=\{3\}\). Inserir 1: ele empurra o 3, que começa a linha 2. Inserir 4: ele termina a linha 1. Inserir 2: ele empurra o 4 da linha 1, e o 4 vai para o fim da linha 2. Inserir 5: ele termina a linha 1. O resultado é \(P=\begin{smallmatrix}1&2&5\\3&4\end{smallmatrix}\) e, registrando os passos em que as caixas apareceram, \(Q=\begin{smallmatrix}1&3&5\\2&4\end{smallmatrix}\). A forma é \((3,2)\), e \(f^{(3,2)}=5\) é o número de escolhas de \(Q\) dada a forma.
Por que é uma bijeção?
A última caixa acrescentada a \(P\) é a caixa onde \(Q\) tem sua maior entrada. Retire essa entrada de \(P\) e desfaça os empurrões: em cada linha acima, a maior entrada menor que ela é empurrada para cima. O que sai no topo é a última letra de \(w\). Repetindo isso recupera-se \(w\) por inteiro, logo a aplicação é injetiva, e a contagem dos pares dá \(\sum_\lambda (f^\lambda)^2=n!\), então ela também é sobrejetiva.
O que a forma diz sobre w?
Teorema de Schensted: o comprimento da primeira linha \(\lambda_1\) é o comprimento da maior subsequência crescente de \(w\), e o número de linhas é o comprimento da maior subsequência decrescente. Para \(3\,1\,4\,2\,5\) são \(3\) (por exemplo \(1\,2\,5\)) e \(2\) (por exemplo \(3\,1\)). O teorema de Greene dá também as outras linhas, em termos de uniões dessas subsequências.
Indo além
Quantas involuções há em \(S_n\)?
A correspondência tem a simetria \(P(w^{-1})=Q(w)\) (Schützenberger), então \(w=w^{-1}\) exatamente quando \(P=Q\). Então \(w\) fica determinada por uma única tabela padrão de tamanho \(n\), e o número de involuções é \(\sum_{\lambda\vdash n}f^\lambda\). Para \(n=4\): \(1+3+2+3+1=10\), e de fato \(S_4\) tem a identidade, \(6\) transposições e \(3\) transposições duplas.
Quantas tabelas padrão tem a escada \((3,2,1)\)?
Os comprimentos de gancho são \(5,3,1\), \(3,1\), \(1\); o produto é \(45\), logo \(f=720/45=16\).
Por que isto importa para as representações?
As representações complexas irredutíveis de \(S_n\) são indexadas pelas partições \(\lambda\vdash n\), e a dimensão da correspondente a \(\lambda\) é exatamente \(f^\lambda\). A identidade \(\sum(f^\lambda)^2=n!=|S_n|\) diz então que a álgebra de grupo é a soma das álgebras de matrizes \(M_{f^\lambda}(\mathbb C)\). Os próximos aplicativos constroem essas representações e seus caracteres; a contagem semipadrão acima é a dimensão da representação correspondente de \(GL_m\).
Referências: W. Fulton, Young Tableaux (Cambridge, 1997); B. Sagan, The Symmetric Group (2ª ed., Springer, 2001); R. Stanley, Enumerative Combinatorics, vol. 2, capítulo 7; D. Knuth, The Art of Computer Programming, vol. 3, seção 5.1.4.
Experimente em Python
Um script curto sem bibliotecas: comprimentos de gancho, a fórmula dos ganchos contra a contagem direta de tabelas padrão, a soma de quadrados, e Robinson–Schensted com sua inversa, verificados em todas as permutações de até 7 letras.
"""Young diagrams and tableaux: hook lengths, the hook length formula against a direct count, sum of squares = n!,
and Robinson-Schensted with its inverse, checked on every permutation of up to 7 letters. Standard library only."""
from itertools import permutations
from math import factorial
from functools import lru_cache
def partitions(n, m=None):
"""all partitions of n as tuples in weakly decreasing order"""
m = n if m is None else m
if n == 0: yield (); return
for k in range(min(n, m), 0, -1):
for rest in partitions(n - k, k): yield (k,) + rest
def conjugate(lam):
return tuple(sum(1 for x in lam if x > j) for j in range(lam[0])) if lam else ()
def hook_lengths(lam):
c = conjugate(lam)
return [[lam[i] - j - 1 + c[j] - i - 1 + 1 for j in range(lam[i])] for i in range(len(lam))]
def f_hook(lam):
"""number of standard tableaux by the hook length formula"""
p = 1
for row in hook_lengths(lam):
for h in row: p *= h
return factorial(sum(lam)) // p
@lru_cache(maxsize=None)
def f_count(lam):
"""number of standard tableaux by removing the box that holds the largest entry"""
if sum(lam) <= 1: return 1
total = 0
for i in range(len(lam)):
if i == len(lam) - 1 or lam[i] > lam[i + 1]:
mu = list(lam); mu[i] -= 1
total += f_count(tuple(x for x in mu if x))
return total
def rsk(w):
"""row insertion: returns (P, Q) as lists of rows"""
P, Q = [], []
for t, x in enumerate(w, 1):
r = 0
while True:
if r == len(P): P.append([x]); Q.append([t]); break
row = P[r]
c = next((k for k, y in enumerate(row) if y > x), None)
if c is None: row.append(x); Q[r].append(t); break
row[c], x = x, row[c]; r += 1
return P, Q
def inverse_rsk(P, Q):
P = [r[:] for r in P]; Q = [r[:] for r in Q]; out = []
for t in range(sum(map(len, P)), 0, -1):
r = next(i for i, row in enumerate(Q) if row and row[-1] == t)
y = P[r].pop(); Q[r].pop()
for i in range(r - 1, -1, -1):
c = max(k for k, z in enumerate(P[i]) if z < y)
P[i][c], y = y, P[i][c]
out.append(y)
if not P[-1]: P.pop(); Q.pop()
return out[::-1]
def longest_increasing(w):
best = []
for i, x in enumerate(w): best.append(1 + max([best[j] for j in range(i) if w[j] < x], default=0))
return max(best, default=0)
def inverse_perm(w):
inv = [0] * len(w)
for i, x in enumerate(w, 1): inv[x - 1] = i
return inv
if __name__ == "__main__":
print("n p(n) sum f^2 n! sum f")
for n in range(1, 11):
P = list(partitions(n))
assert all(f_hook(l) == f_count(l) for l in P)
s2 = sum(f_hook(l) ** 2 for l in P); s1 = sum(f_hook(l) for l in P)
assert s2 == factorial(n)
print(f"{n:<2} {len(P):<5} {s2:<8} {factorial(n):<6} {s1}")
print("hook lengths of (3,2):", hook_lengths((3, 2)), " f =", f_hook((3, 2)))
P, Q = rsk([3, 1, 4, 2, 5]); print("RSK of 3 1 4 2 5:", P, Q)
for n in range(1, 8):
involutions = 0
for w in permutations(range(1, n + 1)):
w = list(w); P, Q = rsk(w)
assert inverse_rsk(P, Q) == w
assert len(P[0]) == longest_increasing(w) # Schensted
assert len(P) == longest_increasing([-x for x in w])
P2, Q2 = rsk(inverse_perm(w)); assert (P2, Q2) == (Q, P) # symmetry
involutions += (P == Q)
assert involutions == sum(f_hook(l) for l in partitions(n))
print(f"n = {n}: all {factorial(n)} permutations pass; involutions = {involutions}")
Teoria de representações · Grupo simétrico, parte 2
Representações do grupo simétrico
Construa as representações irredutíveis de \(S_n\) com as próprias mãos: o módulo de Specht de uma partição, gerado por politabloides, a matriz pela qual uma permutação age nele e a tabela de caracteres que registra os traços. Tudo é calculado de forma exata no seu navegador.
Um tabloide é uma tabela em que se esquece a ordem dentro de cada linha, escrito {12|3} para as linhas {1,2} e {3}. O politabloide de t soma os tabloides de todas as tabelas obtidas permutando entradas dentro de cada coluna de t, com o sinal da permutação. Os politabloides das tabelas padrão formam uma base do módulo de Specht.
Ação
Como uma permutação age
Uma permutação renomeia as entradas de cada tabloide, então leva politabloides em politabloides. As colunas da matriz são as coordenadas de \(\pi e_t\) na base dos politabloides padrão, obtidas por álgebra linear exata; as entradas são sempre inteiras.
Caracteres
A tabela de caracteres
Linha \(\lambda\), coluna \(\mu\): o traço de uma permutação de tipo de ciclos \(\mu\) no módulo \(S^\lambda\). Embaixo de cada classe está seu tamanho. Clique numa linha para verificá-la; a primeira entrada de cada linha (a classe da identidade) é a dimensão \(f^\lambda\).
Cada entrada é um traço de uma matriz construída exatamente como acima, não uma consulta a tabelas. O script em Python abaixo recalcula as tabelas com a regra de Murnaghan–Nakayama, um método totalmente diferente, e compara.
História
Dos caracteres aos módulos
Frobenius determinou os caracteres dos grupos simétricos em 1900, e o trabalho de Young dessa mesma época deu a combinatória das partições que os indexam. Os módulos usados aqui foram construídos por Wilhelm Specht em 1935.
As notas de aula de Gordon James, de 1978, apresentaram a construção sobre corpos quaisquer, onde a base de politabloides continua sendo base mas os módulos podem não ser irredutíveis nem semissimples, e iniciaram a teoria modular das representações do grupo simétrico.
Limites honestos
O que este aplicativo não faz
Ele trabalha sobre os números complexos (na verdade os inteiros bastam para as matrizes), e só para n até 6 no explorador de módulos e 7 na tabela, porque o espaço dos tabloides cresce rápido.
Que os módulos de Specht sejam irredutíveis e dois a dois não isomorfos é um teorema, demonstrado nas referências. As verificações aqui (ortogonalidade dos caracteres) são coerentes com ele e, para estes n, equivalentes a ele.
Em resumo
As fórmulas
Tabloides, politabloides e o módulo de Specht:
\[\{t\}=\text{rows of }t\text{ as sets},\qquad e_t=\sum_{\sigma\in C_t}\operatorname{sgn}(\sigma)\,\sigma\{t\},\qquad S^\lambda=\operatorname{span}\{e_t\}\subset M^\lambda\]
Uma base e a dimensão:
\[\{e_t:\ t\text{ standard of shape }\lambda\}\text{ is a basis of }S^\lambda,\qquad \dim S^\lambda=f^\lambda=\frac{n!}{\prod h}\]
Perguntas com respostas resolvidas, da definição de representação à representação regular. Abra cada uma e tente antes de ler.
Básico
O que é uma representação e seu caráter?
Uma representação de um grupo \(G\) num espaço vetorial \(V\) é um homomorfismo \(\rho:G\to GL(V)\), isto é, matrizes com \(\rho(gh)=\rho(g)\rho(h)\). Seu caráter é \(\chi(g)=\operatorname{tr}\rho(g)\). Sempre \(\chi(e)=\dim V\). Exemplos para \(S_n\): a representação trivial (\(\chi=1\)), a representação sinal (\(\chi=\operatorname{sgn}\)) e a representação de permutação em \(\mathbb C^n\) (\(\chi(\pi)=\) o número de pontos fixos de \(\pi\)).
O que é irredutível, e quantas há?
Uma representação é irredutível se \(V\neq0\) não tem subespaço invariante além de \(0\) e \(V\). Sobre \(\mathbb C\) toda representação de um grupo finito é soma direta de irredutíveis (Maschke). O número de irredutíveis é igual ao número de classes de conjugação. Em \(S_n\) duas permutações são conjugadas exatamente quando têm o mesmo tipo de ciclos, então as classes correspondem às partições de \(n\): há \(p(n)\) irredutíveis, um para cada partição \(\lambda\), o módulo de Specht \(S^\lambda\).
Por que a tabela de caracteres basta?
Como \(\operatorname{tr}(\rho(g)\rho(h)\rho(g)^{-1})=\operatorname{tr}\rho(h)\), o caráter é constante nas classes de conjugação, então um valor por classe o descreve. E os caracteres determinam as representações: duas representações com o mesmo caráter são isomorfas, porque os caracteres irredutíveis são linearmente independentes.
Construindo os módulos
Construa \(S^{(2,1)}\) à mão e ache a matriz de \((1\,2)\).
Os tabloides de forma \((2,1)\) são \(\{12|3\},\{13|2\},\{23|1\}\). Para \(t=\begin{smallmatrix}1&2\\3\end{smallmatrix}\) o grupo de colunas é \(\{e,(1\,3)\}\), logo \(e_t=\{12|3\}-\{23|1\}\). Para \(t'=\begin{smallmatrix}1&3\\2\end{smallmatrix}\) é \(\{e,(1\,2)\}\) e \(e_{t'}=\{13|2\}-\{23|1\}\). Estes dois são independentes, então \(\dim S^{(2,1)}=2=f^{(2,1)}\). Agora \((1\,2)e_t=\{12|3\}-\{13|2\}=e_t-e_{t'}\) e \((1\,2)e_{t'}=\{23|1\}-\{13|2\}=-e_{t'}\). A matriz é \(\begin{pmatrix}1&0\\-1&-1\end{pmatrix}\), com traço \(0=\chi^{(2,1)}(\text{transposição})\).
Por que os politabloides das tabelas padrão formam uma base?
Independência: cada \(e_t\) padrão contém o tabloide \(\{t\}\), e \(\{t\}\) é o maior tabloide de \(e_t\) na ordem de dominância, então os tabloides líderes são distintos. Geração: qualquer politabloide \(e_s\) se reescreve como combinação de padrões pelas relações de Garnir, que dizem que \(\sum\operatorname{sgn}(\sigma)\,e_{\sigma t}=0\) quando \(\sigma\) percorre todas as permutações de um conjunto adequado de entradas tiradas de duas colunas adjacentes (um conjunto de Garnir). Os detalhes estão no livro de James. Em consequência \(\dim S^\lambda=f^\lambda\).
O que são \(S^{(n)}\) e \(S^{(1^n)}\)?
Para \((n)\) há um único tabloide e o grupo de colunas é trivial, logo \(e_t=\{t\}\) e \(\pi e_t=e_t\): a representação trivial. Para \((1^n)\) há de novo um único tabloide, mas o grupo de colunas é todo \(S_n\), logo \(e_t=\sum\operatorname{sgn}(\sigma)\sigma\{t\}\) e \(\pi e_t=\operatorname{sgn}(\pi)e_t\): a representação sinal. Na tabela, são a primeira e a última linha.
Caracteres
Verifique as relações de ortogonalidade para \(S_3\).
As classes \(e,(1\,2),(1\,2\,3)\) têm tamanhos \(1,3,2\). Os caracteres são \(\chi^{(3)}=(1,1,1)\), \(\chi^{(2,1)}=(2,0,-1)\), \(\chi^{(1^3)}=(1,-1,1)\). Então \(\langle\chi^{(2,1)},\chi^{(2,1)}\rangle=\frac{1\cdot4+3\cdot0+2\cdot1}{6}=1\) e \(\langle\chi^{(3)},\chi^{(2,1)}\rangle=\frac{1\cdot2+3\cdot0+2\cdot(-1)}{6}=0\). Também \(1^2+2^2+1^2=6=3!\).
Ache \(\chi^{(n-1,1)}\) sem matrizes.
A representação de permutação \(M^{(n-1,1)}=\mathbb C^n\) tem caráter \(\operatorname{fix}(\pi)\), e se decompõe como a trivial mais \(S^{(n-1,1)}\) (os vetores com soma das coordenadas nula). Logo \(\chi^{(n-1,1)}(\pi)=\operatorname{fix}(\pi)-1\). Para \(n=4\) na classe \((2,2)\) vale \(0-1=-1\), que é a entrada da tabela.
Por que os tamanhos das classes aparecem no produto interno?
O produto interno faz a média sobre o grupo, \(\frac1{n!}\sum_\pi\chi^\lambda(\pi)\overline{\chi^\mu(\pi)}\). Como os caracteres são constantes nas classes, a soma sobre uma classe de tamanho \(|C|\) é \(|C|\) vezes o valor. Para caracteres reais, como aqui, a barra pode ser omitida.
Indo além
O que é a representação regular?
É \(\mathbb C[S_n]\) agindo sobre si mesma por multiplicação, de dimensão \(n!\). Cada \(S^\lambda\) ocorre nela exatamente \(f^\lambda=\dim S^\lambda\) vezes, o que dá \(n!=\sum(f^\lambda)^2\). Seu caráter é \(n!\) na identidade e \(0\) nas outras, logo \(\sum_\lambda f^\lambda\chi^\lambda(\pi)=0\) para \(\pi\neq e\). Verifique em \(S_3\) em \((1\,2)\): \(1\cdot1+2\cdot0+1\cdot(-1)=0\).
Como calcular caracteres sem construir módulos?
Pela regra de Murnaghan–Nakayama: \(\chi^\lambda(\mu)\) é uma contagem com sinais das maneiras de retirar faixas de borda de tamanhos \(\mu_1,\mu_2,\dots\) do diagrama de \(\lambda\), cada faixa contada com o sinal \((-1)^{\text{altura}-1}\). O próximo aplicativo trata dessa regra, da regra de Young para os módulos de permutação \(M^\mu\) e da dualidade de Schur–Weyl.
Referências: G. James, The Representation Theory of the Symmetric Groups (Springer LNM 682, 1978); B. Sagan, The Symmetric Group (2ª ed., Springer, 2001); W. Fulton e J. Harris, Representation Theory (Springer, 1991); J.-P. Serre, Linear Representations of Finite Groups (Springer, 1977).
Experimente em Python
Um script só com a biblioteca padrão: politabloides, álgebra linear exata com frações, os traços nos módulos de Specht para n até 6, uma comparação com a regra de Murnaghan–Nakayama e as relações de ortogonalidade.
"""Representations of the symmetric group S_n: Specht modules by exact linear algebra, characters as traces, and a check against the
Murnaghan-Nakayama rule and the orthogonality relations. Standard library only (fractions, itertools, math)."""
from fractions import Fraction as F
from itertools import permutations, product
from math import factorial
def partitions(n, m=None):
m = n if m is None else m
if n == 0: yield (); return
for k in range(min(n, m), 0, -1):
for rest in partitions(n - k, k): yield (k,) + rest
def standard_tableaux(lam):
n = sum(lam); out = []; T = [[0] * x for x in lam]; cnt = [0] * len(lam)
def put(k):
if k > n: out.append([r[:] for r in T]); return
for i in range(len(lam)):
if cnt[i] < lam[i] and (i == 0 or cnt[i - 1] > cnt[i]):
T[i][cnt[i]] = k; cnt[i] += 1; put(k + 1); cnt[i] -= 1; T[i][cnt[i]] = 0
put(1); return out
def tabloid(rows): return tuple(tuple(sorted(r)) for r in rows)
def polytabloid(t):
"""e_t = sum over the column group of sgn(sigma) * sigma{t}, as a dict tabloid -> coefficient"""
cols = [[t[i][j] for i in range(len(t)) if len(t[i]) > j] for j in range(len(t[0]))]
def sign(p): return (-1) ** sum(1 for a in range(len(p)) for b in range(a) if p[b] > p[a])
vec = {}
for choice in product(*[list(permutations(range(len(c)))) for c in cols]):
rows = [list(r) for r in t]; s = 1
for j, (c, p) in enumerate(zip(cols, choice)):
s *= sign(p)
for i in range(len(c)): rows[i][j] = c[p[i]]
key = tabloid(rows); vec[key] = vec.get(key, 0) + s
return {k: v for k, v in vec.items() if v}
def act(p, vec):
"""p is a tuple with p[i-1] = image of i"""
out = {}
for tab, c in vec.items():
key = tabloid([[p[x - 1] for x in r] for r in tab]); out[key] = out.get(key, 0) + c
return out
def solve_coordinates(basis, w):
"""coordinates of w in the span of the basis vectors (dicts), exact; raises if w is not in the span"""
keys = sorted({k for b in basis for k in b} | set(w)); m = len(basis)
rows = [[F(b.get(k, 0)) for b in basis] + [F(w.get(k, 0))] for k in keys]
piv = []; r = 0
for c in range(m):
p = next((i for i in range(r, len(rows)) if rows[i][c] != 0), None)
if p is None: raise ValueError("dependent basis")
rows[r], rows[p] = rows[p], rows[r]; rows[r] = [x / rows[r][c] for x in rows[r]]
for i in range(len(rows)):
if i != r and rows[i][c] != 0: rows[i] = [x - rows[i][c] * y for x, y in zip(rows[i], rows[r])]
r += 1
assert all(rows[i][m] == 0 for i in range(r, len(rows))), "vector outside the span"
return [rows[i][m] for i in range(m)]
def character(lam, p):
"""trace of p on the Specht module S^lam, in the basis of standard polytabloids"""
basis = [polytabloid(t) for t in standard_tableaux(lam)]
tr = F(0)
for j, b in enumerate(basis): tr += solve_coordinates(basis, act(p, b))[j]
assert tr.denominator == 1; return int(tr)
def perm_of_type(mu):
p = []; s = 0
for c in mu: p += [s + (k + 1) % c + 1 for k in range(c)]; s += c
return tuple(p)
def class_size(mu):
n = sum(mu); d = 1
for c in set(mu): d *= c ** mu.count(c) * factorial(mu.count(c))
return factorial(n) // d
def murnaghan_nakayama(lam, mu):
"""characters from removing border strips (beta-numbers); independent of the construction above"""
if not mu: return 1 if sum(lam) == 0 else 0
r, rest = mu[0], mu[1:]; beta = [x + len(lam) - 1 - i for i, x in enumerate(lam)]; total = 0
for i, b in enumerate(beta):
nb = b - r
if nb < 0 or nb in beta: continue
sign = (-1) ** sum(1 for x in beta if nb < x < b)
new = sorted(beta[:i] + [nb] + beta[i + 1:], reverse=True)
total += sign * murnaghan_nakayama(tuple(x - (len(new) - 1 - k) for k, x in enumerate(new) if x - (len(new) - 1 - k) > 0), rest)
return total
if __name__ == "__main__":
for n in range(2, 7):
parts = list(partitions(n)); table = [[character(l, perm_of_type(m)) for m in parts] for l in parts]
for a, l in enumerate(parts):
for b, m in enumerate(parts): assert table[a][b] == murnaghan_nakayama(l, m), (l, m)
sizes = [class_size(m) for m in parts]
for a in range(len(parts)):
for b in range(len(parts)):
ip = sum(s * table[a][k] * table[b][k] for k, s in enumerate(sizes))
assert ip == (factorial(n) if a == b else 0)
print(f"n = {n}: {len(parts)} irreducible characters; traces on Specht modules = Murnaghan-Nakayama; rows orthogonal")
print("S_3 table (rows (3), (2,1), (1,1,1); columns e, (12), (123)):")
for l in partitions(3): print(l, [character(l, perm_of_type(m)) for m in [(1, 1, 1), (2, 1), (3,)]])
Teoria de representações · Grupo simétrico, parte 3
Caracteres em ação
Quatro usos do que os dois primeiros aplicativos construíram: retirar faixas de borda para calcular um caráter, decompor um módulo de permutação com a regra de Young, restringir e induzir adicionando e removendo caixas, e ver a dualidade de Schur e Weyl entre \(S_n e o\) grupo linear geral. Cada resultado é conferido com cálculos exatos.
Murnaghan–Nakayama
Retirando faixas de borda
Uma faixa de borda é uma forma torta conexa sem bloco \(2\times 2\), colada à borda do diagrama. Retire faixas de tamanhos \(\mu_1\), \(\mu_2\), … em sequência, de modo que o que sobra seja sempre um diagrama; cada sequência completa é uma tabela de faixas de borda, contada com o sinal (\(-1\)) elevado à (soma das alturas \(-\) número de faixas).
Regra de Young
Decompondo um módulo de permutação
O módulo \(M^\mu\) tem uma base de tabloides de forma \(\mu\). Ele contém \(S^\lambda\) exatamente \(K_{\lambda \mu}\) vezes, onde \(K_{\lambda \mu}\) conta os preenchimentos semipadrão de \(\lambda\) com \(\mu_1\) uns, \(\mu_2\) dois, e assim por diante. A matriz de Kostka é unitriangular para a ordem de dominância, e por isso os \(S^\lambda\) formam uma base dos caracteres.
Ramificação
Restrição e indução
Restringir \(S^\lambda\) de \(S_n a S_{n-1}\) retira uma caixa removível de todas as maneiras possíveis (marcadas em cor); induzir \(a S_{n+1}\) acrescenta uma caixa de todas as maneiras possíveis (marcadas com +). As multiplicidades são todas 1.
Verificação de dimensão: as dimensões das partes somam \(f^\lambda\) na restrição \(e (n+1) f^\lambda\) na indução. Iterar a restrição até \(S_1\) é o mesmo que contar tabelas padrão.
Dualidade de Schur–Weyl
Dois grupos, um espaço
Na potência tensorial \((\mathbb{C}^m)^{\otimes n}\), o grupo simétrico permuta os fatores e GL_m age em cada fator. As duas ações comutam e cada uma gera o comutante da outra, de modo que o espaço se decompõe como soma de \(S^\lambda \otimes V_\lambda\), com \(V_\lambda\) uma representação irredutível de GL_m. Só aparecem partições com no máximo m linhas.
\(\lambda\)
\(f^\lambda=\dim S^\lambda\)
\(\dim V_\lambda=s_\lambda(1^m)\)
\(f^\lambda\cdot\dim V_\lambda\)
A dimensão de \(V_\lambda\) é calculada pela fórmula do conteúdo-gancho, o produto sobre as caixas de (m + conteúdo)/gancho. Contar dimensões dá \(m^n = \Sigma f^\lambda\) dim \(V_\lambda\), o que a última linha confere.
História
Das faixas à dualidade
A regra de Young para os módulos de permutação remonta ao trabalho de Alfred Young por volta de 1900. A regra das faixas de borda para os caracteres foi conjecturada por Francis Murnaghan em 1937 e demonstrada por Tadasi Nakayama em 1940.
A dualidade entre \(S_n e o\) grupo linear geral está na tese de Issai Schur de 1901 e foi popularizada por Hermann Weyl em The Classical Groups (1939). A regra de ramificação é o ponto de partida da abordagem de Okounkov e Vershik às representações de \(S_n\).
Limites honestos
O que é verificado
As regras são implementadas como enunciadas nas referências e comparadas com traços exatos para \(n \le 7\) (Murnaghan–Nakayama, regra de Young) ou com contagens de dimensão (ramificação, Schur–Weyl). São verificações, não demonstrações.
O script em Python abaixo faz os mesmos testes só com a biblioteca padrão. Nada aqui cobre característica positiva, onde a regra de Young continua valendo para os módulos de permutação mas a decomposição em irredutíveis não.
Em resumo
As fórmulas
Regra de Murnaghan–Nakayama:
\[\chi^\lambda(\mu)=\sum_{T}(-1)^{\operatorname{ht}(T)},\qquad T\text{ a border-strip tableau of shape }\lambda\text{ and type }\mu=(\mu_1,\mu_2,\dots)\]
Regra de Young:
\[M^\mu\cong\bigoplus_{\lambda\trianglerighteq\mu}K_{\lambda\mu}\,S^\lambda,\qquad K_{\lambda\mu}=\#\{\text{semistandard tableaux of shape }\lambda\text{ and content }\mu\},\quad K_{\mu\mu}=1\]
\[\pi_\mu(\sigma)=\#\{\text{tabloids of shape }\mu\text{ fixed by }\sigma\}=\sum_\lambda K_{\lambda\mu}\chi^\lambda(\sigma)\]
Curso
Um curso curto sobre o cálculo de caracteres
Perguntas com respostas resolvidas, cada uma com um cálculo que você pode reproduzir nos aplicativos acima.
Faixas de borda
Calcule \(\chi^{(2{,}1)}\) num 3-ciclo.
O tipo de ciclos é \(\mu=(3)\), então retiramos uma faixa de borda de tamanho 3 de \((2,1)\). O diagrama inteiro é uma faixa: é conexo, não tem bloco \(2\times2\) e ocupa 2 linhas, logo sua altura é 2 e seu sinal é \((-1)^{2-1}=-1\). Portanto \(\chi^{(2,1)}(\text{3-ciclo})=-1\), como na tabela do segundo aplicativo.
Calcule \(\chi^{(2,2)}\) em \((2,2)\) e num 4-ciclo.
Para o 4-ciclo precisamos de uma faixa de tamanho 4 dentro de \((2,2)\), mas o quadrado \(2\times2\) tem um bloco \(2\times2\), logo não é faixa: o valor é \(0\). Para o tipo \((2,2)\) retiramos uma faixa de tamanho 2 e depois outra. A primeira é um dominó vertical na coluna da direita (altura 2, sinal \(-1\)) ou um dominó horizontal na linha de baixo (altura 1, sinal \(+1\)); depois do horizontal sobra \((2)\), de novo um dominó horizontal (\(+\cdot+\)); depois do vertical sobra \((1,1)\), um dominó vertical (\(-\cdot-=+\)). Duas tabelas, ambas positivas: \(\chi^{(2,2)}(2,2)=2\).
Por que a regra funciona com os beta-números?
Codifique \(\lambda\) pelo conjunto dos beta-números \(\lambda_i+(\ell-i)\), uma fileira de contas num ábaco. Retirar uma faixa de borda de tamanho \(r\) é mover uma conta \(r\) posições para baixo, até uma posição vazia, e a altura da faixa é o número de contas puladas. Assim a regra vira uma contagem de movimentos de contas, que é como o aplicativo calcula. A demonstração de que isto conta caracteres está no livro de Sagan (Seção 4.10).
Módulos de permutação
Decomponha \(M^{(2,1)}\) e \(M^{(2,2)}\).
Para \(\mu=(2,1)\) as tabelas semipadrão de conteúdo \((2,1)\) têm forma \((3)\) (uma: \(112\)) ou \((2,1)\) (uma: primeira linha \(11\), segunda linha \(2\)), logo \(M^{(2,1)}=S^{(3)}\oplus S^{(2,1)}\), com dimensões \(1+2=3\). Para \(\mu=(2,2)\) as formas são \((4)\), \((3,1)\), \((2,2)\), cada uma uma vez, logo \(M^{(2,2)}=S^{(4)}\oplus S^{(3,1)}\oplus S^{(2,2)}\) e \(1+3+2=6=\binom42\).
Quanto vale \(K_{\lambda\mu}\) para \(\lambda=(3,1)\), \(\mu=(2,1,1)\)?
Preencha \((3,1)\) com \(1,1,2,3\), crescente (em sentido fraco) nas linhas e estritamente crescente nas colunas. Os dois uns ficam na primeira linha. O 2 e o 3 se distribuem um na primeira linha e outro na segunda: \(1\,1\,2/3\) e \(1\,1\,3/2\). Ambas são válidas, logo \(K_{(3,1),(2,1,1)}=2\). Já \(K_{(2,2),(2,2)}=1\): só \(1\,1/2\,2\) serve.
Por que a matriz de Kostka é triangular?
Uma tabela semipadrão de forma \(\lambda\) e conteúdo \(\mu\) só existe se \(\lambda\trianglerighteq\mu\): os uns, dois, \dots, \(k\)'s devem caber todos nas primeiras \(k\) linhas, logo \(\lambda_1+\dots+\lambda_k\ge\mu_1+\dots+\mu_k\). Quando \(\lambda=\mu\) o preenchimento é forçado (a linha \(i\) cheia de \(i\)'s), logo \(K_{\mu\mu}=1\). Uma matriz inteira unitriangular é invertível sobre os inteiros, então os caracteres dos \(M^\mu\) e dos \(S^\lambda\) geram o mesmo reticulado.
Ramificação
Restrinja \(S^{(3,2,1)}\) a \(S_5\).
As caixas removíveis de \((3,2,1)\) estão nos fins das três linhas, e dão \(\operatorname{Res}S^{(3,2,1)}=S^{(2,2,1)}\oplus S^{(3,1,1)}\oplus S^{(3,2)}\). Dimensões: \(5+6+5=16=f^{(3,2,1)}\).
Induza \(S^{(2,1)}\) de \(S_3\) a \(S_4\).
Podem-se acrescentar caixas no fim da primeira linha, da segunda e numa nova terceira linha, o que dá \(S^{(3,1)}\oplus S^{(2,2)}\oplus S^{(2,1,1)}\). Dimensões \(3+2+3=8=4\cdot2=[S_4:S_3]\cdot\dim S^{(2,1)}\), como deve ser para o módulo induzido.
Como a ramificação dá a fórmula dos ganchos?
Restringir passo a passo de \(S_n\) a \(S_1\) retira uma caixa a cada passo, então a cadeia de diagramas é uma tabela padrão lida de trás para a frente. Como cada constituinte aparece uma vez, \(f^\lambda\) é o número dessas cadeias, \(f^\lambda=\sum_{\nu=\lambda-\square}f^\nu\). A fórmula dos ganchos é a forma fechada desta recursão.
Dualidade
Verifique Schur–Weyl para \(n=3\), \(m=2\).
As partições de 3 são \((3),(2,1),(1,1,1)\) com \(f=1,2,1\). Com \(m=2\), \(\dim V_{(3)}=4\), \(\dim V_{(2,1)}=2\), e \(V_{(1,1,1)}=0\) porque a forma tem 3 linhas e \(m=2\). Então \(1\cdot4+2\cdot2+1\cdot0=8=2^3\). As quatro dimensões de \(V_{(3)}\) são os cubos simétricos de \(\mathbb C^2\), as duas de \(V_{(2,1)}\) a representação padrão torcida pelo determinante.
Por que esta dualidade é útil?
Ela transfere informação entre os dois grupos. O traço de \(\sigma\) de tipo de ciclos \(\mu\) na potência tensorial é \(m^{\ell(\mu)}\), e o mesmo traço é \(\sum_\lambda\chi^\lambda(\mu)\dim V_\lambda\); com variáveis formais esta identidade é a expansão das somas de potências em funções de Schur, \(p_\mu=\sum_\lambda\chi^\lambda(\mu)s_\lambda\), que é a fórmula de Frobenius para os caracteres.
Referências: B. Sagan, The Symmetric Group (2ª ed., Springer, 2001), capítulos 2, 4 e 5; W. Fulton, Young Tableaux (Cambridge, 1997); R. Stanley, Enumerative Combinatorics vol. 2 (Cambridge, 1999), capítulo 7; G. James, The Representation Theory of the Symmetric Groups (Springer LNM 682, 1978).
Experimente em Python
Um script só com a biblioteca padrão: Murnaghan–Nakayama por faixas de borda, números de Kostka por força bruta, caracteres de permutação, dimensões da ramificação e a contagem de Schur–Weyl, tudo conferido para n até 7.
"""Characters at work: the Murnaghan-Nakayama rule (border strips), Kostka numbers by listing semistandard tableaux, Young's rule checked on
permutation characters, the branching rule on dimensions, and Schur-Weyl dimensions. Standard library only."""
from itertools import permutations, product
from math import factorial, prod
from functools import lru_cache
def partitions(n, m=None):
m = n if m is None else m
if n == 0: yield (); return
for k in range(min(n, m), 0, -1):
for rest in partitions(n - k, k): yield (k,) + rest
def hooks(lam):
conj = [sum(1 for x in lam if x > j) for j in range(lam[0])] if lam else []
return [[lam[i] - j - 1 + conj[j] - i - 1 + 1 for j in range(lam[i])] for i in range(len(lam))]
def f_hook(lam): return factorial(sum(lam)) // prod(h for r in hooks(lam) for h in r)
def dim_gl(lam, m):
"""number of semistandard tableaux with entries 1..m, by the hook content formula"""
num = prod(m + j - i for i, r in enumerate(lam) for j in range(r)); den = prod(h for r in hooks(lam) for h in r)
assert num % den == 0; return num // den
def remove_strips(lam, r):
"""border strips of size r that can be removed from lam: (smaller partition, height = rows spanned - 1)"""
out = []
# every partition nu contained in lam with |lam/nu| = r whose skew shape is connected and has no 2x2 block
n = sum(lam)
for nu in partitions(n - r):
if len(nu) > len(lam) or any(nu[i] > lam[i] for i in range(len(nu))): continue
cells = {(i, j) for i in range(len(lam)) for j in range(lam[i]) if j >= (nu[i] if i < len(nu) else 0)}
if any((i + 1, j) in cells and (i, j + 1) in cells and (i + 1, j + 1) in cells for (i, j) in cells): continue
seen, stack = set(), [next(iter(cells))] if cells else []
while stack:
c = stack.pop()
if c in seen: continue
seen.add(c); stack += [d for d in [(c[0]+1, c[1]), (c[0]-1, c[1]), (c[0], c[1]+1), (c[0], c[1]-1)] if d in cells]
if seen == cells: out.append((nu, len({i for i, _ in cells}) - 1))
return out
@lru_cache(maxsize=None)
def mn(lam, mu):
if not mu: return 1 if not lam else 0
return sum((-1) ** h * mn(nu, mu[1:]) for nu, h in remove_strips(lam, mu[0]))
def kostka_bruteforce(lam, mu):
"""list semistandard tableaux of shape lam with content mu: rows weakly increase, columns strictly increase"""
cells = [(i, j) for i in range(len(lam)) for j in range(lam[i])]; k = len(mu); count = 0
def rec(idx, T, used):
nonlocal count
if idx == len(cells):
count += (used == list(mu)); return
i, j = cells[idx]
for v in range(k):
if used[v] >= mu[v]: continue
if j > 0 and T[(i, j - 1)] > v: continue
if i > 0 and T[(i - 1, j)] >= v: continue
T[(i, j)] = v; used[v] += 1; rec(idx + 1, T, used); used[v] -= 1; del T[(i, j)]
rec(0, {}, [0] * k); return count
def perm_char(mu, nu):
"""number of tabloids of shape mu fixed by a permutation of cycle type nu"""
@lru_cache(maxsize=None)
def f(i, rem):
if i == len(nu): return 1 if not any(rem) else 0
return sum(f(i + 1, rem[:r] + (c - nu[i],) + rem[r + 1:]) for r, c in enumerate(rem) if c >= nu[i])
return f(0, tuple(mu))
def removable(lam): return [tuple(x for x in lam[:i] + (lam[i] - 1,) + lam[i + 1:] if x) for i in range(len(lam)) if i == len(lam) - 1 or lam[i] > lam[i + 1]]
if __name__ == "__main__":
for n in range(1, 8):
P = list(partitions(n))
for mu in P:
for nu in P:
assert perm_char(mu, nu) == sum(kostka_bruteforce(lam, mu) * mn(lam, nu) for lam in P), (mu, nu) # Young's rule + MN
for lam in P:
if n > 1: assert sum(f_hook(r) for r in removable(lam)) == f_hook(lam) # branching, dimensions
for m in range(1, 6): assert sum(f_hook(l) * (dim_gl(l, m) if len(l) <= m else 0) for l in P) == m ** n # Schur-Weyl
print(f"n = {n}: Murnaghan-Nakayama + Kostka numbers reproduce the permutation characters; branching and Schur-Weyl dimensions agree")
print("chi^(2,2) at (2,2) =", mn((2, 2), (2, 2)), "; chi^(3,1) at (4) =", mn((3, 1), (4,)), "; chi^(3,2,1) at (3,2,1) =", mn((3, 2, 1), (3, 2, 1)))
print("Kostka (3,1) vs (2,1,1):", kostka_bruteforce((3, 1), (2, 1, 1)), "; (2,2) vs (2,2):", kostka_bruteforce((2, 2), (2, 2)))
Teoria de representações · Grupo simétrico, parte 4
Exercícios e quiz
Pratique o que a série construiu. Exercícios sem fim sobre comprimentos de gancho, Robinson–Schensted, caracteres, números de Kostka, ramificação, Schur–Weyl e classes de conjugação, cada um com resposta exata e solução comentada, ou um quiz de dez perguntas com a nota no final.
Prática
Um exercício
Todas as respostas são inteiros. O gerador é determinístico: a mesma semente dá a mesma sequência de exercícios, então você pode compartilhar uma semente com uma turma. Cada resposta foi conferida com cálculos independentes por força bruta (contagem de tabelas, permutações, tabloides e a fórmula de Frobenius).
Resumo
O que os quatro aplicativos cobriram
Diagramas e tabelas de Young: partições como caixas, comprimentos de gancho, a fórmula dos ganchos para o número de tabelas padrão e a correspondência de Robinson–Schensted entre permutações e pares de tabelas.
Representações de \(S_n\): módulos de Specht construídos com politabloides, as matrizes das permutações agindo neles, a tabela de caracteres e suas relações de ortogonalidade.
Caracteres em ação: a regra de Murnaghan–Nakayama, a regra de Young e os números de Kostka, a ramificação e a dualidade de Schur–Weyl. Os exercícios aqui usam tudo isso.
Em seguida
Para onde ir daqui
Funções simétricas: os caracteres se reúnem na característica de Frobenius, que leva \(S^\lambda\) à função de Schur \(s_\lambda e\) produtos de indução a produtos de funções; a regra de Littlewood–Richardson descreve então a indução de subgrupos de Young \(S_a \times S_b\).
Outras construções e corpos: a abordagem de Okounkov e Vershik constrói \(S^\lambda a\) partir da cadeia \(S_1 \subset S_2 \subset\) … usando só a ramificação, as álgebras de Hecke deformam a álgebra de grupo, e em corpos de característica positiva os módulos \(S^\lambda\) deixam de ser irredutíveis (James).
Permutações aleatórias: pela RSK uma permutação uniforme gera uma forma aleatória (medida de Plancherel). A maior subsequência crescente é cerca de \(2\sqrt{n}\) (Vershik–Kerov, Logan–Shepp) e suas flutuações seguem a lei de Tracy–Widom (Baik–Deift–Johansson, 1999).
Respostas curtas às perguntas que surgem ao resolver os exercícios.
Em que ordem devo fazer os temas?
Primeiro comprimentos de gancho e contagem de tabelas, que só precisam do diagrama. Depois Robinson–Schensted (um procedimento mecânico, mas o teorema de Greene o relaciona com subsequências), depois os caracteres de Murnaghan–Nakayama, depois números de Kostka e tabloides fixos, que juntos explicam a regra de Young. Ramificação e Schur–Weyl usam tudo o que veio antes.
Como conferir um valor de caráter sem a tabela?
Três testes rápidos: o valor na identidade é \(f^\lambda\); a forma conjugada satisfaz \(\chi^{\lambda'}(\mu)=\operatorname{sgn}(\mu)\chi^\lambda(\mu)\), com \(\operatorname{sgn}(\mu)=(-1)^{n-\ell(\mu)}\); e para \(\mu\neq(1^n)\) as somas \(\sum_\lambda f^\lambda\chi^\lambda(\mu)\) das colunas se anulam (representação regular).
Quais erros são comuns com faixas de borda?
Retirar células que deixam algo que não é partição (o resto ainda deve ser um diagrama); tomar uma faixa que contém um bloco \(2\times2\) (não permitido); tomar um conjunto desconexo de células; e contar a altura como o número de linhas em vez de linhas menos um (o sinal é \((-1)^{\text{linhas}-1}\)). Uma faixa de tamanho 1 tem sempre sinal \(+1\).
Há atalhos para os números de Kostka?
\(K_{\lambda\mu}=0\) a menos que \(\lambda\trianglerighteq\mu\); \(K_{\lambda\lambda}=1\); \(K_{\lambda,(1^n)}=f^\lambda\); e \(K_{(n),\mu}=1\) para todo \(\mu\). Em geral, monte a tabela acrescentando uma faixa horizontal de tamanho \(\mu_1\), depois \(\mu_2\), e assim por diante, e conte as maneiras de chegar a \(\lambda\); a solução mostrada pelo aplicativo lista essas contagens passo a passo.
Referências: B. Sagan, The Symmetric Group (2ª ed., Springer, 2001), com exercícios em todos os capítulos; W. Fulton, Young Tableaux (Cambridge, 1997); R. Stanley, Enumerative Combinatorics vol. 2 (Cambridge, 1999); D. Romik, The Surprising Mathematics of Longest Increasing Subsequences (Cambridge, 2015).
Faça listas de exercícios em Python
Um script só com a biblioteca padrão que imprime uma lista de exercícios e o gabarito a partir de uma semente. Suas respostas vêm de métodos diferentes dos do aplicativo: retirada de cantos, a fórmula de Frobenius para os caracteres, listagem de tabelas e contagem de permutações e tabloides.
"""Exercises on Young tableaux and the symmetric group, with an answer key computed by methods independent of the apps:
dimensions by removing corners, characters by the Frobenius formula (not Murnaghan-Nakayama), Kostka numbers by listing tableaux,
fixed tabloids by brute force, class sizes by counting permutations. Standard library only.
Usage: python3 rep_exercises.py [seed] [how_many] prints a worksheet and then the answer key."""
import sys, random
from itertools import permutations
from math import factorial
from functools import lru_cache
def partitions(n, m=None):
m = n if m is None else m
if n == 0: yield (); return
for k in range(min(n, m), 0, -1):
for rest in partitions(n - k, k): yield (k,) + rest
def corners(lam):
return [i for i in range(len(lam)) if i == len(lam) - 1 or lam[i] > lam[i + 1]]
@lru_cache(None)
def dim(lam):
"""standard Young tableaux of shape lam, by removing the corner that holds the largest entry"""
if sum(lam) <= 1: return 1
t = 0
for i in corners(lam):
q = list(lam); q[i] -= 1
t += dim(tuple(x for x in q if x))
return t
def hook(lam, i, j):
return lam[i] - j - 1 + sum(1 for r in range(i + 1, len(lam)) if lam[r] > j) + 1
def rsk(w):
P, Q = [], []
for t, x in enumerate(w, 1):
r = 0
while True:
if r == len(P): P.append([x]); Q.append([t]); break
row = P[r]; c = next((k for k, v in enumerate(row) if v > x), None)
if c is None: row.append(x); Q[r].append(t); break
row[c], x = x, row[c]; r += 1
return P, Q
def frobenius(lam, mu):
"""chi^lam(mu) = coefficient of x^(lam+delta) in (Vandermonde) * p_mu, with k = len(lam) variables"""
k = len(lam); delta = list(range(k - 1, -1, -1)); target = [lam[i] + delta[i] for i in range(k)]
@lru_cache(None)
def ways(rem, idx):
if idx == len(mu): return 1 if all(x == 0 for x in rem) else 0
t = 0
for j in range(k):
if rem[j] >= mu[idx]:
r = list(rem); r[j] -= mu[idx]; t += ways(tuple(r), idx + 1)
return t
total = 0
for s in permutations(range(k)):
sign = 1
for a in range(k):
for b in range(a + 1, k):
if s[a] > s[b]: sign = -sign
rem = tuple(target[i] - delta[s[i]] for i in range(k))
if min(rem) >= 0: total += sign * ways(rem, 0)
return total
def kostka(lam, mu):
cells = [(i, j) for i, r in enumerate(lam) for j in range(r)]
T = {}; used = [0] * len(mu)
def rec(k):
if k == len(cells): return 1
i, j = cells[k]; t = 0
for v in range(1, len(mu) + 1):
if used[v - 1] >= mu[v - 1]: continue
if j and T[(i, j - 1)] > v: continue
if i and T[(i - 1, j)] >= v: continue
T[(i, j)] = v; used[v - 1] += 1; t += rec(k + 1); used[v - 1] -= 1
return t
return rec(0)
def perm_of_type(nu):
p, s = [], 0
for c in nu:
p += [s + (k + 1) % c for k in range(c)]; s += c
return p
def fixed_tabloids(mu, nu):
n = sum(mu); p = perm_of_type(nu); a = [0] * n; c = [0] * len(mu)
def rec(k):
if k == n: return 1 if all(a[p[x]] == a[x] for x in range(n)) else 0
t = 0
for r in range(len(mu)):
if c[r] < mu[r]: a[k] = r; c[r] += 1; t += rec(k + 1); c[r] -= 1
return t
return rec(0)
def weyl_dim(lam, m):
if len(lam) > m: return 0
l = list(lam) + [0] * (m - len(lam)); num = den = 1
for i in range(m):
for j in range(i + 1, m): num *= l[i] - l[j] + j - i; den *= j - i
return num // den
def cycle_type(p):
seen, out = set(), []
for i in range(len(p)):
if i not in seen:
c, j = 0, i
while j not in seen: seen.add(j); j = p[j]; c += 1
out.append(c)
return tuple(sorted(out, reverse=True))
def class_size_count(mu):
return sum(1 for p in permutations(range(sum(mu))) if cycle_type(p) == tuple(mu))
def exercise(rnd, kind):
if kind == 0:
n = rnd.randint(4, 8); lam = rnd.choice(list(partitions(n)))
return f"How many standard Young tableaux have shape {lam}?", dim(lam)
if kind == 1:
n = rnd.randint(4, 8); lam = rnd.choice(list(partitions(n))); i = rnd.randrange(len(lam)); j = rnd.randrange(lam[i])
return f"Hook length of the box in row {i+1}, column {j+1} of the diagram {lam}?", hook(lam, i, j)
if kind == 2:
n = rnd.randint(5, 7); w = rnd.sample(range(1, n + 1), n); P, Q = rsk(w)
return f"Row insertion of the word {w}: last entry of the first row of P?", P[0][-1]
if kind == 3:
n = rnd.randint(4, 6); lam = rnd.choice(list(partitions(n))); mu = rnd.choice(list(partitions(n)))
return f"Character value chi^{lam} on the cycle type {mu}?", frobenius(lam, mu)
if kind == 4:
n = rnd.randint(4, 6); mu = rnd.choice([p for p in partitions(n) if len(p) > 1]); lam = rnd.choice(list(partitions(n)))
return f"Kostka number K_({lam},{mu})?", kostka(lam, mu)
if kind == 5:
n = rnd.randint(4, 7); lam = rnd.choice(list(partitions(n)))
return f"Irreducible constituents of the restriction of S^{lam} from S_{n} to S_{n-1}?", len(corners(lam))
if kind == 6:
n = rnd.randint(3, 6); m = rnd.randint(2, 4); lam = rnd.choice(list(partitions(n)))
return f"Dimension of the GL_{m} module V_{lam} (0 if more than {m} rows)?", weyl_dim(lam, m)
if kind == 7:
n = rnd.randint(4, 6); mu = rnd.choice(list(partitions(n)))
return f"Permutations in S_{n} of cycle type {mu}?", class_size_count(mu)
n = rnd.randint(4, 6); mu = rnd.choice([p for p in partitions(n) if len(p) > 1]); nu = rnd.choice(list(partitions(n)))
return f"Tabloids of shape {mu} fixed by a permutation of cycle type {nu}?", fixed_tabloids(mu, nu)
def self_test():
for n in range(1, 7):
P = list(partitions(n)); fact = factorial(n)
for lam in P: assert frobenius(lam, (1,) * n) == dim(lam)
assert sum(dim(l) ** 2 for l in P) == fact
for a in P:
for b in P:
s = sum(class_size_count(mu) * frobenius(a, mu) * frobenius(b, mu) for mu in P)
assert s == (fact if a == b else 0), (a, b)
print("self-test passed: Frobenius characters are orthogonal for n <= 6, dimensions agree with corner removal")
if __name__ == "__main__":
seed = int(sys.argv[1]) if len(sys.argv) > 1 else 1; count = int(sys.argv[2]) if len(sys.argv) > 2 else 9
self_test(); rnd = random.Random(seed); items = [exercise(rnd, k % 9) for k in range(count)]
print(f"\nWorksheet (seed {seed})")
for k, (q, a) in enumerate(items, 1): print(f"{k:2d}. {q}")
print("\nAnswer key")
for k, (q, a) in enumerate(items, 1): print(f"{k:2d}. {a}")
Resolvendo a quíntica: do polinômio ao seu grupo de Galois
Escolha uma quíntica irredutível, ou deixe o app sortear uma, e acompanhe o método passo a passo: discriminante, raízes reais, fatoração módulo \(p\), a sêxtica resolvente e o veredito. Quando o grupo é solúvel, veja as resolventes de Lagrange construírem as raízes a partir de raízes quintas. Depois treine com exercícios novos e correção imediata.
Bancada
Diagnostique uma quíntica
Tudo é calculado exatamente com inteiros grandes, e as raízes com cerca de 80 dígitos. Abra as caixas "Lembrete" para os teoremas por trás de cada passo.
Monodromia
Raízes em movimento: laços constroem o grupo
Varie o termo constante: \(f(x)+t\). Em alguns valores especiais \(t_k\) duas raízes colidem. Dê uma volta em torno de um deles e as raízes voltam permutadas. As permutações de todos esses laços geram o grupo de monodromia.
Ressalva: os laços calculam o grupo de Galois da família \(f(x)+t\) sobre \(\mathbb C(t)\) (o grupo de monodromia geométrico), que não é o grupo de Galois de \(f\) sobre \(\mathbb Q\). O seu \(f\) é só o membro \(t=0\) da família, e seu grupo é um subgrupo do grupo da família sobre \(\mathbb Q(t)\). Compare \(x^5-x-1\) (os laços dão \(S_5\), e \(\mathbb Q\) também), o exemplo cíclico (os laços dão \(S_5\), mas \(G=C_5\): um membro muito especial) e \(x^5-2\) (os laços dão só \(C_5\), enquanto \(G=F_{20}\) porque \(\zeta_5\notin\mathbb Q\)).
Resolvendo
Resolventes de Lagrange: as raízes a partir de raízes quintas
Prática
Exercícios com correção imediata
Cada exercício é uma quíntica nova (os exemplos-base são transladados e refletidos ao acaso). Responda as cinco perguntas em ordem; as respostas são calculadas pelo mesmo núcleo exato que move a bancada.
Para lembrar
Os cinco grupos transitivos num relance
Grupo
\(\Delta\)
Sêxtica resolvente
Padrões mód \(p\)
Solúvel?
\(C_5\) (5)
quadrado
raiz racional
5, 1+1+1+1+1
sim
\(D_5\) (10)
quadrado
raiz racional
5, 1+2+2, 1+1+1+1+1
sim
\(F_{20}\) (20)
não quadrado
raiz racional
5, 1+4, 1+2+2, 1+1+1+1+1
sim
\(A_5\) (60)
quadrado
sem raiz racional
5, 1+1+3, 1+2+2, 1+1+1+1+1
não
\(S_5\) (120)
não quadrado
sem raiz racional
5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1
não
Galois: \(f\) é solúvel por radicais exatamente quando \(G\) é um grupo solúvel. Dos cinco, só \(A_5\) (simples, não abeliano) e \(S_5\) não são. Esse é o teorema de Abel-Ruffini, com um algoritmo para decidir cada caso.
Torre para \(F_{20}\): \(\mathbb Q\subset L\subset L(\zeta_5)\subset\) corpo de decomposição, com \(\mathrm{Gal}=C_4\), depois \(\zeta_5\), depois \(C_5\). Cada andar é uma extensão cíclica: junta-se uma raiz da unidade e depois um radical (teoria de Kummer).
Lagrange: com \(\zeta=e^{2\pi i/5}\) e as raízes numeradas ciclicamente, \(R_j=\sum_k\zeta^{jk}\alpha_k\) satisfaz \(R_j^5\in\) o corpo logo abaixo, e \(\alpha_k=\frac15\sum_j\zeta^{-jk}R_j\), com \(R_0=-a_4\). É assim que as raízes são escritas com radicais.
Nível de pós-graduaçãoPressupõe teoria de Galois, análise complexa e alguma familiaridade com funções elípticas (constantes teta, a função modular \(\lambda\)). As fórmulas são dadas por inteiro; as demonstrações são esboçadas nas caixas "Lembrete".
Álgebra e teoria dos números · Teoria de Galois · funções elípticas
A quíntica por funções elípticas: Hermite–Kronecker–Brioschi, com raízes certificadas
Digite uma quíntica qualquer. O app a reduz à forma de Bring–Jerrard com passos de Tschirnhaus que exigem apenas uma quadrática e uma cúbica, resolve \(w^5-w+\rho=0\) em forma fechada com funções teta de Jacobi (Hermite, 1858), leva as raízes de volta e então prova, em aritmética inteira exata, que cada raiz está em seu próprio disco minúsculo. Abaixo: a monodromia do radical de Bring, a equação modular de grau 5, uma breve história e exercícios.
Bancada
Resolva uma quíntica
As raízes são calculadas em ponto fixo com inteiros grandes e algumas centenas de bits de precisão de trabalho; o certificado usa apenas aritmética inteira exata. Abra as caixas "Lembrete" para a matemática de cada passo.
Superfície de Riemann
Monodromia do radical de Bring
As raízes de \(w^5-w+\rho=0\) formam um recobrimento de cinco folhas do plano \(\rho\) com quatro pontos de ramificação finitos \(\beta_j=\tfrac45\,5^{-1/4}\,i^{\,j-1}\), onde \(\rho^4=4^4/5^5\) e duas raízes colidem. O ponto-base é \(\rho=0\), com raízes \(0,1,-1,i,-i\) numeradas de 1 a 5. Clique num laço: \(\rho\) dá uma volta em torno de \(\beta_j\) e volta, e as raízes, acompanhadas por continuação, trocam duas delas. Componha vários laços e veja o grupo gerado crescer.
Plano \(\rho\): pontos de ramificação \(\times\), ponto-base 0, laço atual.
Plano \(w\): as cinco raízes, numeradas em \(\rho=0\), com rastros.
Cada ponto de ramificação simples dá uma transposição. O recobrimento é conexo de grau primo, logo o grupo de monodromia é um subgrupo transitivo de \(S_5\) gerado por transposições, isto é, \(S_5\): o grupo de Galois de \(w^5-w+\rho\) sobre \(\mathbb C(\rho)\) não é solúvel, o que é Abel–Ruffini em forma geométrica. A fórmula de Hermite não contradiz isso. O módulo \(k\) é algébrico de grau 4 sobre \(\mathbb C(\rho^2)\), mas o nome \(q\) é transcendente sobre ele: as funções elípticas são o ingrediente novo.
Teoria
Os ingredientes elípticos
As constantes teta de Jacobi com nome \(q\): \(\theta_2=2\sum_{n\ge0}q^{(n+1/2)^2}\) e \(\theta_3=\sum_{n\in\mathbb Z}q^{n^2}\). A função modular \(\lambda=k^2=\theta_2^4/\theta_3^4=16q-128q^2+704q^3-\cdots\) é um Hauptmodul para \(\Gamma(2)\). Sua série inversa \(q=x+8x^2+84x^3+992x^4+\cdots\), com \(x=\lambda/16\), dá o ponto de partida da iteração de Newton que calcula \(q\) aqui com precisão arbitrária, sem precisar de AGM complexa.
A equação modular de Jacobi de grau 5: com \(u=\lambda(q)^{1/8}\) e \(v=\lambda(q^5)^{1/8}\), \(u^6-v^6+5u^2v^2(u^2-v^2)-4uv(1-u^4v^4)=0\). Para \(u\) fixo, é a sêxtica de Jacobi em \(v\); suas seis raízes correspondem aos seis subgrupos de ordem 5 do reticulado de períodos módulo 5, com nomes \(q^5\) e \(\zeta^jq^{1/5}\). Seu grupo de Galois é \(PSL_2(\mathbb F_5)\cong A_5\), que age em 6 pontos e também em 5. Esse isomorfismo é a ponte entre a quíntica e as funções elípticas.
Hermite e Kronecker mostraram que a resolvente da quíntica de Bring–Jerrard é, a menos de uma transformação de Tschirnhaus, a sêxtica de Jacobi; por isso as raízes são quocientes de valores teta em \(q^5\) e \(\zeta^jq^{1/5}\). Brioschi preferia a forma normal com um parâmetro \(x^5-10Cx^3+45C^2x-C^2=0\). Klein (1884) explicou todas essas soluções geometricamente: \(A_5\) age como o grupo icosaédrico na esfera de Riemann (a curva modular \(X(5)\) tem gênero 0), e a quíntica se resolve invertendo os invariantes icosaédricos, com a hipergeométrica \({}_2F_1\) de Schwarz.
Cockle e Harley (década de 1860) deram ainda outra forma fechada: as raízes de \(x^5-x+\rho\) como séries hipergeométricas \({}_4F_3\) em \(\tfrac{3125}{256}\rho^4\). Todas convergem só até o ponto de ramificação mais próximo \(|\rho|=\tfrac45\,5^{-1/4}\approx0{,}536\); a fórmula elíptica não tem esse limite, e por isso é a usada aqui.
O que este app acrescenta
Aperfeiçoando a receita clássica
Aritmética
Implementação numérica típica Ponto flutuante numa única precisão de trabalho.
Este app Ponto fixo com inteiros grandes na precisão que você escolher (20 a 250 dígitos); doubles só fornecem valores iniciais.
Ramos
Implementação numérica típica Raízes oitavas e argumentos tirados da biblioteca; um ramo errado dá, em silêncio, algo que não é raiz.
Este app Os argumentos são acompanhados explicitamente; os quatro módulos e os dois sinais são testados e cada um é verificado, de modo que nenhum ramo errado passa.
Correção
Implementação numérica típica Imprime-se um resíduo pequeno.
Este app Um certificado exato: \(f\) é avaliado em inteiros em pontos diádicos e os discos de Smith provam que cada raiz está isolada e localizada; informa-se o número de dígitos certificados.
Este app Qualquer quíntica inteira, não mônica, com coeficientes enormes. Raízes repetidas são detectadas por mdc exato; \(d_1=0\) é resolvido por raiz quinta; passo quadrático degenerado é tratado.
Pedagogia
Implementação numérica típica Uma caixa-preta.
Este app Cada passo mostra seus números e uma caixa de Lembrete; a superfície de Riemann e sua monodromia são desenhadas; todas as grandezas intermediárias ficam expostas.
São propriedades desta implementação, não um veredito sobre as demais. O pôster de 1994 de Trott e Adamchik mostrou o método inteiro num relance; aqui a mesma matemática é reconstruída para que cada número possa ser conferido.
História
De Bring à solução elíptica
1786 Erland Bring reduz a quíntica geral a \(x^5+px+q\) por uma transformação de Tschirnhaus de grau 4.
1799–1824 A prova incompleta de Ruffini e depois a de Abel (1824) de que a quíntica geral não é resolúvel por radicais.
1832 Galois: resolubilidade por radicais é resolubilidade do grupo de Galois; \(A_5\) é simples.
1834 George Jerrard redescobre e estende a redução de Bring: a forma de Bring–Jerrard.
1858 Hermite, Kronecker e Brioschi resolvem a quíntica com funções modulares elípticas; a fórmula teta de Hermite é a usada aqui.
1884 Felix Klein, Lições sobre o Icosaedro: a quíntica como o problema de inverter os invariantes icosaédricos.
1994 Michael Trott e Victor Adamchik apresentam Solving the Quintic with Mathematica no Congresso Internacional de Matemáticos em Zurique.
2026 Este app: o mesmo caminho, com aritmética certificada e a monodromia à vista.
As datas são as usualmente dadas na literatura; veja as referências abaixo.
Exercícios
Exercícios de pós-graduação
Tente antes de abrir as dicas.
1. Mostre que os pontos de ramificação de \(w^5-w+\rho\) são \(\rho^4=4^4/5^5\).
O discriminante de \(x^5+ax+b\) é \(5^5b^4+4^4a^5\); com \(a=-1\), \(b=\rho\) ele se anula sse \(5^5\rho^4=4^4\). Equivalentemente, \(5w^4=1\) e \(\rho=w-w^5=\tfrac45w\).
2. Prove que o grupo de Galois de \(w^5-w+\rho\) sobre \(\mathbb C(\rho)\) é \(S_5\).
Como \(\rho=w-w^5\), o corpo \(\mathbb C(w)\) tem grau 5 sobre \(\mathbb C(\rho)\), logo o polinômio é irredutível. Num ponto de ramificação duas raízes colidem simplesmente, então o grupo de inércia é gerado por uma transposição. Um subgrupo transitivo de \(S_p\) que contém uma transposição é \(S_p\).
3. Verifique que a equação modular de Jacobi vale até a segunda ordem em \(q\) quando \(u^8=\lambda(q)\) e \(v^8=\lambda(q^5)\).
De \(\lambda=16q(1-8q+\cdots)\): \(u^6=\lambda^{3/4}=8q^{3/4}(1-6q+\cdots)\) e \(uv=2q^{3/4}(1-q+\cdots)\), logo \(4uv=8q^{3/4}(1-q+\cdots)\). Os termos de ordem \(q^{3/4}\) em \(u^6-4uv\) se cancelam, restando \(-40q^{7/4}\), que se cancela com \(5u^4v^2=40q^{7/4}+\cdots\).
4. Por que a redução de Bring não contradiz o teorema de Abel–Ruffini?
Ela adjunge apenas raízes quadradas e cúbicas, uma extensão solúvel do corpo-base, e sobre o corpo ampliado a quíntica e sua forma de Bring–Jerrard têm o mesmo corpo de decomposição. Assim, se \(z^5+d_1z+d_0\) fosse solúvel por radicais para \(d_1,d_0\) genéricos, a quíntica geral também seria; toda a dificuldade já está na família de dois parâmetros e, após a mudança de escala, no único parâmetro \(\rho\).
5. Ache a série de Lagrange da raiz de \(w^5-w+\rho\) próxima de 0 e seu raio de convergência.
A raiz resolve \(w=\rho+w^5\), logo \(w=\sum_{n\ge0}\binom{5n}{n}\frac{\rho^{4n+1}}{4n+1}=\rho+\rho^5+5\rho^9+35\rho^{13}+\cdots\). Seu raio é a distância ao ponto de ramificação mais próximo que ela encontra, \(\tfrac45\,5^{-1/4}\approx0{,}536\).
Referências: C. Hermite, Sur la résolution de l'équation du cinquième degré, C. R. Acad. Sci. 46 (1858); L. Kronecker, mesmo volume; F. Klein, Vorlesungen über das Ikosaeder (1884); B. T. Smith, Error bounds for zeros of a polynomial based upon Gerschgorin's theorems, J. ACM 17 (1970); V. Adamchik e D. Jeffrey, Polynomial transformations of Tschirnhaus, Bring and Jerrard, ACM SIGSAM Bulletin 37 (2003); R. B. King, Beyond the Quartic Equation (1996).