Como calcular numericamente os resíduos?

15

Preciso calcular a seguinte integral: f ( E ) = T r

1 12πEuCf(E)dE
Ondehé uma matriz (uma partícula cinética e energia potencial expressa em uma base),Gé uma matriz que depende deE(função de Green de muitos corpos para uma partícula) e a integral do contorno é um semicírculo esquerdo. O integrandof(E)possui polos no eixo real negativo e é caro avaliar. Qual é a maneira mais eficaz de calcular essa integral?
f(E)=Tr((h+E)G(E))
hGEf(E)

Aqui está minha pesquisa até agora:

1) Eu uso a integração gaussiana, meu caminho de integração é um retângulo. Corrigi o lado esquerdo e o direito (ou seja, a largura) e brinquei com a altura (acima e abaixo do eixo real), de modo que, para a ordem de integração fornecida, obtenho a maior precisão. Por exemplo, para a ordem 20, se a altura é muito grande, a precisão diminui (obviamente), mas se é muito pequena, também diminui (minha teoria é que ela precisa de mais e mais pontos ao redor dos polos conforme a altura vai para 0) Eu me acomodei com a altura ideal 0,5 para a minha função.

2) Em seguida, defino o lado direito do retângulo em E0, normalmente E0 = 0, mas poderia ser E0 = -0,2 ou algo semelhante.

3) Começo a mover o lado esquerdo do retângulo para a esquerda e, para cada etapa, faço a integração da ordem de convergência para garantir que minha integral esteja totalmente convergida para cada retângulo. Ao aumentar a largura, acabo obtendo um valor convergente no limite do semicírculo esquerdo infinito.

O cálculo é realmente lento e também não é muito preciso para grandes larguras. Uma melhoria é simplesmente particionar a largura longa em "elementos" e usar a integração gaussiana em cada elemento (como no FE).

Outra opção seria integrar um pequeno círculo ao redor de cada polo e resumir. Problemas:

a) Como encontrar numericamente os polos da função ? Deve ser robusto. A única coisa que sei é que eles estão no eixo real negativo. Para alguns deles (mas não todos), também conheço um bom palpite inicial. Existe um método que funcione para qualquer função analítica f ( E ) ? Ou isso depende da forma real de f ( E ) ?f(E)f(E)f(E)

b) Uma vez que conhecemos os pólos, qual esquema numérico é o melhor para integrar o pequeno círculo ao seu redor? Devo usar a integração gaussiana em um círculo? Ou devo usar uma distribuição uniforme dos pontos?

Outra opção pode ser que, uma vez que conheço os polos graças a), possa haver uma maneira semi-analítica de obter os resíduos sem a necessidade de uma integração complexa. Mas, por enquanto, ficaria feliz em otimizar a integração do contorno.

Ondřej Čertík
fonte
11
Você já conferiu o livro "Métodos Numéricos para Inversão da Transformada de Laplace", de Cohen (2007)? O IIRC, Robert Piessens (da fama do QUADPACK) também trabalhou neste tópico.
GertVdE

Respostas:

7

Posso oferecer uma sugestão para sua primeira pergunta: se você souber que seus polos estão em algum lugar no eixo real, poderá localizá-los de maneira bastante eficiente usando a interpolação / aproximação do Rational . Isso equivale a encontrar polinômios e q ( x ) tais quep(x)q(x)

f(x)p(x)q(x)

para em algum intervalo. Os pólos de f ( x ) devem então corresponder às raízes de q ( x ) .xf(x) q(x)

A interpolação / aproximação racional pode ser uma coisa complicada, mas recentemente co-escrevi um artigo sobre um algoritmo estável para calculá-las usando o SVD. O artigo contém código Matlab implementando o algoritmo, e uma versão mais extensa está disponível como função ratinterpno projeto Chebfun , do qual sou um dos desenvolvedores.

Para sua segunda pergunta, este artigo pode ser útil.

Pedro
fonte
Obrigado por todas as dicas! Aqui está o código netlib.org/toms/579 do artigo de Bengt Fornberg. Infelizmente, há algum erro numérico, pois esta é a saída que estou obtendo: gist.github.com/2942970#file_output . Então eu vou ter que reimplementar ou depurar. O link Chebfun me dá 404 (eu tentei alguns meses atrás com os mesmos resultados, então talvez ele simplesmente não funcione nos EUA).
Ondřej Čertík
@ OndřejČertík: Eu nunca usei o código TOMS 579, então não sei o que dizer sobre os erros. Quanto à página inicial do Chebfun, você poderia tentar pesquisá-lo no Google e ver se funciona?
Pedro
O Google encontra a página inicial do Chebfun e mostra as versões em cache. Mas quando eu clicar na página, isso é o que eu recebo: pastehtml.com/view/c1ts4h3ct.html
Ondřej Čertík
Tente um navegador diferente? Ou de um ISP diferente. O site funciona bem a partir daqui (nos EUA).
Costis
Eu tentei o Firefox e o Chrome. Por isso, deve pelo meu ISP. Esquisito.
Ondřej Čertík