Wie werden Rückstände numerisch berechnet?

15

Ich muss das folgende Integral berechnen: Wobei eine Matrix ist (eine Teilchenkinetik und potentielle Energie ausgedrückt in einer Basis), ist eine Matrix, die von abhängt (ein Teilchen body Green's function) und das Konturintegral ist ein linker Halbkreis. Der Integrand hat Pole auf der negativen Realachse und ist teuer zu bewerten. Wie lässt sich ein solches Integral am effektivsten berechnen?

12πiCf(E)dE
f(E)=Tr((h+E)G(E))
hGEf(E)

Hier ist meine bisherige Forschung:

1) Ich verwende die Gaußsche Integration, mein Integrationspfad ist ein Rechteck. Ich habe die linke und rechte Seite (dh die Breite) fixiert und mit der Höhe (über und unter der realen Achse) gespielt, sodass ich für die angegebene Integrationsreihenfolge die höchste Genauigkeit erhalte. Wenn zum Beispiel für Bestellung 20 die Höhe zu groß ist, sinkt die Genauigkeit (offensichtlich), aber wenn sie zu klein ist, sinkt sie auch (meine Theorie ist, dass sie mit zunehmender Höhe immer mehr Punkte um die Pole benötigt) 0). Ich habe mich mit der optimalen Körpergröße von 0,5 für meine Funktion niedergelassen.

2) Dann setze ich die rechte Seite des Rechtecks ​​auf E0, typischerweise E0 = 0, aber es könnte E0 = -0,2 oder ähnliches sein.

3) Ich beginne, die linke Seite des Rechtecks ​​nach links zu bewegen, und führe für jeden Schritt eine Konvergenz der Integrationsreihenfolge durch, um sicherzustellen, dass mein Integral für jedes Rechteck vollständig konvergiert. Durch Erhöhen der Breite erhalte ich schließlich einen konvergierten Wert in der Grenze des unendlichen linken Halbkreises.

Die Berechnung ist sehr langsam und auch für große Breiten nicht sehr genau. Eine Verbesserung besteht darin, die lange Breite einfach in "Elemente" zu unterteilen und die Gaußsche Integration für jedes Element zu verwenden (genau wie in FE).

Eine andere Möglichkeit wäre, einen kleinen Kreis um jeden Pol zu integrieren und ihn zusammenzufassen. Probleme:

a) Wie werden die Pole der Funktion numerisch ermittelt ? Es sollte robust sein. Ich weiß nur, dass sie auf der negativen Realachse liegen. Für einige von ihnen (aber nicht für alle) kenne ich auch eine ziemlich gute erste Vermutung. Gibt es eine Methode, die für jede analytische Funktion funktioniert ? Oder hängt es von der tatsächlichen Form von ?f ( E ) f ( E )f(E)f(E)f(E)

b) Wenn wir die Pole kennen, welches numerische Schema eignet sich am besten, um den kleinen Kreis um ihn herum zu integrieren? Soll ich die Gaußsche Integration für einen Kreis verwenden? Oder sollte ich eine gleichmäßige Verteilung der Punkte verwenden?

Eine andere Möglichkeit könnte sein, dass es, sobald ich die Pole dank a) kenne, eine semi-analytische Möglichkeit gibt, die Residuen zu erhalten, ohne dass die komplexe Integration erforderlich ist. Aber jetzt optimiere ich nur die Konturintegration.

Ondřej Čertík
quelle
1
Haben Sie das Buch "Numerical Methods for Laplace Transform Inversion" von Cohen (2007) gelesen? Auch IIRC, Robert Piessens (von QUADPACK) hat an diesem Thema gearbeitet.
GertVdE

Antworten:

7

Ich kann einen Vorschlag für Ihre erste Frage machen: Wenn Sie wissen, dass sich Ihre Pole irgendwo entlang der realen Achse befinden, können Sie sie mithilfe von Rationaler Interpolation / Approximation recht effizient lokalisieren . Dies läuft darauf hinaus, die Polynome und q ( x ) so zu finden, dassp(x)q(x)

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

xf(x) q(x)

Rationale Interpolation / Approximation kann eine heikle Sache sein, aber ich habe kürzlich eine Arbeit über einen stabilen Algorithmus mitverfasst , um sie unter Verwendung der SVD zu berechnen. Das Papier enthält Matlab-Code, der den Algorithmus implementiert, und eine ausführlichere Version davon ist als Funktion ratinterpim Chebfun-Projekt verfügbar , von dem ich einer der Entwickler bin.

Für Ihre zweite Frage kann dieses Dokument hilfreich sein.

Pedro
quelle
Danke für all die Tipps! Hier ist der Code netlib.org/toms/579 von Bengt Fornberg. Leider gibt es einen numerischen Fehler, da dies die Ausgabe ist, die ich erhalte : gist.github.com/2942970#file_output . Also muss ich es neu implementieren oder debuggen. Der Chebfun-Link gibt mir 404 (ich habe es vor ein paar Monaten mit den gleichen Ergebnissen versucht, vielleicht funktioniert es in den USA einfach nicht).
Ondřej Čertík
@ OndřejČertík: Ich habe den TOMS 579-Code noch nie selbst verwendet, daher weiß ich nicht, was ich zu den Fehlern sagen soll. Könnten Sie versuchen, die Chebfun-Homepage zu "googeln" und zu sehen, ob sie dann funktioniert?
Pedro
Google findet die Chebfun-Startseite und zeigt zwischengespeicherte Versionen an. Aber wenn ich auf die Seite klicke
Ondřej Čertík
Versuchen Sie einen anderen Browser? Oder von einem anderen ISP. Die Website funktioniert gut von hier (in den USA)
Costis
Ich habe versucht, Firefox und Chrome. Also muss es von meinem ISP. Seltsam.
Ondřej Čertík