Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

拉格朗日 (及連帶) 多項式

概要

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

namespace boost{ namespace math{

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

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

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

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

template <class T1, class T2, class T3>
calculated-result-type laguerre_next(unsigned n, T1 x, T2 Ln, T3 Lnm1);

template <class T1, class T2, class T3>
calculated-result-type laguerre_next(unsigned n, unsigned m, T1 x, T2 Ln, T3 Lnm1);


}} // namespaces
說明

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

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

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

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

返回在點x處次數為n的拉格朗日式項式的值:

面的圖像顯示了最開始的一些拉格朗日多項式的特性:

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

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

返回在點x處次數為m度數為n的連帶拉格朗日多項式的值:

template <class T1, class T2, class T3>
calculated-result-type laguerre_next(unsigned n, T1 x, T2 Ln, T3 Lnm1);

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

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

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

形式上,參數為:

n

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

x

橫坐標值

Ln

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

Lnm1

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

template <class T1, class T2, class T3>
calculated-result-type laguerre_next(unsigned n, unsigned m, T1 x, T2 Ln, T3 Lnm1);

實現針對於連帶拉格朗日多項式的三項遞推關係,這個函數可以用來生成在同一個點x處增長n值的數列。.

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

double x = 0.5;  // 橫坐標值
int m = 10;      // 次數
vector<double> v;
v.push_back(laguerre(0, m, x)).push_back(laguerre(1, m, x));
for(unsigned l = 1; l < 10; ++l)
   v.push_back(laguerre_next(l, m, x, v[l], v[l-1]));

形式上,參數為:

n

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

m

連帶多項式的次數.

x

橫坐標值

Ln

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

Lnm1

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

精確性

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

表2.拉格朗日多項式的誤差率

有效數字位數

平台和編譯器

0 < l < 20

範圍內的誤差

53

Win32, Visual C++ 8

峰值=3000 均值=185

64

SUSE Linux IA32, g++ 4.1

峰值=1x104 均值=828

64

Red Hat Linux IA64, g++ 3.4.4

峰值=1x104 均值=828

113

HPUX IA64, aCC A.06.06

峰值=680 均值=40


表?3.連帶拉格朗日多項式的峰值誤差

有效數字位數

平台和編譯器

0 < l < 20

中的誤差

53

Win32, Visual C++ 8

峰值=433 均值=11

64

SUSE Linux IA32, g++ 4.1

峰值=61.4 均值=19.5

64

Red Hat Linux IA64, g++ 3.4.4

峰值=61.4 均值=19.5

113

HPUX IA64, aCC A.06.06

峰值=540 均值=13.94


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

測試

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

實現

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


PrevUpHomeNext