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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

这学期上了一门数值计算课程,老师要求用程序实现拉格朗日插值以及牛顿插值,并验证Runge现象,参照网上相关资料后,用python完成两种插值计算以及输出曲线图。

一、多项式插值

插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为多项式插值。常用的几种多项式插值法有:直接法、拉格朗日插值法和牛顿插值法。

二、Python计算以及曲线图

1.拉格朗日插值

这是在网上查阅到的源码,原文链接:版权归原作者所有,转载需注明。

import numpy as np
import matplotlib.pyplot as plt

X = input("x的值:").split(' ')
Y = input("y的值:").split(' ')
x = input("要预测的值:")
print('\n')

X = np.array(X).astype(np.float64)
Y = np.array(Y).astype(np.float64)
x = np.array(x).astype(np.float64)

n = len(X)

# 原函数
def fun(x):
 return np.sin(x)

# 累乘函数
def T(x, i, X):
 T_i = 1
 for x_i in X:
  if X[i] == x_i:
   continue
  T_i = T_i * (x-x_i)
 return T_i

# 插值基函数
def P(i, x, X, Y):
 P_i = T(x, i, X)/T(X[i], i, X) * Y[i]
 return P_i

# 计算预测值
def L(x, X, Y):
 result = 0
 for i in range(n):
  result = result + P(i, x, X, Y)
 return result

y = L(x, X, Y) 
  
print("预测结果:" + str(y) + '\n')
print("误差:" + str(fun(x) - y))

# 画图
X_n = np.linspace(0, 1, 50)
Y_n = fun(X_n)

x_n = np.linspace(0, 1, 50)
y_n = L(x_n, X, Y)

l1, = plt.plot(X_n, Y_n, label='theory')
l2, = plt.plot(x_n, y_n, label='prediction',linestyle='--')
plt.legend(handles=[l1,l2,],labels=['theory','prediction'], loc='best')

plt.show()

在此基础,对源码进行了部分修改,将计算部分整合成一个函数,其中X,Y为输入的点,x为待计算的值

def lagrange(X,Y,x):
    ans=0.0
    for i in range(len(Y)):
        t=Y[i]
        for j in range(len(Y)):
            if i!=j:
                t*=(x-X[j])/(X[i]-X[j])
        ans+=t
    return ans

2.牛顿插值

基于以上的程序,我们只需要修改插值计算部分,其中x,y为输入的点,u为待计算的值

def newton(x,y,u):
#差商计算
    c=np.zeros((n,n))
    for i in range(n):
        c[i,0]=y[i]
    for i in range(1,n):
        for j in range(i,n):
            c[j,i]=(c[j,i-1]-c[j-1,i-1])/(x[j]-x[j-i])
#预测值s
    s=y[0]
    for i in range(1,n):
        t=1
        for j in range(0,i):
            t*=(u-x[j])
        s+=c[i,i]*t
    
    return s

三、结果分析

1.拉格朗日插值

在这里插入图片描述
我这里输入的点为(1,1)(9,3)(4,2),原函数设置为f(x)=x^0.5,要预测的值为7,也就是用多项式函数g(x)估算根号7的值,输出曲线图如下:
在这里插入图片描述

2.牛顿插值

在这里插入图片描述
我这里输入的点为(16,4)(6.25,2.5)(9,3),要预测的值为10,输出曲线图如下:
在这里插入图片描述

总结

插值原理部分没有写,在网上有挺多博主讲解,写本文主要目的完成作业后无聊记录一下,源代码哪里不理解的可以留言多多交流。如需整份源码,留言即可,我看到后会尽快回复。大家一起加油,好好学习天天向上。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年10月8日 下午8:27
下一篇 2022年10月8日 下午8:30

相关推荐