拉格朗日插值求具体值点+画图python

问题

对于函数
在这里插入图片描述

在[-5,5]内取n=10, 按等距节点求n次lagrange插值多项式

取100点,画出插值多项式和原函数的对比图。 并分别比较在x=3.5,x=4.5处的值。

拉格朗日插值

基本原理:
在这里插入图片描述
代码

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = ['sans-serif']    # 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


def fun(x):
    return 1/(1+x**2)


def lagrange(x0, y0, x):
    n = x0.shape[0]
    s = 0
    for k in range(0, n):
        p = 1

        for j in range(0, n):
            if k != j:
                p = p*(x-x0[j])/(x0[k]-x0[j])
        s += p*y0[k]
    f = s
    return f


x0 = np.linspace(-5, 5, 10)   # 在[-5,5]内取n=10, 按等距节点求n次
y0 = fun(x0)    # 真实的函数值

x1 = np.linspace(-5, 5, 100)  # 为画图取得的100个点
y1 = lagrange(x0, y0, x1)     # 将100个点带入10插值多项式得出对应的函数值
f1 = lagrange(x0, y0, 3.5)    # 3.5处的插值
f2 = lagrange(x0, y0, 4.5)    # 4.5处的插值

plt.figure()
plt.title('lagrange插值多项式')
plt.plot(x1, fun(x1))   # 真实函数的曲线
plt.plot(x1, y1, 'r')   # 插值曲线
plt.plot(x0, y0, 'b.')  # 插值点
plt.plot(3.5, f1, 'g+')  # 两个特殊值点
plt.plot(4.5, f2, 'k+')

plt.legend(['真实函数值', '插值曲线', '实际取值点', '3.5处的插值函数值', '4.5处的插值函数值'])
plt.show()

print('3.5插值结果:', f1, '实际结果:', fun(3.5))
print('4.5插值结果:', f2, '实际结果:', fun(4.5))

实验结果:
请添加图片描述
计算出的3.5,及4.5出的函数值
在这里插入图片描述

探索

当取得的插值多项式的点的数量不同时,得到的函数曲线也有所不同
在这里插入图片描述
在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = ['sans-serif']    # 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


def fun(x):
    return 1/(1+x**2)


def lagrange(x0, y0, x):
    n = x0.shape[0]
    s = 0
    for k in range(0, n):
        p = 1

        for j in range(0, n):
            if k != j:
                p = p*(x-x0[j])/(x0[k]-x0[j])
        s += p*y0[k]
    f = s
    return f

# 当n的数量为10,11,12时,图像
for i in range(10,13):
    x0 = np.linspace(-5, 5, i)  # 在[-5,5]内取n=10, 按等距节点求n次
    y0 = fun(x0)  # 真实的函数值

    x1 = np.linspace(-5, 5, 100)  # 为画图取得的100个点
    y1 = lagrange(x0, y0, x1)  # 将100个点带入10插值多项式得出对应的函数值

    f1 = lagrange(x0, y0, 3.5)  # 3.5处的插值
    f2 = lagrange(x0, y0, 4.5)  # 4.5处的插值

    #plt.figure()

    plt.plot(x1, y1,label=f'n={i}')  # 插值曲线
    #plt.plot(x0, y0, '.',label='实际取值点')  # 插值点
    plt.plot(3.5, f1, 'g+')  # 两个特殊值点
    plt.plot(4.5, f2, 'k+')
    plt.legend()
    #plt.legend( ,'3.5处的插值函数值' , '4.5处的插值函数值'])
plt.title('lagrange插值多项式')
plt.plot(x1, fun(x1),'b',label='真实函数值')  # 真实函数的曲线
plt.legend()
plt.show()
  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值