Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

橢圓積分 - 卡爾松(Carlson)形式

概要

#include <boost/math/special_functions/ellint_rf.hpp>

namespace boost { namespace math {

template <class T1, class T2, class T3>
calculated-result-type ellint_rf(T1 x, T2 y, T3 z)

template <class T1, class T2, class T3, class Policy>
calculated-result-type ellint_rf(T1 x, T2 y, T3 z, const Policy&)

}} // namespaces

#include <boost/math/special_functions/ellint_rd.hpp>

namespace boost { namespace math {

template <class T1, class T2, class T3>
calculated-result-type ellint_rd(T1 x, T2 y, T3 z)

template <class T1, class T2, class T3, class Policy>
calculated-result-type ellint_rd(T1 x, T2 y, T3 z, const Policy&)

}} // namespaces

#include <boost/math/special_functions/ellint_rj.hpp>

namespace boost { namespace math {

template <class T1, class T2, class T3, class T4>
calculated-result-type ellint_rj(T1 x, T2 y, T3 z, T4 p)

template <class T1, class T2, class T3, class T4, class Policy>
calculated-result-type ellint_rj(T1 x, T2 y, T3 z, T4 p, const Policy&)

}} // namespaces

#include <boost/math/special_functions/ellint_rc.hpp>

namespace boost { namespace math {

template <class T1, class T2>
calculated-result-type ellint_rc(T1 x, T2 y)

template <class T1, class T2, class Policy>
calculated-result-type ellint_rc(T1 x, T2 y, const Policy&)

}} // namespaces
說明

這個函數返回卡爾松(Carlson)對稱橢圓積分,這個函數在它所有的可能的定義域上具有複雜的情況,下面的圖像給出了它的表現的一個概念:

當參數是不同類型的時候,這些函數的返回值使用函數返回值推導法則 來確定: 否則,返回值的類型與參數的類型一樣.

template <class T1, class T2, class T3>
calculated-result-type ellint_rf(T1 x, T2 y, T3 z)

template <class T1, class T2, class T3, class Policy>
calculated-result-type ellint_rf(T1 x, T2 y, T3 z, const Policy&)

返回卡爾松(Carlson)橢圓積分 RF:

要求所有的參數都是非負的, 至多其中一個參數為0. 否則返回值為定義域錯誤.

最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。

template <class T1, class T2, class T3>
calculated-result-type ellint_rd(T1 x, T2 y, T3 z)

template <class T1, class T2, class T3, class Policy>
calculated-result-type ellint_rd(T1 x, T2 y, T3 z, const Policy&)

返回卡爾松(Carlson)橢圓積分 RD:

要求 x 和 y 是非負的, 至多其中一個為0, 且 z >= 0.否則返回定義域錯誤.

最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。

template <class T1, class T2, class T3, class T4>
calculated-result-type ellint_rj(T1 x, T2 y, T3 z, T4 p)

template <class T1, class T2, class T3, class T4, class Policy>
calculated-result-type ellint_rj(T1 x, T2 y, T3 z, T4 p, const Policy&)

返回卡爾松(Carlson)橢圓積分 RJ:

要求 x 和 y 是非負的, 至多其中一個為0, 且 p != 0. 否則返回定義域錯誤.

最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。

p < 0 時,這個函數使用下面的關係返回 柯蔚(Cauchy principal value) :

template <class T1, class T2>
calculated-result-type ellint_rc(T1 x, T2 y)

template <class T1, class T2, class Policy>
calculated-result-type ellint_rc(T1 x, T2 y, const Policy&)

返回卡爾松(Carlson)橢圓積分RC:

要求x > 0y != 0. 否則返回定義域錯誤.

最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。

y < 0時, 這個函數使用下面的關係返回 柯蔚(Cauchy principal value) :

測試

有兩種測試.

抽查測試(Spot tests)比較選定值與測試數據,由下面給定:

B. C. Carlson, Numerical computation of real or complex elliptic integrals. Numerical Algorithms, Volume 10, Number 1 / March, 1995, pp 13-26.

隨機測試數據由精度為 1000-bit 的 NTL::RR庫以及這個庫中對捨入誤差 和/或 回歸 (regressions)進行檢查的實現來產生.

同樣也有使用積分之間的內部關係來確保正確性的檢查: 參看上面的卡爾松(Carlson )論文瞭解更多信息.

精確性

這個函數使用基本的算術運算來計算, 因此運算結果在不同的平台上並沒有太多的差異. 注意:在那些將寬浮點類型給定為窄浮點類型的系統上,函數的返回值具有有效的零誤差. 所有結果的相對誤差都是10的-5次方數量級。

表50. Carlson 橢圓積分的出錯率(Errors Rates)

有效數字位數

平台和編譯器

RF

RD

RJ

RC

53

Win32 / Visual C++ 8.0

峰值=2.9 均值=0.75

峰值=2.6 均值=0.9

峰值=108 均值=6.9

峰值=2.4 均值=0.6

64

Red Hat Linux / G++ 3.4

峰值=2.5 均值=0.75

峰值=2.7 均值=0.9

峰值=105 均值=8

峰值=1.9 均值=0.7

113

HP-UX / HP aCC 6

峰值=5.3 均值=1.6

峰值=2.9 均值=0.99

峰值=180 均值=12

峰值=1.8 均值=0.7


實現

卡爾松(Carlson)算法的關鍵[Carlson79]是 duplication theorem:

通過重複使用上面的公式, x, y, z 越來越接近. 當它們幾乎相等時, 特殊情況等式

將被使用. 更特別的是, [R F] 通過一個5次的泰勒級數展開來計算. 其它3個積分也是類似的.

對於RJ(x, y, z, p) 中p<0以及RC(x, y)中y<0,p 這些積分是奇特的(singular),同時它們的柯蔚(Cauchy principal values) 使用下面的關係返回:


PrevUpHomeNext