在数值分析中勒让德(Legendre)多项式是比较常见的,本文主要记录勒让德(Legendre)多项式的一些基本性质以及其编程实现。 1. 定义 在区间[一1,1] 带权函数 的正交多项式为
以上即勒让德(Legendre)多项式的定义
2. 递推关系 根据其表达式的性质 可推出如下的递推关系
3. python代码实现勒让德多项式 3.1 代码 根据以上的递推关系,可以编写如下的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)
3.2 验算 验算如下,与真实解答吻合:
3.3 将sympy表达式转换为numpy表达式 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.4 勒让德多项式函数图像 有了前面3.3 的方法,可以轻松获取不同勒让德多项式的函数表达式,可以拿来绘图
import matplotlib.pyplot as pltdef 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()
最终结果如下所示:
4 参考资料 https://baike.baidu.com/item/%E5%8B%92%E8%AE%A9%E5%BE%B7%E5%A4%9A%E9%A1%B9%E5%BC%8F?fromModule=lemma_search-box https://baike.baidu.com/item/Legendre%E5%A4%9A%E9%A1%B9%E5%BC%8F/6860140 张晓丹,郑连存,丁军,卫宏儒,郑权.应用计算方法教程 第2版:机械工业出版社,2015.08