插值法(拉格朗日插值和牛顿插值)

一、实验内容

这里写图片描述

二、代码(python)

import numpy as np
import matplotlib.pyplot as plt

#牛顿插值
def newton_interpolation(X,Y,init):
    sum=Y[0]
    temp=np.zeros((len(X),len(X)))

    #将第一行赋值
    for i in range(0,len(X)):
        temp[i,0]=Y[i]

    temp_sum=1.0
    for i in range(1,len(X)):
        #x的多项式
        temp_sum=temp_sum*(init-X[i-1])

        #计算均差
        for j in range(i,len(X)):
            temp[j,i]=(temp[j,i-1]-temp[j-1,i-1])/(X[j]-X[j-i])
        sum+=temp_sum*temp[i,i] 
    return sum

#拉格朗日插值
def lagrange_interpolation(X,Y,init):
    sum=0.0
    for i in range(len(X)):
        temp=Y[i]
        for j in range(len(X)):
            if(j!=i):
                temp=temp*((init-X[j])/(X[i]-X[j]))
        sum=sum+temp
    return sum      

def main():
    X=[float(i) for i in (input("请输入X的对应值:").split())]
    Y=[float(i) for i in (input("请输入Y的对应值:").split())]
    init=float(input("请输入要计算的x:"))

    print("插值方法:\n\t1.拉格朗日插值\n\t2.牛顿插值")
    choice=int(input("请选择一种方法:"))

    #在最小值至最大值区间取1000点
    X_temp=np.linspace(np.min(X),np.max(X),1000,endpoint=True)
    Y_temp=[]

    if(choice==1):
        result=lagrange_interpolation(X,Y,init)
        for x in X_temp:
            Y_temp.append(lagrange_interpolation(X,Y,x))
        plt.title("lagrange_interpolation")
    else:
        result=newton_interpolation(X,Y,init)
        for x in X_temp:
            Y_temp.append(newton_interpolation(X,Y,x))
        plt.title("newton_interpolation")

    print("f(%f)的近似值为%f"%(init,result))


    #绘图
    plt.plot(X,Y,'s',label="original values")#蓝点表示原来的值
    plt.plot(X_temp,Y_temp,'r',label='interpolation values')#插值曲线
    plt.xlabel('x')  
    plt.ylabel('y')  
    plt.legend(loc=4)#指定legend的位置右下角
    plt.show()

if __name__=='__main__':
    main()

三、实验结果

  1. 拉格朗日插值
    这里写图片描述
    这里写图片描述
  2. 牛顿插值法
    这里写图片描述
    这里写图片描述

四、感悟

  • 对拉格朗日插值和牛顿插值的算法进一步熟悉。
  • 对于计算机求解和人求解的区别有了更深刻的认识,比如计算机并不能求出拉格朗日插值表达式,而人是可以手算出来的。
  • 虽然自己实现了一下拉格朗日插值,但也去了解了下scipy库的拉格朗日插值使用,它能求出表达式,这个在这就不详谈了。
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值