数值分析1_拉格朗日插值法&牛顿插值法

实验名称

        拉格朗日插值法以及牛顿插值法的实现

实验要求

       实现拉格朗日插值
       验证随着插值结点的增多插值曲线的变化情况
       实现牛顿插值,显示差商结果 
       比较拉格朗日插值与牛顿插值的插值结果是否相同

Github仓库

GitHub - beihaidaoxingwan/numerical-analysis

算法介绍

        拉格朗日插值法

        牛顿插值法 

算法实现代码

拉格朗日插值法

import matplotlib.pyplot as plt


def lagerange(x, point_X, point_Y, i, point_num):
    denominator = 1.0
    molecule = 1.0
    res = 0.0

    for j in range(0, point_num):
        if (j != i):
            denominator = denominator * (point_X[i] - point_X[j])
            molecule = molecule * (x - point_X[j])
        else:
            continue

    res = molecule / denominator
    res = res * point_Y[i]
    return res


point_X = list(eval(input("请输入所有横坐标:")))
point_Y = list(eval(input("请输入所有纵坐标:")))

fig_before = plt.figure()
before = fig_before.add_subplot(111)

before.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_before_lagerange', ylabel='Y-Axis', xlabel='X-Axis')
before.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
before.scatter(point_X, point_Y, s=25, c='r') 


insert_X = list(eval(input("请输入预插入值的横坐标:")))

for x in insert_X:
    result = 0
    for i in range(0, len(point_X)):
        result = result + lagerange(x, point_X, point_Y, i, len(point_X))
    if (x > point_X[len(point_X) - 1]):
        point_X.append(x)
        point_Y.append(result)
    else:
        for mid in point_X:
            if (mid > x):
                position = point_X.index(mid)
                point_X.insert(position, x)
                point_Y.insert(position, result)
                break
        

print(point_Y)

fig_after = plt.figure()
after = fig_after.add_subplot(111)
after.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_after_lagerange', ylabel='Y-Axis', xlabel='X-Axis')
after.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
after.scatter(point_X, point_Y, s=25, c='r') 
plt.show()

牛顿插值法

import matplotlib.pyplot as plt


point_X = list(eval(input("请输入所有横坐标:")))
point_Y = list(eval(input("请输入所有纵坐标:")))

insert_X = list(eval(input("请输入预插入值的横坐标:")))

fig_before = plt.figure()
before = fig_before.add_subplot(111)

before.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_before_Newton', ylabel='Y-Axis', xlabel='X-Axis')
before.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
before.scatter(point_X, point_Y, s=25, c='r') 

for x in insert_X:
    print("-----------------------------------------------------")
    res_1 = point_Y
    time = 1
    first_list = []
    for i in range(0, len(point_X)-1):
        list_demo = []
        for j in range(i + 1, len(point_X)):
            denominator = point_X[j] - point_X[j - time]
            molecule = res_1[j-i] - res_1[j-i-1]
            list_demo.append(molecule*1.0/denominator)
        first_list.append(list_demo[0])
        res_1 = list_demo
        time = time + 1
        flag = i + 1
        print("第%d阶差商表" % flag)
        print(res_1)
        print("第%d阶差商" % flag)
        print(res_1[0])
        result = point_Y[0]
    for i in range(0, len(first_list) - 1):
        mid = 0
        for j in range(0, i + 1):
            if (j == 0):
                mid = first_list[i]*(x - point_X[j])
            else:
                mid = mid * (x - point_X[j])
            print("%f" % first_list[i])
            print("(x - %f)" % point_X[j])
        result = result + mid
    if (x > point_X[len(point_X) - 1]):
        point_X.append(x)
        point_Y.append(result)
    else:
        for mid in point_X:
            if (mid > x):
                position = point_X.index(mid)
                point_X.insert(position, x)
                point_Y.insert(position, result)
                break
print(point_X)
print(point_Y)        

fig_after = plt.figure()
after = fig_after.add_subplot(111)
after.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_after_Newton', ylabel='Y-Axis', xlabel='X-Axis')
after.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
after.scatter(point_X, point_Y, s=25, c='r')
plt.show()

测试方法:

1、输入预测试函数的横坐标列表

2、输入预测试函数的纵坐标列表

3、输入预插入点的横坐标列表(注:如果只有一个点,需要在横坐标后加逗号(英文))

注意:

坐标图的范围可以通过更改xlim与ylim来实现,也可以更改其他参数来改变图的样子

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值