Wie verwende ich die Polylogarithmusfunktion in c ++?


9

Gibt es Präprozessoranweisungen, die zur Verwendung der Polylog-Funktion verwendet werden könnten? Oder ist es in cmath enthalten? Wenn ja, nennen Sie es Li oder Polylog?


EDIT: Was ich wirklich versuche, ist einen analytischen Wert für das unbestimmte Integral der Funktion anzugeben

x3ex- -1

welches Polylogarithmusfunktionen beinhaltet. Aber wenn jemand einen Vorschlag für eine andere Möglichkeit hat, diese Funktion analytisch zu integrieren, wäre ich zu jeder Idee willkommen.



Zu Suchzwecken: Die im OP berücksichtigte Funktion bezieht sich auf die Debye-Funktionen . Dieser Hinweis kann von Nutzen sein.
JM

Eine weitere enge Beziehung ist das unvollständige Fermi-Dirac-Integral .
Hardmath

Antworten:


7

Es gibt eine GPL-C-Bibliothek, ANANT - Algorithmen in der analytischen Zahlentheorie von Linas Vepstas, die eine mehrpräzise Implementierung des Polylogarithmus auf der Grundlage von GMP umfasst .

Aus der README-Datei:

Dieses Projekt enthält Ad-hoc-Implementierungen verschiedener analytischer Funktionen, die für die Zahlentheorie von Interesse sind, einschließlich der Gammafunktion, der Riemannschen Zetafunktion, des Polylogarithmus und der Minkowski-Fragezeichenfunktion. Die Implementierung verwendet die Gnu Multi-Precision Library (GMP), um alle Operationen auf niedriger Ebene auszuführen. Der hierin enthaltene Code ist unter den Bedingungen der Gnu GPLv3-Lizenz lizenziert.

Die GSL (GNU Scientific Library) hat offenbar nur die Dilogarithmusfunktion . Nach einem Hinweis von @JM findet man jedoch die Debye-Funktion, die das hintere Integral (bis zu einem skalaren Vielfachen) mit doppelter Genauigkeit implementiert (siehe GSL 7.10 Debye-Funktionen, Befehle 1 bis 6):

D.n(x)=nxn0xtndtet- -1


Symbolische Integrationssoftware wie Mathematica oder Maxima bietet:

0xt3dtet- -1=6Li4(ex)- -6xLi3(ex)+3x2Li2(ex)+x3Log(1- -ex)- -x44- -π4fünfzehn

x>0ex>1

0xt3dtet- -1=- -6Li4(e- -x)- -6xLi3(e- -x)- -3x2Li2(e- -x)- -x3Li1(e- -x)+π4fünfzehn

[0,1]]x=0x

π4/.fünfzehn

0t3dtet- -1=Γ(4)ζ(4)=6π490

Wir können jetzt die Titelfrage wiederholen: Wie verwende ich die Polylogarithmusfunktion in c ++? Es ist erwähnenswert, dass es keine Standardimplementierung von Polylogarithmusfunktionen für C oder sogar C ++ gibt . Wenn das Ziel darin besteht, zusätzliche Bibliotheken für Ihre Implementierung zu vermeiden, können Sie Ihre eigenen Routinen erstellen, möglicherweise in Anlehnung an das David C. Wood-Papier, auf das die Antwort von GertVdE verweist.

Neben den im ersten Teil meiner Antwort vorgeschlagenen Multipräzisionsroutinen gibt es in Cephes eine ausgereifte (kostenlose) Mathematikbibliothek mit doppelter Genauigkeit von Stephen L. Moshier, die sowohl reelle ( polylog) als auch komplexe ( cpolylog) Versionen der Polylogarithmus-Sonderfunktionen implementiert . Obwohl ihre Genauigkeit teilweise von den zugrunde liegenden mathematischen Standardfunktionen von C abhängt, werden in der Cephes- Quellendokumentation Tests und theoretische Spitzenfehler für die Ordnungen 1 bis 4 etwa an den Grenzen der doppelten Genauigkeit angegeben.

