在区间[一1,1] 带权函数的正交多项式为
以上即勒让德(Legendre)多项式的定义
根据其表达式的性质 可推出如下的递推关系
根据以上的递推关系,可以编写如下的python代码,代码基于sympy
符号运算库。实现的过程主要利用了前面的递推关系,程序中通过循环实现该递推关系。
def LegendrePolynomials(N,x):
'''
N 为勒让德多项式的阶数
x 为自变量 sym.symbol对象
'''
if N == 0:
return 1
if N == 1:
return x
p0 = LegendrePolynomials(0,x)
p1 = LegendrePolynomials(1,x)
assert N>=2
for i in range(1,N):
p = (2*i+1)/(i+1)*x*p1 - i/(i+1)*p0
p0 = p1
p1 = p
return sym.simplify(p1)
验算如下,与真实解答吻合:
sympy
经常需要与numpy
混合使用,因此本节在此记录如何将sympy
表达式转换为numpy
表达式,在上述代码的基础上进行转换,首先获得勒让德多项式的表达式,再通过sympy.lambdify
进行转换:
import numpy as np
## 表达式转numpy表达式
expr = LegendrePolynomials(4,x)
expr = sym.lambdify([x],expr,'numpy')
xs = np.linspace(-1,1)
ys = expr(xs)
有了前面3.3的方法,可以轻松获取不同勒让德多项式的函数表达式,可以拿来绘图
import matplotlib.pyplot as plt
def get_expr_np(N,x):
expr = LegendrePolynomials(N,x)
return sym.lambdify([x],expr,'numpy')
fig = plt.figure(figsize=(15,7))
ax = fig.add_subplot(111)
xs = np.linspace(-1,1,101)
for i in range(2,8):
expr_ = get_expr_np(i,x)
ys_ = expr_(xs)
ax.plot(xs,ys_,label=r'$N={}$'.format(i))
ax.legend()
最终结果如下所示:
联系客服