在数值分析中,插值方法是基础且重要的。本文将介绍Lagrange插值公式与Newton插值公式。此外,针对Runge现象,本文给出了稍稍详细的讨论。

一、Lagrange插值公式

假设函数 \(y=f(x)\) 在取定的\(n+1\)个互异的基点 \(x_0,x_1,\cdots,x_n\) 处的值已知分别为 \(y_0=f(x_0),y_1=f(x_1),\cdots,y_n=f(x_n)\),现在要寻找多项式 \(p(x)\) 使得 $$p(x_k)=f(x_k), \quad k=0,1,\cdots,n$$

\[l_i(x)=\prod_{j=0, j \neq i}^n \frac{x-x_j}{x_i-x_j},\quad i=0,1,\cdots,n
\]

\[p_n(x)=\sum_{i=0}^nf(x_i)l_i(x)
\]

这就是满足条件的多项式。

利用等距基点计算函数 \(f(x)=\frac{\sin{e^{-x^2}}}{\sqrt{x+2}}\) 在区间 \([-1,1]\) 上的值。

import math
def fun1(t):
return math.sin(math.exp(-t**2))/math.sqrt(t+2) def LagIn(X,P,x):
Pol=0
length=len(P)
count1=0
while count1 <= length-1:
lpoly=P[count1]
count2=0
while count2 <= length-1:
if count1 != count2:
lpoly=lpoly*(x-X[count2])/(X[count1]-X[count2])
else:
lpoly=lpoly
count2=count2+1
Pol=Pol+lpoly
count1=count1+1
return Pol n=int(input("输入基点个数:"))
A=[]
K=[]
Result=[]
count=0
while count <= n:
A.append(fun1(-1+count*2/n))
K.append(-1+count*2/n)
count=count+1
count=0
print(LagIn(K,A,0.1))

考虑误差问题。记

\[r_n(x)=f(x)-p_n(x)
\]

若\(f(x)\)在包含\(n+1\)个插值基点\(x_0,x_1,\cdots,x_n\)的区间\([a,b]\)上有\(n\)阶连续导数,且在\((a,b)\)内存在\(n+1\)阶有界导数,那么对\([a,b]\)上的每一点\(x\)必存在一点\(\eta \in (a,b)\)使得

\[r_n(x)=\frac{f^{(n+1)}(\eta)}{(n+1)!}\prod_{i=0}^n(x-x_i)
\]

二、均差与Newton插值公式

仍然使用上一节的记号。考虑形如

\[N_n(x)=a_0+a_1(x-x_0)+a_2(x-x_0)(x-x_1)+\cdots+a_n(x-x_0)(x-x_1)\cdots(x-x_{n-1})
\]

的多项式,满足条件

\[N_n(x_i)=f(x_i),\quad i=0,1,\cdots,n
\]

由线性代数的知识容易知道,\(a_0,a_1,\cdots,a_n\)是唯一确定的。考虑这种形式的多项式的好处是,当需要增加基点时,可以减少计算量。

下面引入均差的概念来确定该插值多项式的系数。

\(f(x)\)关于基点\(x_0,x_1,\cdots,x_n\)的n阶均差定义为

\[f[x_0,x_1,\cdots,x_n]=\frac{f[x_1,x_2,\cdots,x_n]-f[x_0,x_1,\cdots,x_{n-1}]}{x_n-x_0}
\]

规定

\[f[x_i]=f(x_i)
\]

是\(f(x)\)关于基点\(x_i\)的零阶均差。

利用数学归纳法可以证明:n阶均差可以写成

\[f[x_0,x_1,\cdots,x_n]=\sum_{i=0}^n\frac{f(x_i)}{\prod_{j=0,j\neq i}^n(x_i-x_j)}
\]

与利用Lagrange插值法得到的多项式比较可知,\(N_n(x)\)的系数

\[a_k=f[x_0,x_1,\cdots,x_k],\quad k=0,1,\cdots,n
\]

三、Runge现象

考虑函数

\[f(x)=\frac{1}{1+x^2},\quad x\in [-5,5]
\]

对该函数在等距基点上插值,分别取插值基点个数为5,10,15,20,30,作出误差图像,如下所示:






