Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

哈爾米特多項式

概要

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

namespace boost{ namespace math{

template <class T>
calculated-result-type hermite(unsigned n, T x);

template <class T, class Policy>
calculated-result-type hermite(unsigned n, T x, const Policy&);

template <class T1, class T2, class T3>
calculated-result-type hermite_next(unsigned n, T1 x, T2 Hn, T3 Hnm1);
   
}} // namespaces
說明

函數返回值的類型使用返回值推導法則:來確定,注意,如果有一個單一的模板參數,那麼結果的類型與這個模板參數的類型一樣;或者,如果模板參數的類型為整型,那麼結果的類型為double。

template <class T>
calculated-result-type hermite(unsigned n, T x);

template <class T, class Policy>
calculated-result-type hermite(unsigned n, T x, const Policy&);

返回在點x處的n次哈爾米特多項式值:

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

下面的圖像顯示了最開始的一些哈爾米特多項式的特性:

template <class T1, class T2, class T3>
calculated-result-type hermite_next(unsigned n, T1 x, T2 Hn, T3 Hnm1);

實現針對於哈爾米特多項式的遞推關係,這個函數可以用來生成在同一個點x處增長n值的數列。

例如我們可以使用下面的代碼來產生最開始的10個多項式值的數組:

double x = 0.5;  // 橫坐標值
vector<double> v;
v.push_back(hermite(0, x)).push_back(hermite(1, x));
for(unsigned l = 1; l < 10; ++l)
   v.push_back(hermite_next(l, x, v[l], v[l-1]));

形式上,參數為:

n

最後一個計算的多項式的次數n.

x

橫坐標值

Hn

多項式在次數為 n時的值.

Hnm1

多項式在次數n-1為時的值

精確性

下面的表顯示了參數的不同定義域的峰值誤差(單位為10的-5次方)。注意,在那些由寬浮點類型來給定窄浮點類型的系統上會有有效的零誤差.

表4.哈爾米特多項式的峰值誤差

有效數字位數

平台和編譯器

0 < l < 20

中的誤差

53

Win32, Visual C++ 8

峰值=4.5 均值=1.5

64

Red Hat Linux IA32, g++ 4.1

峰值=6 均值=2

64

Red Hat Linux IA64, g++ 3.4.4

峰值=6 均值=2

113

HPUX IA64, aCC A.06.06

峰值=6 均值=4


注意:當次數增長時出現最壞誤差,大於 ~120 的值似乎不能產生有意義的結果,尤其是當相關的多項式的次數很大時。當函數非常接近於一個根時,相對誤差可能增長到任意大。

測試

混合的抽樣測試使用 functions.wolfram.com產生的數據, 而隨機測試數據使用精度為1000-bit的NTL::RR 庫產生的數據。

實現

這些函數使用穩定的三項遞推關係來實現。這些函數可以保證小的絕對誤差,但是在多項式的根的附近不能保證小的相對誤差。


PrevUpHomeNext