Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

勒讓德 (及連帶) 多項式

概要

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

namespace boost{ namespace math{

template <class T>
calculated-result-type legendre_p(int n, T x);

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

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

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

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

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

template <class T1, class T2, class T3>
calculated-result-type legendre_next(unsigned l, T1 x, T2 Pl, T3 Plm1);

template <class T1, class T2, class T3>
calculated-result-type legendre_next(unsigned l, unsigned m, T1 x, T2 Pl, T3 Plm1);


}} // namespaces

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

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

說明
template <class T>
calculated-result-type legendre_p(int l, T x);

template <class T, class Policy>
calculated-result-type legendre_p(int l, T x, const Policy&);

返回第一類勒讓德多項式:

要求 -1 <= x <= 1, 否則返回定義域錯誤.

負的次數使用反射方程來處理:

P-l-1(x) = Pl(x)

下面的圖像顯示了最開始的一些勒讓德多項式的特性:

template <class T>
calculated-result-type legendre_p(int l, int m, T x);

template <class T, class Policy>
calculated-result-type legendre_p(int l, int m, T x, const Policy&);

返回第一類連帶勒讓德多項式:

要求 -1 <= x <= 1, 否則返回結果為定義域錯誤.

lm 的情況使用恆等關係來處理:

[Caution] 注意

這裡所使用的連帶勒讓德多項式的定義包含一個前導的位相(-1)m。這與Abramowitzt和Stegun(8.6.6)給定的定義相符合,並且被MathworldMathematica's 勒讓德 P 函數使用。然而,在這些使用的定義並沒有一直包含這個前導的位相,同時,比較奇怪的是C++ TR1 (assoc_legendre) 也忽略了這一點,除了說明使用Abramowitz和Stegun作為這些問題的權威參考.

參見:

Weisstein, Eric W. "Legendre Polynomial." From MathWorld--A Wolfram Web Resource.

Abramowitz, M. and Stegun, I. A. (Eds.). "Legendre Functions" and "Orthogonal Polynomials." Ch. 22 in Chs. 8 and 22 in Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing. New York: Dover, pp. 331-339 and 771-802, 1972.

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

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

返回勒讓德多項式的值,這個值是勒讓德微分方程的第二個解,例如:

要求 -1 <= x <= 1, 否則調用定義域錯誤

下面的圖像顯示了最開始的一些第二類勒讓德多項式的特性:

template <class T1, class T2, class T3>
calculated-result-type legendre_next(unsigned l, T1 x, T2 Pl, T3 Plm1);

使用針對於勒讓德多項式的三項針對關係來實現,這個函數可以用來生成在同一個點x處增長n值的數列。 這種遞推關係對於第一類和第二類苗讓德多項式都成立.

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

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

形式上,參數為:

l

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

x

橫坐標值

Pl

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

Plm1

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

template <class T1, class T2, class T3>
calculated-result-type legendre_next(unsigned l, unsigned m, T1 x, T2 Pl, T3 Plm1);

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

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

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

形式上,參數為:

l

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

m

連帶多項式的次數

x

橫坐標值

Pl

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

Plm1

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

精確性

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

表9.勒讓德函數的峰值誤差

有效數字位數

平台和編譯器

0 < l < 20

範圍內的誤差

20 < l < 120

範圍內的誤差

53

Win32, Visual C++ 8

峰值=211 均值=20

峰值=300 均值=33

64

SUSE Linux IA32, g++ 4.1

峰值=70 均值=10

峰值=700 均值=60

64

Red Hat Linux IA64, g++ 3.4.4

峰值=70 均值=10

峰值=700 均值=60

113

HPUX IA64, aCC A.06.06

峰值=35 均值=6

峰值=292 均值=41


表10.連帶勒讓德 P 函數的峰值誤差

有效數字位數

平台和編譯器

0 < l < 20

範圍內的誤差

53

Win32, Visual C++ 8

峰值=1200 均值=7

64

SUSE Linux IA32, g++ 4.1

峰值=80 均值=5

64

Red Hat Linux IA64, g++ 3.4.4

峰值=80 均值=5

113

HPUX IA64, aCC A.06.06

峰值=42 均值=4


表11. 勒讓德 Q 函數的峰值誤差

有效數字位數

平台和編譯器

0 < l < 20

範圍內的誤差

20 < l < 120

範圍內的誤差

53

Win32, Visual C++ 8

峰值=50 均值=7

峰值=4600 均值=370

64

SUSE Linux IA32, g++ 4.1

峰值=51 均值=8

峰值=6000 均值=480

64

Red Hat Linux IA64, g++ 3.4.4

峰值=51 均值=8

峰值=6000 均值=480

113

HPUX IA64, aCC A.06.06

峰值=90 均值=10

峰值=1700 均值=140


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

在這裡沒有顯示與其它庫的比較:這些函數似乎只有一種可行實現,已進行的與其它的庫的比較的測試顯示這個庫的實現與其它的庫的實現具有相同的誤差率.

測試

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

實現

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


PrevUpHomeNext