import math
import matplotlib.pyplot as mpl
def fun1(t):
return (1+t**2)**(-1) def LagIn(X,P,x):
Pol=0
length=len(P)
count1=0
while count1 <= length-1:
lpoly=P[count1]
count2=0
while count2 <= length-1:
if count1 != count2:
lpoly=lpoly*(x-X[count2])/(X[count1]-X[count2])
else:
lpoly=lpoly
count2=count2+1
Pol=Pol+lpoly
count1=count1+1
return Pol n=int(input("输入基点个数:"))
A=[]
K=[]
Result=[]
count=0
while count <= n:
A.append(fun1(-5+count*10/n))
K.append(-5+count*10/n)
count=count+1
count=0
B=[]
F=[]
while count <= 10000:
B.append(-5.01+count*10.02/10000)
F.append((fun1(B[count])-LagIn(K,A,B[count])))
count=count+1 mpl.plot(B,F)
mpl.show()

可以看到,插值多项式在端点附近有较大的误差。事实上可以证明

\[\lim_{n \to \infty}\max_{x \in [-5,5]}|f(x)-p_n(x)|= \infty
\]

这就是所谓的Runge现象。下面将进行仔细讨论。

在区间\([a,b]\)上,记插值基点为\(\{x_j^{(n)}\},\quad j=0,1,\cdots,n\),插值多项式为\(p_n(x)\)。首先估计误差项\(f(x)-p_n(x)\)。

由Newton插值法,在区间\([a,b]\)上取与插值基点相异的一个基点 \(x=t\),得到

\[p_{n+1}(x)=p_n(x)+f[x_0,x_1,\cdots,x_n,t](x-x_0)(x-x_1)\cdots(x-x_n)
\]

由于\(p_{n+1}(t)=f(t)\),因此

\[f(x)-p_n(x)=f[x_0,x_1,\cdots,x_n,x]\prod_{j=0}^n(x-x_{j}^{(n)})
\]

下面记

\[\omega_n(x)=\prod_{j=0}^n(x-x_{j}^{(n)})
\]

下面在复平面上考虑问题,插值基点视作实轴上的点,仍保留原来的记号。

由留数定理

\[f[x_0,x_1,\cdots,x_n]=\sum_{i=0}^n\frac{f(x_i)}{\prod_{j=0,j\neq i}^n(x_i-x_j)}=\sum_{i=0}^n\mathrm{Res}(\mathrm{g},x_i)=\frac{1}{2\pi i}\int_Cg(z)\mathrm{d}z
\]

其中

\[g(z)=\frac{f(z)}{\prod_{i=0}^n(z-x_i)}
\]

C是曲线,使得插值基点在它内部,\(f\)在其内部解析。类似可以求得\(f[z,x_0,x_1,\cdots,x_n]\)的表达式。从而得到

\[f(z)-p_n(z)=\frac{1}{2\pi i}\int_C\frac{\omega_n(z)}{\omega_n(\eta)}\frac{f(\eta)}{\eta-z}\mathrm{d}\eta
\]

为了进一步估计,需要先证明以下引理:

引理 假设\(\{x_j^{(n)}\}\)是区间\([a,b]\)上的等距基点,定义

\[\sigma_n(z)=|\omega_n(z)|^{\frac{1}{n+1}}
\]

\[\lim_{n\to \infty}\sigma_n(z)=\sigma(z)=\mathrm{exp}\{\frac{1}{b-a}\int_a^b \mathrm{ln}|z-s|\mathrm{d}s\}
\]

证明:

\[\mathrm{ln}\sigma_n(z)=\frac{1}{n+1}\sum_{i=0}^n \mathrm{ln}|z-a-\frac{b-a}{n}i|
\]

由黎曼积分的定义知

\[\lim_{n\to \infty}\mathrm{ln}\sigma_n(z)=\frac{1}{b-a}\int_a^b\mathrm{ln}|z-s|\mathrm{d}s
\]

引理成立。

考虑曲线

\[C(\rho)=\{z \in \mathbb{C}|\sigma(z)=\rho \}
\]

