1.正交多项式
设
φ
n
(
x
)
是
[
a
,
b
]
上
首
项
系
数
a
n
≠
0
的
n
次
多
项
式
,
ρ
(
x
)
为
[
a
,
b
]
上
的
权
函
数
.
设\varphi _n(x)是[a,b]上首项系数a_n\neq 0的n次多项式,\rho (x)为[a,b]上的权函数.
设φn(x)是[a,b]上首项系数an=0的n次多项式,ρ(x)为[a,b]上的权函数.
如果多项式序列
{
φ
n
(
x
)
}
0
∞
\{\varphi _n(x)\}_0^{\infty}
{φn(x)}0∞满足关系式
(
φ
j
,
φ
k
)
=
∫
a
b
ρ
(
x
)
φ
j
(
x
)
φ
k
(
x
)
d
x
=
{
0
,
j
≠
k
,
A
k
>
0
,
j
=
k
.
(\varphi _j,\varphi _k)=\int_a^b\!\!\!\rho (x)\varphi _j(x)\varphi _k(x)\mathrm{d}x=\begin{cases} 0,\qquad\space\space j\neq k,\\ A_k>0,j=k. \end{cases}
(φj,φk)=∫abρ(x)φj(x)φk(x)dx={0, j=k,Ak>0,j=k.
则
称
多
项
式
序
列
{
φ
n
(
x
)
}
0
∞
为
在
[
a
,
b
]
上
带
权
ρ
(
x
)
正
交
,
称
φ
n
(
x
)
为
[
a
,
b
]
上
带
权
ρ
(
x
)
的
n
次
正
交
多
项
式
.
则称多项式序列\{\varphi _n(x)\}_0^{\infty}为在[a,b]上带权\rho (x)正交,称\varphi _n(x)为[a,b]上带权\rho (x)的n次正交多项式.
则称多项式序列{φn(x)}0∞为在[a,b]上带权ρ(x)正交,称φn(x)为[a,b]上带权ρ(x)的n次正交多项式.
2.勒让德多项式
2.1 定义
当
区
间
为
[
−
1
,
1
]
,
权
函
数
ρ
(
x
)
≡
1
时
,
由
{
1
,
x
,
…
,
x
n
,
…
}
当区间为[-1,1],权函数\rho (x)\equiv 1时,由\{ 1,x,\ldots,x^n,\ldots\}
当区间为[−1,1],权函数ρ(x)≡1时,由{1,x,…,xn,…}
正
交
化
得
到
的
多
项
式
称
为
勒让德(Legendre)多项式
.
并
用
P
0
(
x
)
,
P
1
(
x
)
,
…
,
P
n
(
x
)
,
…
表
示
.
正交化得到的多项式称为\textbf{勒让德(Legendre)多项式}.并用P_0(x),P_1(x),\ldots,P_n(x),\ldots表示.
正交化得到的多项式称为勒让德(Legendre)多项式.并用P0(x),P1(x),…,Pn(x),…表示.
递推关系
(
n
+
1
)
P
n
+
1
(
x
)
=
(
2
n
+
1
)
x
P
n
(
x
)
−
n
P
n
−
1
(
x
)
,
n
=
1
,
2
,
…
.
其
中
,
P
0
(
x
)
=
1
,
P
1
(
x
)
=
x
(n+1)P_{n+1}(x)=(2n+1)xP_n(x)-nP_{n-1}(x),\quad n=1,2,\ldots.其中,P_0(x)=1,P_1(x)=x
(n+1)Pn+1(x)=(2n+1)xPn(x)−nPn−1(x),n=1,2,….其中,P0(x)=1,P1(x)=x
2.2 Python实现勒让德多项式
from numpy import pi
from sympy import expand, cos, Poly, solve, Eq
from sympy.abc import x
import numpy as np
# 自己原创
def legendre_polynomial(symbol_x, degree):
"""
实现degree次勒让德(Legendre)多项式
:param symbol_x:符号变量
:param degree:多项式阶数
:return:指定degree阶数的勒让德(Legendre)多项式
"""
legendre_t_list = np.array([1, symbol_x])
if degree in (0, 1):
return legendre_t_list[degree]
for n in range(1, degree + 1):
legendre_t_list[0] = (2 * n + 1) / (n + 1) * symbol_x * legendre_t_list[1] - n / (n + 1) * legendre_t_list[0]
# 第一种方式交换legendre_t_list
legendre_t_list = legendre_t_list[::-1]
# 第二种方式交换legendre_t_list
# legendre_t_list[1], legendre_t_list[0] = legendre_t_list[0], legendre_t_list[1]
# 第三种方式交换legendre_t_list
# temp = legendre_t_list[1]
# legendre_t_list[1]=legendre_t_list[0]
# legendre_t_list[0] = temp
return expand(legendre_t_list[0])
3.切比雪夫多项式
3.1 第一类切比雪夫多项式定义
当
权
函
数
ρ
(
x
)
=
1
1
−
x
2
,
区
间
为
[
−
1
,
1
]
时
,
当权函数\rho (x)=\dfrac{1}{\sqrt{1-x^2}},区间为[-1,1]时,
当权函数ρ(x)=1−x21,区间为[−1,1]时,
正
交
化
得
到
的
正
交
多
项
式
就
是
正交化得到的正交多项式就是
正交化得到的正交多项式就是
切比雪夫(Chebyshev)多项式
,
它
可
表
示
为
\textbf{切比雪夫(Chebyshev)多项式},它可表示为
切比雪夫(Chebyshev)多项式,它可表示为
T
n
(
x
)
=
cos
(
n
arccos
x
)
,
∣
x
∣
⩽
1.
T_n(x)=\cos (n\arccos x),\vert x\vert \leqslant 1.
Tn(x)=cos(narccosx),∣x∣⩽1.
若令
x
=
cos
θ
,
则
T
n
(
x
)
=
cos
(
n
θ
)
,
0
⩽
θ
⩽
π
.
x=\cos \theta ,则T_n(x)=\cos (n\theta),0\leqslant \theta \leqslant \pi.
x=cosθ,则Tn(x)=cos(nθ),0⩽θ⩽π.
递推关系
T
n
+
1
(
x
)
=
2
x
T
n
(
x
)
−
T
n
−
1
(
x
)
,
n
=
1
,
2
,
…
,
T
0
(
x
)
=
1
,
T
1
(
x
)
=
x
.
\begin{aligned} T_{n+1}(x)&=2xT_n(x)-T_{n-1}(x),\quad n=1,2,\ldots,\\ T_0(x)&=1,T_1(x)=x. \end{aligned}
Tn+1(x)T0(x)=2xTn(x)−Tn−1(x),n=1,2,…,=1,T1(x)=x.
3.2 第二类切比雪夫多项式定义
在
区
间
[
−
1
,
1
]
上
带
权
ρ
(
x
)
=
1
−
x
2
的
正
交
多
项
式
在区间[-1,1]上带权\rho (x)=\sqrt{1-x^2}的正交多项式
在区间[−1,1]上带权ρ(x)=1−x2的正交多项式
称
为
第二类切比雪夫多项式
,
其
表
达
式
为
称为\textbf{第二类切比雪夫多项式},其表达式为
称为第二类切比雪夫多项式,其表达式为
U
n
(
x
)
=
sin
[
(
n
+
1
)
arccos
x
]
1
−
x
2
.
U_n(x)=\frac{\sin [(n+1)\arccos x]}{\sqrt{1-x^2}}.
Un(x)=1−x2sin[(n+1)arccosx].
递推关系
U
0
(
x
)
=
1
,
U
1
(
x
)
=
2
x
,
U
n
+
1
(
x
)
=
2
x
U
n
(
x
)
−
U
n
−
1
(
x
)
,
n
=
1
,
2
,
…
.
\begin{aligned} U_0(x)&=1,U_1(x)=2x,\\ U_{n+1}(x)&=2xU_n(x)-U_{n-1}(x),\quad n=1,2,\ldots. \end{aligned}
U0(x)Un+1(x)=1,U1(x)=2x,=2xUn(x)−Un−1(x),n=1,2,….
3.3 Python实现两类切比雪夫多项式
# 自己原创
def chebyshev_polynomial(symbol_x, degree, polynomial_kind=1):
"""
实现degree次切比雪夫(Chebyshev)多项式
:param polynomial_kind: 切比雪夫多项式类别,第一类或者第二类,默认第一类
:param symbol_x:符号变量
:param degree:多项式阶数
:return:指定degree阶数的切比雪夫(Chebyshev)多项式
"""
if polynomial_kind not in (1, 2):
raise Exception("Error,chebyshev_polynomial must be the first or second kind,polynomial_kind=1 or 2.")
chebyshev_t_list = np.array([1, polynomial_kind * symbol_x])
if degree in (0, 1):
return chebyshev_t_list[degree]
for n in range(degree):
chebyshev_t_list[0] = 2 * symbol_x * chebyshev_t_list[1] - chebyshev_t_list[0]
# 第一种方式交换chebyshev_t_list
chebyshev_t_list = chebyshev_t_list[::-1]
# 第二种方式交换chebyshev_t_list
# chebyshev_t_list[1], chebyshev_t_list[0] = chebyshev_t_list[0], chebyshev_t_list[1]
# 第三种方式交换chebyshev_t_list
# temp = chebyshev_t_list[1]
# chebyshev_t_list[1]=chebyshev_t_list[0]
# chebyshev_t_list[0] = temp
return expand(chebyshev_t_list[0])
3.4 一般区间的切比雪夫多项式零点
第一类切比雪夫多项式
T
n
(
x
)
T_n(x)
Tn(x)在区间
[
−
1
,
1
]
上
有
n
个
零
点
[-1,1]上有n个零点
[−1,1]上有n个零点
x
k
=
cos
2
k
−
1
2
n
π
,
k
=
1
,
2
,
…
,
n
x_k=\cos \frac{2k-1}{2n}\pi,\qquad k=1,2,\ldots,n
xk=cos2n2k−1π,k=1,2,…,n
第二类切比雪夫多项式
U
n
(
x
)
U_n(x)
Un(x)在区间
[
−
1
,
1
]
上
有
n
个
零
点
[-1,1]上有n个零点
[−1,1]上有n个零点
x
k
=
cos
k
π
n
+
1
,
k
=
1
,
2
,
…
,
n
x_k=\cos \frac{k\pi}{n+1},\qquad k=1,2,\ldots,n
xk=cosn+1kπ,k=1,2,…,n
由于切比雪夫多项式是在区间
[
−
1
,
1
]
[-1,1]
[−1,1]上定义的,对于一般的区间
[
a
,
b
]
[a,b]
[a,b],要通过变量替换变换到
[
−
1
,
1
]
,
可
令
[-1,1],可令
[−1,1],可令
x
=
1
2
[
(
b
−
a
)
t
+
a
+
b
]
,
x=\frac{1}{2}[(b-a)t+a+b],
x=21[(b−a)t+a+b],
则可将
x
∈
[
a
,
b
]
变
换
到
t
∈
[
−
1
,
1
]
.
x\in [a,b]变换到t\in [-1,1].
x∈[a,b]变换到t∈[−1,1].
3.5 Python实现一般区间的实现切比雪夫多项式零点
# 自己原创
def chebyshev_null_points(degree, a=-1, b=1, polynomial_kind=1):
"""
利用区间变换和切比雪夫零点求一般区间[a,b]上的插值节点
:param polynomial_kind: 切比雪夫多项式类别,第一类或者第二类,默认第一类
:param degree: 切比雪夫多项式次数
:param a: 区间左端点
:param b: 区间右端点
:return:指定区间上的切比雪夫插值节点
"""
if polynomial_kind == 1:
return [((b - a) / 2) * cos(((2 * k + 1) / (2 * degree)) * pi) + (b + a) / 2 for k in range(degree)]
elif polynomial_kind == 2:
return [((b - a) / 2) * cos((k * pi) / (degree + 1)) + (b + a) / 2 for k in range(1, degree + 1)]
else:
raise Exception("Error,chebyshev_polynomial must be the first or second kind,polynomial_kind=1 or 2.")
4.拉盖尔多项式
4.1 定义
在
区
间
[
0
,
+
∞
]
上
带
权
e
−
x
的
正
交
多
项
式
称
为
拉盖尔(Laguerre)多项式
,
其
表
达
式
为
在区间[0,+\infty]上带权e^{-x}的正交多项式称为\textbf{拉盖尔(Laguerre)多项式},其表达式为
在区间[0,+∞]上带权e−x的正交多项式称为拉盖尔(Laguerre)多项式,其表达式为
L
n
(
x
)
=
e
x
d
n
d
x
n
(
x
n
e
−
x
)
.
L_n(x)=e^x\frac{\mathrm{d}^n}{\mathrm{d}x^n}(x^ne^{-x}).
Ln(x)=exdxndn(xne−x).
递推关系
L
0
(
x
)
=
1
,
L
1
(
x
)
=
1
−
x
,
L
n
+
1
(
x
)
=
(
1
+
2
n
−
x
)
L
n
(
x
)
−
n
2
L
n
−
1
(
x
)
,
n
=
1
,
2
,
…
.
\begin{aligned} L_0(x)&=1,L_1(x)=1-x,\\ L_{n+1}(x)&=(1+2n-x)L_n(x)-n^2L_{n-1}(x),\quad n=1,2,\ldots. \end{aligned}
L0(x)Ln+1(x)=1,L1(x)=1−x,=(1+2n−x)Ln(x)−n2Ln−1(x),n=1,2,….
4.2 Python实现拉盖尔多项式
# 自己原创
def laguerre_polynomial(symbol_x, degree):
"""
实现degree次拉盖尔(laguerre)多项式
:param symbol_x:符号变量
:param degree:多项式阶数
:return:指定degree阶数的拉盖尔(laguerre)多项式
"""
laguerre_l_list = np.array([1, 1 - symbol_x])
if degree in (0, 1):
return laguerre_l_list[degree]
for n in range(1, degree + 1):
laguerre_l_list[0] = (1 + 2 * n - symbol_x) * laguerre_l_list[1] - n * n * laguerre_l_list[0]
# 第一种方式交换legendre_t_list
laguerre_l_list = laguerre_l_list[::-1]
# 第二种方式交换legendre_t_list
# laguerre_l_list[1], laguerre_l_list[0] = laguerre_l_list[0], laguerre_l_list[1]
# 第三种方式交换legendre_t_list
# temp = laguerre_l_list[1]
# laguerre_l_list[1]=laguerre_l_list[0]
# laguerre_l_list[0] = temp
return expand(laguerre_l_list[0])
5.埃尔米特多项式
5.1 定义
在
区
间
[
−
∞
,
+
∞
]
上
带
权
e
−
x
2
的
正
交
多
项
式
称
为
埃尔米特(Hermite)多项式
,
其
表
达
式
为
在区间[-\infty,+\infty]上带权e^{-x^2}的正交多项式称为\textbf{埃尔米特(Hermite)多项式},其表达式为
在区间[−∞,+∞]上带权e−x2的正交多项式称为埃尔米特(Hermite)多项式,其表达式为
H
n
(
x
)
=
(
−
1
)
n
e
x
2
d
n
d
x
n
(
e
−
x
2
)
,
H_n(x)=(-1)^ne^{x^2}\frac{\mathrm{d}^n}{\mathrm{d}x^n}(e^{-x^2}),
Hn(x)=(−1)nex2dxndn(e−x2),
递推关系
H
0
(
x
)
=
1
,
H
1
(
x
)
=
2
x
,
H
n
+
1
(
x
)
=
2
x
H
n
(
x
)
−
2
n
H
n
−
1
(
x
)
,
n
=
1
,
2
,
…
.
\begin{aligned} H_0(x)&=1,H_1(x)=2x,\\ H_{n+1}(x)&=2xH_n(x)-2nH_{n-1}(x),\quad n=1,2,\ldots. \end{aligned}
H0(x)Hn+1(x)=1,H1(x)=2x,=2xHn(x)−2nHn−1(x),n=1,2,….
5.2 Python实现埃尔米特多项式
# 自己原创
def hermite_polynomial(symbol_x, degree):
"""
实现degree次埃尔米特(hermite)多项式
:param symbol_x:符号变量
:param degree:多项式阶数
:return:指定degree阶数的埃尔米特(hermite)多项式
"""
hermite_l_list = np.array([1, 2 * symbol_x])
if degree in (0, 1):
return hermite_l_list[degree]
for n in range(1, degree + 1):
hermite_l_list[0] = 2 * symbol_x * hermite_l_list[1] - 2 * n * hermite_l_list[0]
# 第一种方式交换hermite_t_list
hermite_l_list = hermite_l_list[::-1]
# 第二种方式交换hermite_t_list
# hermite_l_list[1], hermite_l_list[0] = hermite_l_list[0], hermite_l_list[1]
# 第三种方式交换hermite_t_list
# temp = hermite_l_list[1]
# hermite_l_list[1]=hermite_l_list[0]
# hermite_l_list[0] = temp
return expand(hermite_l_list[0])