![]() |
Home | Libraries | People | FAQ | More |
#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 > 0 且 y != 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) 使用下面的關係返回: