文章目录
- 勒让德多项式简介
- 求导和积分
- 求根和反演
- 拟合
勒让德多项式简介
Legendre多项式是一种非常重要的正交多项式,在物理学中有着广泛的应用,例如点电荷在空间中的激发电势就具备勒让德多项式的形式。其表达形式为
P n ( x ) = 1 2 n n ! d n d x n { ( x 2 − 1 ) n } P_n(x)=\frac{1}{2^nn!}\frac{\text d^n}{\text dx^n}\{(x^2-1)^n\} Pn(x)=2nn!1dxndn{(x2−1)n}
其中 n n n为勒让德多项式的阶数,在Python中,提供了Legendre类,构造函数为
legendre.Legendre(coef, domain=None, window=None, symbol='x')
其中coef
为系数列表
a
0
,
a
1
,
⋯
,
a
n
a_0, a_1,\cdots,a_n
a0,a1,⋯,an,表示生成
∑ i = 0 n a i P i ( x ) \sum_{i=0}^n a_iP_i(x) i=0∑naiPi(x)
domain
表示
x
x
x的定义域,window
表示缩放系数,x
为自变量符号。
from numpy.polynomial.legendre import Legendre
p3 = Legendre(coef=[4,3,2,1])
print(p3)
# 输出为4.0 + 3.0 P_1(x) + 2.0 P_2(x) + 1.0 P_3(x)
为了对勒让德多项式有个直观的认识,可以绘制一下不同阶数的勒让德多项式的函数
import numpy as np
import matplotlib.pyplot as plt
for i in range(5):
c = np.zeros(i+1)
c[i] = 1
p = Legendre(coef=c, domain=(-5,5))
xs, ys = p.linspace()
plt.plot(xs, ys, label=str(i))
plt.legend()
plt.show()
其中linspace
表示在定义域范围内对多项式进行采样,有一个参数n
,表示在定义域范围内等间隔生成n
组
x
,
y
x,y
x,y,默认为100。
得图如下
求导和积分
Legendre
支持简单的符号计算,比如可通过deriv(n)
求多项式的n
阶导数;通过integ(n)
可求n
阶积分,示例如下
>>> p3.deriv(1)
Legendre([4., 6., 5.], domain=[-1., 1.], window=[-1., 1.])
>>> p3.deriv(3)
Legendre([15.], domain=[-1., 1.], window=[-1., 1.])
>>> p3.integ(1)
Legendre([0.375 , 3.6 , 0.85714286, 0.4 , 0.14285714], domain=[-1., 1.], window=[-1., 1.])
勒让德多项式满足导数递推公式
( 2 n + 1 ) P n = P n + 1 ′ − P n ′ P 1 ′ = 1 (2n+1)P_n=P_{n+1}'-P_n'\quad P_1'=1 (2n+1)Pn=Pn+1′−Pn′P1′=1
则 P 2 ′ = ( 2 + 1 ) P 1 + P 1 ′ = 3 P 1 + 1 P_2'=(2+1)P_1+P_1'=3P_1+1 P2′=(2+1)P1+P1′=3P1+1,则常数项为一阶项的3加上二阶项的1,即4。
求根和反演
roots
可用于求根,而fromroot
可根据根来生成Hermite多项式
>>> rs = p3.roots()
>>> print(rs)
[-1.38964076+0.j 0.09482038-0.92441421j 0.09482038+0.92441421j]
>>> pNew = p3.fromroots(rs)
>>> print(pNew)
(1.5999999999999992+0j) + (1.1999999999999982+0j) P_1(x) +
(0.7999999999999996+0j) P_2(x) + (0.4+0j) P_3(x)
可以发现roots
和fromroots
并非对称的关系。
拟合
Legendre
类中同样提供了拟合函数fit
,定义为
Legendre.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')
其中domain
, window
, symbol
不必赘述,其中x,y
为待拟合多项式;deg
为多项式的阶数。rcond
表示截止误差。full
为False
时,只返回拟合系数,否则还返回拟合的标准差等。
>>> xs, ys = p3.linspace()
>>> p3 = Legendre(coef=[4,3,2,1])
>>> xs, ys = p3.linspace()
>>> p3_3 = p3.fit(xs, ys, 3)
>>> print(p3_3)
3.999999999999999 + 3.0000000000000013 P_1(x) +
2.0000000000000027 P_2(x) + 1.0000000000000018 P_3(x)
>>> p3_4 = p3.fit(xs, ys, 4)
>>> print(p3_4)
3.9999999999999987 + 2.9999999999999996 P_1(x) +
2.000000000000007 P_2(x) + 1.000000000000004 P_3(x) -
1.2341811704615316e-14 P_4(x)
可见其拟合效果还是不错的。
degree
返回多项式的最高项次数,cutdeg
可以对多项式的次数做阶段,例如
>>> p3.degree()
3
>>> p3.cutdeg(2)
Legendre([4., 3., 2.], domain=[-1., 1.], window=[-1., 1.])