设 φ 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次正交多项式.
当 区 间 为 [ − 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
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])
当 权 函 数 ρ ( 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.
在 区 间 [ − 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,….
# 自己原创
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])
第一类切比雪夫多项式 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].
# 自己原创
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.")
在 区 间 [ 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,….
# 自己原创
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])
在 区 间 [ − ∞ , + ∞ ] 上 带 权 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,….
# 自己原创
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])