Preciso calcular a seguinte integral: f ( E ) = T r
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 ) ?
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.
fonte
Respostas:
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 )
para em algum intervalo. Os pólos de f ( x ) devem então corresponder às raízes de q ( x ) .x f( 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
ratinterp
no projeto Chebfun , do qual sou um dos desenvolvedores.Para sua segunda pergunta, este artigo pode ser útil.
fonte