Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

指數積分Ei

概要

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

namespace boost{ namespace math{

template <class T>
calculated-result-type expint(T z);

template <class T, class Policy>
calculated-result-type expint(T z, const Policy&);

}} // namespaces

函數返回值的類型使用返回值類型推導法則來確定:如果T是int型,那麼返回值的類型是double, 否則返回值類型為T.

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

說明
template <class T>
calculated-result-type expint(T z);

template <class T, class Policy>
calculated-result-type expint(T z, const Policy&);

返回z的指數積分

準確性

下面的表顯示了不同平台上的不同浮點類型的峰值誤差 (10的-5次方數量級) , 以及與 Cody 的SPECFUN 以及GSL-1.9 庫的比較. 除非指定了任意的更窄的浮點類型,否則返回值會具有 有效的零誤差.

表46.函數expint(z)的出錯率(Errors Rates)

有效數字位數

平台和編譯器

誤差

53

Win32, Visual C++ 8

峰值=2.4 均值=0.6

GSL 峰值=8.9 均值=0.7

SPECFUN (Cody) 峰值=2.5 均值=0.6

64

RedHat Linux IA_EM64, gcc-4.1

峰值=5.1 均值=0.8

64

Redhat Linux IA64, gcc-4.1

峰值=5.0 均值=0.8

113

HPUX IA64, aCC A.06.06

峰值=1.9 均值=0.63


需要指出的是上面的三個庫提供 在它們大多數的作用範圍上提供小於10的-5次方的精度.

在En的正根附近,GSL庫存在很大困難, 而 Cody 的 SPECFUN庫在及這個庫在區間 [4,6]上的出錯率增長十分緩慢

測試

這些函數的測試由兩部分構成: 基本的合理性測試(sanity checks)使用Mathworld's online evaluator計算出的測試數據,而精度測試使用精度為1000-bit的NTL::RR 庫和這個庫的實現產生的數據. 注意:這些函數的通用和類型特定的版本在內部使用不同的實現, 因北這就可以給出相互獨立的測試數據. 使用我們的測試數據來測試"已知良好的(known good)" 的實現同樣也給出一個合理性的測試(sanity checks).

實現

對於 x < 0,這個函數僅僅調用zeta(1, -x): 當x的精度少於113bit 的時候,這個zeta函數又是通過有理數逼近的方式來實現的。

對於 x > 0 ,一般的版本使用下面的無限級數來實現:

然而, 當類型的精度在編譯時已知且精度是113 bits或更少, 那麼將會使用同 JM發明的方法

對於 0 < z < 6 ,使用下面的存根 (root-preserving)逼近形式:

其中 z0 是函數的正根, 且 R(z/3 - 1) 是有理數極值逼近的尺度,使得其在區間 [-1,1]上計算。注意:雖然在區間上 [0,6]上的有理逼近逼近很快收斂到極值解,但在實際應用中, 這是很病態的( ill-conditioned) , Cody 和Thacher [1] 也表明了相同的觀點並且將這個多項式轉化為 賽貝謝夫形式 來確保計算的穩定性. 通過實驗我們發現這個多項式和這個多項式的賽貝謝夫形式一樣穩定 ,前提是它們在區間 [-1,1]上計算。

在區間 [a,b] 和區間 [b,INF] 上,這個有理逼近使用下面的形式:

其中 c 是一個常量, 而 R(t) 是與c相比較的較低的絕對誤差極值. 當範圍是無限的,變量t1/z,否則是 2z/(b-a) - (2a/(b-a) + 1): 其作用在於可以將t的區間擴展到區間[-1,1]. 和前面一樣,在任意區間上的有理逼近是病態的: Cody 和 Thacher通過將這個多項式轉化為 J-Fraction 等式來解決這個問題. 然而 , 如果運算的區間是 [-1,1] 且項數經過精心選擇,那麼多項式可以被計算到合適的精度: 與Cody 和 Thacher 使用 J-Fractions相比 ,誤差率是 2 到 3 個 10的-5次方數量級, 但在最低 限度上更高效一些,因為使用更少的除法.



[1] W. J. Cody and H. C. Thacher, Jr., Rational Chebyshev approximations for the exponential integral E1(x), Math. Comp. 22 (1968), 641-649, and W. J. Cody and H. C. Thacher, Jr., Chebyshev approximations for the exponential integral Ei(x), Math. Comp. 23 (1969), 289-303.


PrevUpHomeNext