Alternativ können Sie eine andere Software verwenden, um die Quadraturroutinen, die Sie für Ihr Integral geschrieben haben, direkt zu überprüfen (ohne auf Polylogarithmen zu verweisen). Wie ich in dieser Math.SE-Frage skizziere, weist die am Ursprung des Integrals zentrierte Potenzreihe eine begrenzte Konvergenz auf, dies kann jedoch durch die Verwendung einer fortgesetzten Brucherweiterung gemildert werden.

Zur sofortigen Befriedigung empfehle ich die (freie) numerische Routinen Quadratur QUADPACK in enthalten Maxima , speziell quad_qag. Finden Sie zum Beispiel das Integral über [0,5] mit diesem Maxima-Befehl:

(%i1) quad_qag(x^3/(%e^x - 1), x, 0, 5, 2);
(%o1) [4.899892158330582,5.4399730923588665*10^-14,21,0]

Von den Eingabeargumenten trägt nur das letzte eine Erklärung. Das fünfte Argument quad_qaggibt an, welche Regel in der adaptiven Quadratur anzuwenden ist. Mögliche Werte sind 1 bis 6 und sorgen für zunehmende Raffinesse / Genauigkeit. Die Ausgabezeile gibt zuerst die numerische Quadratur an, gefolgt von einer Schätzung ihres absoluten Fehlers, der Anzahl der verwendeten Teilintervalle / Schritte und einem Rückkehrcode (hier bedeutet Null, dass kein Fehler oder keine besonderen Bedingungen gefunden wurden).


1
"sogar C ++", ein besserer Link für spezielle Funktionen wäre en.cppreference.com/w/cpp/numeric/special_math , obwohl die Funktion noch nicht vorhanden ist. Es ist überraschend, dass es nicht einmal in der Boost.Math-Bibliothek boost.org/doc/libs/1_68_0/libs/math/doc/html/special.html enthalten ist .
alfC

1
@alfC: Danke für den besseren Link. Ich werde das oben verwenden, um den anhaltenden Mangel an Standardunterstützung für diese Funktion / Funktionsfamilie zu veranschaulichen.
Hardmath

4

Zunächst sollten Sie basierend auf Ihrer Anwendung auswählen, ob Sie hochpräzise Arithmetik benötigen (dh werden Sie mit nur IEEE-Ergebnissen mit doppelter Genauigkeit für die Polylog-Funktionen zufrieden sein oder benötigen Sie eine höhere Präzision)? Wenn Sie eine hohe Präzision benötigen, können Sie in der Toolfamilie der GMP-Bibliothek nachsehen.

Wenn Sie dies nicht tun, können Sie Näherungswerte verwenden. Einige Literaturrecherchen haben mich auf diesen Artikel hingewiesen . Am Ende des Artikels befindet sich eine "Auswahltabelle": Basierend auf den Argumenten der Polylogs, die Sie benötigen, können Sie eine Näherungsformel auswählen. Achten Sie jedoch auf Stabilität und Genauigkeit.

Wenn Sie nicht zu viele Auswertungen benötigen (nicht in einer verschachtelten Schleife), würde ich einfach die numerische Quadratur mit der doppelt exponentiellen Methode verwenden.


Die erforderliche Präzision würde bei 10 ^ -6 liegen. Kennen Sie einen anderen Weg, bei dem keine zusätzlichen Bibliotheken verwendet werden?
Flamingohats

x

@flamingohats: Wollen Sie damit sagen, dass Sie approximieren müssen?0xt3et- -1dtx[0,10]]

Entschuldigung, ich war verwirrt. Ich habe das Integral mit der Trapezmethode von 0,65 auf 5,025 angenähert und benötige eine Formel, um den genauen Wert zu ermitteln, damit ich die Näherung mit einem analytischen Wert vergleichen kann. Ich weiß, dass dies angenähert wird, da es sich um eine Gleitkommazahl handelt, sodass eine Genauigkeit von 1e-6 in Ordnung ist. Wenn ich irgendwie lernen kann, wie man die Polylog-Funktion in die IDE eingibt, sollte es funktionieren.
Flamingohats

1
0,655.205t3et- -1dt=4.8498308528256668370925

3

F.j(x)jj=- -12,12,32

F.j(x)=- -Lij+1(- -e- -x)
x
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.