C ++でpolylogarithm関数を使用する方法


9

polylog関数を使用するために使用できるプリプロセッサディレクティブはありますか?それともcmathに含まれていますか?もしそうなら、あなたはそれを李またはポリログのどちらで呼びますか?


編集:私が本当にやろうとしていることは、関数の不定積分の分析値を与えることです

x3ex−1

これは多対数関数を含みます。しかし、誰かがこの機能を分析的に統合する別の方法について提案があれば、どんなアイデアでも歓迎します。



検索目的:OPで検討されている関数は、デバイ関数に関連しています。このメモは役に立つかもしれません。
— JM 2013年

もう1つの密接な関係は、不完全なフェルミディラック積分です。
— hardmath 2013年

回答:


7

GPLライセンスのCライブラリは、ありますANANTは-解析的数論におけるアルゴリズム上で構築し、多重対数の多倍精度実装が含まリナVepstasによるGMPは。

READMEファイルから:

このプロジェクトには、ガンマ関数、リーマンゼータ関数、多重対数関数、ミンコフスキー疑問符関数など、数論に関連するさまざまな分析関数のアドホック実装が含まれています。実装では、Gnu Multi-Precision Library(GMP)を使用して、すべての低レベルの操作を実行します。ここのコードは、Gnu GPLv3ライセンスの条件に基づいてライセンスされます。

GSL(GNU Scientific Library)には、明らかにdilogarithm関数しかありません。ただし、@ JMからのヒントに従って、倍精度で実装された後退積分(スカラー倍まで)を与えるデバイ関数を見つけます(GSL 7.10デバイ関数の次数1〜6を参照)。

Dん(バツ)=んバツん∫0バツtんdtet−1


MathematicaやMaximaなどのシンボリック統合ソフトウェアは以下を提供します:

∫0バツt3dtet−1=6李4⁡(eバツ)−6バツ李3⁡(eバツ)+3バツ2李2⁡(eバツ)+バツ3ログ⁡(1−eバツ)−バツ44−π415

左側は明らかにバツ>0場合は純粋に実数値ですが、表示される多対数は複素数値になります(eバツ>1であるため、等式は虚数部の完全な相殺に依存します)。この場合、式を代入することで複雑な演算の必要性を回避できます。

∫0バツt3dtet−1=−6李4⁡(e−バツ)−6バツ李3⁡(e−バツ)−3バツ2李2⁡(e−バツ)−バツ3李1⁡(e−バツ)+π415

多重対数の引数であるため、これは改善され[0、1]、結果は純粋に実数値です。バツ=0がゼロの場合の適切な結果に注意してください。これは、先行項と定数の間のキャンセルによって達成されます。したがって、バツ小さな正の値の場合、相対誤差が問題になることがあります。

私たちの神秘的な一定のことを注意π4/15制限上位これらの(単調増加)の積分にバインドされます。

∫0∞t3dtet−1=Γ(4)ζ(4)=6⋅π490

タイトルの質問「C ++でのpolylogarithm関数の使い方」を再確認できます。CやC ++の多対数関数の標準実装が存在しないことは重要です。目標が実装の追加ライブラリを回避することである場合、おそらく、GertVdEの回答がリンクしているDavid C. Woodの論文によって提案されている行に沿って、独自のルーチンを展開することにかなりうまく着手できます。

私の回答の最初の部分で提案されている多精度ルーチンに加えて、多対数特殊関数の 実()バージョンと複素()バージョンの両方を実装する、Stephen L. Moshier によるCephesの成熟した(無料)倍精度数学ライブラリがあります。それらの精度はCの基になる標準数学関数に部分的に依存しますが、Cephes ソースドキュメントは、倍精度の限界付近での1から4次までのテストと理論的なピークエラーを報告します。polylogcpolylog

または、他のソフトウェアを使用して、積分のために記述した求積法ルーチンを直接チェックする(多対数を参照しない)こともできます。このMath.SEの質問でスケッチしたように、積分の原点を中心とするべき級数は収束が制限されていますが、代わりに継続分数展開を使用することでこれを軽減できます。

すぐに満足できるように、特にMaximaに含まれている(無料の)数値求積QUADPACKルーチンをお勧めしますquad_qag。たとえば、次のMaximaコマンドで[0,5]の積分を見つけます:

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

入力引数のうち、最後の引数のみが説明を負います。の5番目の引数quad_qagは、適応求積法に適用するルールを指定します。可能な値は1〜6であり、より高度で正確なものになります。出力行には、最初に数値の求積が表示され、その後に絶対誤差の推定値、使用されたサブインターバル/ステップの数、およびリターンコードが表示されます(ここでゼロはエラーまたは特別な条件が見つからないことを意味します)。


1
「さえC ++」、特別な関数のより良いリンクはen.cppreference.com/w/cpp/numeric/special_mathですが、関数はまだそこにはありません。Boost.Mathライブラリboost.org/doc/libs/1_68_0/libs/math/doc/html/special.htmlにもないことは驚くべきことです。
— alfC 2018

1
@alfC:より良いリンクをありがとう。上記の関数を使用して、この関数/関数ファミリに対する標準サポートの継続的な欠如を説明します。
— hardmath 2018

4

まず、高精度の演算が必要な場合は、アプリケーションに基づいて選択する必要があります(つまり、ポリログ関数のIEEE倍精度の結果だけで十分ですか、それともより高い精度が必要ですか)。高精度が必要な場合は、GMPライブラリー周辺のツールファミリーを調べることができます。

そうでない場合は、近似を使用できます。いくつかの文学研究は私にこの記事を示しました。記事の最後には、「選択テーブル」があります。必要なポリログの引数に基づいて、近似式を選択できます。ただし、安定性と精度を確認するように注意してください。

(ネストされたループではなく)評価があまり必要ない場合は、二重指数法を使用して数値求積法を実行します。


必要な精度は約10 ^ -6です。追加のライブラリを使用しない他の方法を知っていますか?
— フラミンゴハット

バツ

∫0バツt3et−1dtバツ∈[0、10]

すみません、混乱しました。台形法を使用して積分を0.65から5.025に近似しました。近似を分析値と比較できるように、正確な値を見つけるための式が必要です。これは浮動小数点数であるため、概算になるので、1e-6の精度で問題ありません。IDEにpolylog関数を入力する方法を何とか学ぶことができれば、機能するはずです。
— フラミンゴ

1
∫0.655.205t3et−1dt=4.8498308528256668370925

3

Fj(バツ)jj=−12、12、32

Fj(バツ)=−李j+1(−e−バツ)
バツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.