命题 \(\{x_j^{(n)}\}\)是包含在曲线\(C(\rho)\)中的等距插值基点,若\(f\)在\(C(\rho)\)中解析,则\(p_n\)在\(C(\rho'),\rho' < \rho\)上一致收敛于\(f\)。

证明:假设\(z\)在曲线\(C(\rho')\)上,显然\(C(\rho)\)和\(C(\rho')\)是不交的,因此有以下估计:

\[|f(z)-p_n(z)|\leq\frac{1}{2\pi i}\int_{C(\rho)}|\frac{\omega_n(z)}{\omega_n{(\eta)}}||\frac{f(\eta)}{\eta-z}|\mathrm{d}\eta
\]

由于\(|f(\eta)|\)和\(|\eta-z|\)在\(C(\rho)\)上分别由上界和下界,因此

\[|f(z)-p_n(z)|\leq A \max_{\eta \in C(\rho)}|\frac{\omega_n(z)}{\omega_n(\eta)}|
\]

考虑引理中的结果,由\(\lim_{n \to \infty}\sigma_n(z)=\rho'\)及\(\lim_{n \to \infty}\sigma_n(\eta)=\rho\),对\(\epsilon < \frac{|p-p'|}{3}\)能够取到\(n\)使得

\[|\frac{\omega_n(z)}{\omega_n(\eta)}|^\frac{1}{n+1}=\frac{\sigma_n(z)}{\sigma_n(\eta)}\leq \frac{\rho'+\epsilon}{\rho-\epsilon}<1
\]

从而可以证明一致收敛。

考虑\(f\)在\(C(\rho)\)中并不解析的情况。仅仅讨论一种特殊情况:若只有一个一阶极点\(z^*\),此时

\[f(z)-p_n(z)=\frac{1}{2\pi i}\int_{C(\rho)}\frac{\omega_n(z)}{\omega_n(\eta)}\frac{f(\eta)}{\eta-z}\mathrm{d}\eta+\frac{1}{2\pi i}\int_{C^*}\frac{\omega_n(z)}{\omega_n(\eta)}\frac{f(\eta)}{\eta-z}\mathrm{d}\eta
\]

其中\(C^*=C(\rho^*)\)是围绕极点的一条路径。由上面的讨论知,第一项趋于零。利用留数定理,第二项可以写成

\[B\frac{\omega_n(z)}{\omega_n(z^*)}
\]

其中

\[B=\lim_{\eta \to z^*}\frac{f(\eta)}{(\eta-z^*)(\eta-z)}
\]

是有界的。

\[|\frac{\omega_n(z)}{\omega_n(z^*)}|^\frac{1}{n+1}=\frac{\sigma_n(z)}{\sigma_n(z^*)}\geq\frac{\rho'-\epsilon}{\rho^*+\epsilon}>1
\]

此时\(f(z)-p_n(z)\)并不收敛。

上面的讨论并没有给出Runge现象的充要条件。当插值区间过大时,可能会出现Runge现象;缩小插值区间,可以避免Runge现象,因此可以考虑分段插值的方法。此外也可以采用Chebyshev基点进行插值,这就不在本文的讨论范围内了。


参考

[1]Epperson J. On the Runge Example[J]. The American Mathematical Monthly, 1987, 94(4):329-341.

[2]林成森. 数值计算方法[M]. 科学出版社, 2005.

[3]作者本人的实验报告.

数值分析——插值(一)、Runge现象的更多相关文章

  1. 数值分析案例:Newton插值预测2019城市(Asian)温度、Crout求解城市等温性的因素系数

    数值分析案例:Newton插值预测2019城市(Asian)温度.Crout求解城市等温性的因素系数 文章目录 数值分析案例:Newton插值预测2019城市(Asian)温度.Crout求解城市等温 ...

  2. Jacobi与SOR迭代法的实现与性能比较及均匀间距与Chebyshev插值的实现、性能分析及二者生成的插值误差比较

    这篇文章给出(1)Jacobi与SOR迭代法的实现与性能比较及(2)均匀间距与Chebyshev插值的实现.性能分析及二者生成的插值误差比较,给出完整的实现代码,没有进行性能优化,仅供参考. (1)J ...

  3. MATLAB中插值算法实现

    %%%1.M文件%(1).以往少的程序可以在命令行窗口进行编码,但大量的程序编排到命令行窗口,%会有造成乱码的危险.(2).如果将命令编成程序存储在一个文件中(M文件),依次运行文件中的命令,则可以重 ...

  4. 【数值分析】Python实现Lagrange插值

    一直想把这几个插值公式用代码实现一下,今天闲着没事,尝试尝试. 先从最简单的拉格朗日插值开始!关于拉格朗日插值公式的基础知识就不赘述,百度上一搜一大堆. 基本思路是首先从文件读入给出的样本点,根据输入 ...

  5. scipy插值与拟合

    原文链接:https://zhuanlan.zhihu.com/p/28149195 1.最小二乘拟合 实例1 import numpy as np import matplotlib.pyplot ...

  6. 转Python SciPy库——拟合与插值

    1.最小二乘拟合 实例1 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq p ...

  7. 图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen

    图像的降采样与升采样(二维插值) 1.先说说这两个词的概念: 降采样,即是采样点数减少.对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中 每行每列每隔k个点取一个点组成一幅图像.降采样很容 ...

  8. 空间插值文献阅读(Geostatistical approaches for incorporating elevation into the spatial interpolation of rainfall)

    空间插值技术应用必读论文---P. Goovaerts, Geostatistical approaches for incorporating elevation into the spatial ...

  9. 数值分析1:三角函数的计算(C语言实现)

    之前学习C语言的时候,一直有个疑问,计算机从芯片设计的角度来看,只能计算常规的加减乘及移位之类的操作,那么对于像sin .cos这些三角函数,人脑尚无可以直接运算的法则,那么计算机是怎么实现的呢?最近 ...

随机推荐

  1. 华为 Quidway S3700-28TP-SI-AC Routing Switch 配置时间(ntp)

    设置ntp服务器: [SW03] ntp unicast-server x.x.x.x 记住一定要退出特权模式之后再设置时区 <SW03>clock timezone beijing ad ...

  2. Docker Desktop 可以直接启用Kubernetes 1.25 了

    作为目前事实上的容器编排系统标准,K8s 无疑是现代云原生应用的基石,很多同学入门可能直接就被卡到第一关,从哪去弄个 K8s 的环境, Docker Desktop 自带了Kubernetes 服务, ...

  3. Linux实战笔记_CentOS7_yum相关配置

    配置yum源优先级 配置优先级 yum -y install yum-plugin-priorities.noarch vi /etc/yum.repos.d/localISO.repo priori ...

  4. Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)

    文章目录 1.基本列表 1.1 基本知识 1.2 代码实例 1.3 测试效果 2.key的原理 2.1基本知识 2.2 代码实例 2.3 测试效果 2.4 原理图解 3.列表过滤 3.1 代码实例 3 ...

  5. 知识图谱顶会论文(ACL-2022) CAKE:用于多视图KGC的可扩展常识感知框架

    CAKE:用于多视图KGC的可扩展常识感知框架.pdf 论文地址:CAKE:Scalable Commonsense-Aware Framework For Multi-View Knowledge ...

  6. Spark基本知识

    Spark基本知识 Spark 是一种基于内存的快速.通用.可扩展的大数据分析计算引擎. spark与hadoop的区别 Hadoop Hadoop 是由 java 语言编写的,在分布式服务器集群上存 ...

  7. .NET 7 AOT 的使用以及 .NET 与 Go 互相调用

    目录 背景 C# 部分 环境要求 创建一个控制台项目 体验 AOT 编译 C# 调用库函数 减少体积 C# 导出函数 C# 调用 C# 生成的 AOT Golang 部分 安装 GCC Golang ...

  8. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  9. NC-UClient下载安装应用详解

    aliases: [] tags : " #NC " summary: [UClient下载安装NCC应用详解] product: [NCX] author : [yaenli] ...

  10. 解决Halcon转C#时,图像显示的问题

    不知道大家在使用Halcon进行图像处理,由于要连续处理多张图片,转为C#代码的时候,使用了Halcon控件显示图像,但是运行的时候,中间的其他图片没有显示在控件上,之前我一直以为是运行速度快导致看不 ...