分享

勒让德(Legendre)多项式及其python编程实现

 新用户0118F7lQ 2022-09-09 发布于山东

在数值分析中勒让德(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 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()

最终结果如下所示:图片

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多