计算方法中的Lagrange插值

合集下载

Lagrange多项式插值及其应用

Lagrange多项式插值及其应用

Lagrange多项式插值及其应用作者:江楚萌来源:《中国科技纵横》2018年第20期摘要:本文围绕Lagrange多项式插值进行论述,介绍了Lagrange插值方法的原理,给出了Lagrange插值在高中数学知识解题中的一些有趣应用,并结合MATLAB算法对某动态系统的实例进行了研究。

关键词:多项式;Lagrange插值;MATLAB算法中图分类号:O174.42 文献标识码:A 文章编号:1671-2064(2018)20-0253-021 引言与预备知识不论在数学学科的数值计算中,还是在工程领域的生产实践中,许多问题都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解,给不出精确的表达式,或者函数的表达式过于复杂不利于计算;如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值;这时我们就需要构造这个函数的近似函数,数学上称这种方法为插值[1-2]。

插值法作为数值微分、函数逼近及微分方程数值解的基础,在当今社会越来越受学者们的关注[3-4]。

尤其是随着计算机的普及,很多研究工作者将插值法与MATLAB等软件结合,使得插值法在超大规模数值计算中得到了更广泛的应用。

插值问题概述:设函数在区间有个不同点,且对应的函数值,在函数类中寻找一函数作为的近似表达式,使满足:这时称为被插值函数,称为插值函数,称为插值点,简称节点,称为插值区间。

寻找插值函数的方法称为插值方法。

常用的插值方法有:Lagrange插值、Newton插值、Hermite插值和三次样条插值等。

本文主要围绕Lagrange插值进行论述,从Lagrange插值原理的特点出发,给出了该方法在高中数学知识中有趣的一些应用,并结合MATLAB算法对某动态系统的实例进行了研究。

2 Lagrange插值公式插值函数的构造,会因选择函数类的不同,相应地会采用不同的插值方法。

由于多项式函数具有结构简单等一些良好的特征,譬如多项式是无穷光滑的,其导数及积分较容易计算。

计算方法 插值法Lagrange插值

计算方法 插值法Lagrange插值
xi , i 0,1,..., n
的n次插值基函数
以n+1个n次基本插值多项式lk(x)(k 0,1, … , n) 为基础,可直接写出满足插值条件
P(xi ) f(x i ) (i 0,1,2, … , n)
的n次代数插值多项式:
P(x) l0(x)y 0 l1(x)y1 … ln(x)yn
B(x1, f(x1))
x0
x1
由解析几何知道,这条直线用点斜式表示为
改写为
p(x)
y0
y1 x1
y0 x0
(x
x0)
p(x)
x x1 x0 x1
y0
x x0 x1 x0
y1
为了便于推广,记
推导
l0(x)
x x1 , x0 x1
l1(x )
x x0 x1 x0
线性插值 基函数
或者写成:
(i 0,1,2)
其几何意义是用经过3个点
(x0, y0 ), (x1, y1), (x2, y2 )
的抛物线 y P(x) 用以近似计算 y f(x)
y=f(x)
y
y = L 2 (x)
y0
y1
x0
x1
y2 x
x2
P(x)的系数 a0 , a1, a2 直接由插值条件决定,即
a0 , a1, a2 满足代数方程组:
(x 0 x1)(x 0 x2 )
从而导出 l0(x)
(x (x 0
x1)(x x2 ) x1)(x 0 x2 )
类似地可以构造出插值多项式 l1(x )和l2 (x )
于是确定了3个抛物插值的基函数:
l0(x)
(x (x 0
x1)(x x1)(x

计算方法_课后习题答案

计算方法_课后习题答案

(4.5)(0.01172)

0.00879
(2)采用 Newton 插值多项式 y x N2(x) 根据题意作差商表:
i
xi
0
4
1
6.25
f (xi ) 2 2.5
一阶差商 2 9
2
9
3
2 11
二阶差商 4 495
N2 (7) 2 29 (7 4) ( 4 495) (7 4) (7 6.25) 2.6484848

1
e2
则根据二次Lagrange插值公式得:
L2 (x)

(x ( x0

x1)(x x2 ) x1)(x0 x2 )
y0

(x ( x1

x0 )(x x2 ) x0 )(x1 x2 )
y1

(x ( x2

x0 )(x x1) x0 )(x2 x1)
y2
2(x 1)(x 0.5) 2x(x 0.5)e1 4x(x 1)e0.5
8. 求作 f x xn1 关于节点 xi i 0,1, , n 的 Lagrange 插值多项式,并利用
插值余项定理证明
n
n
xin1li 0 1n xi
i0
i0
式中 li x 为关于节点 xi i 0,1, , n 的 Lagrange 插值基函数。
2 02 12 4 23 4 04 14 2 3
1 x2 3x 2 x 4 3x x2 6x 8 23 x x2 5x 4 1 x x2 3x 2
8
4
8

数值计算方法习题答案

数值计算方法习题答案

《数值计算方法》课后题答案详解吉 林 大 学第一章 习 题 答 案1. 已知(1)2,(1)1,(2)1f f f −===,求()f x 的Lagrange 插值多项式。

解:由题意知:()01201212001020211012012202121,1,2;2,1,1()()(1)(2)()()6()()(1)(2)()()2()()(1)(1)()()3(1)(2)(1)(2)()2162nj j j x x x y y y x x x x x x l x x x x x x x x x x l x x x x x x x x x x l x x x x x x x x L x y l x ==−=====−−−−==−−−−+−==−−−−−+−==−−−−+−==×+×−∴∑()2(1)(1)131386x x x x +−+×=−+2. 取节点01210,1,,2x x x ===对x y e −=建立Lagrange 型二次插值函数,并估计差。

解11201201210,1,;1,,2x x x y y e y e −−======1)由题意知:则根据二次Lagrange插值公式得:02011201201021012202110.510.520.51()()()()()()()()()()()()()2(1)(0.5)2(0.5)4(1)(224)(43)1x x x x x x x x x x x x L x y y y x x x x x x x x x x x x x x x x e x x e e e x e e x −−−−−−−−−−−−=++−−−−−−=−−+−−−=+−+−−+22)Lagrange 根据余项定理,其误差为(3)2210122()1|()||()||(1)(0.5)|3!61max |(1)(0.5)|,(0,1)6()(1)(0.5),()330.5030.2113()61()0.2113(0.21131)(0.21130.5)0.008026x f R x x e x x x x x x t x x x x t x x x x t x R x ξξωξ−+≤≤==−−≤−−∈′=−−=−+=−==≤××−×−=∴取 并令 可知当时,有极大值3. 已知函数y =在4, 6.25,9x x x ===处的函数值,试通过一个二次插值函数求的近似值,并估计其误差。

lagrange插值定理在高等代数中的不同解读

lagrange插值定理在高等代数中的不同解读

Lagrange插值定理在数学中有着重要的地位,特别是在高等代数中起着至关重要的作用。

它可以用来解决复杂的多项式函数的插值问题,为我们理解和应用数学领域的知识提供了有力的工具。

在不同的学术领域,人们对于Lagrange插值定理有着不同的解读,从而衍生出不同的应用和研究方向。

本文将从几个不同的角度来探讨Lagrange插值定理在高等代数中的不同解读。

一、数学领域中的Lagrange插值定理解读Lagrange插值定理最基本的形式可以描述为:给定一个次数为n的多项式函数,通过n+1个互异的插值点,可以确定该多项式函数的系数,并进而插值计算出其他点的函数值。

从数学的角度来看,Lagrange插值定理是关于多项式插值的一个重要定理。

1. 从数学原理角度解读从数学原理角度来看,Lagrange插值定理是建立在对多项式插值理论的深入研究之上的。

它涉及到多项式插值的基本概念和方法,通过对于插值点的选取和多项式函数的构造来实现对未知函数值的估计。

在数学原理角度下,人们可以进一步研究多项式插值的稳定性、误差估计和收敛性等问题,从而深化对Lagrange插值定理的理解,并且将其应用于更广泛的数学领域。

2. 从数值计算角度解读与数学原理角度不同,Lagrange插值定理也可以从数值计算的角度来解读。

在数值计算中,我们常常需要利用已知的数据点来估计未知函数值,在这种情况下,Lagrange插值定理就可以发挥出极大的作用。

通过构造插值多项式,我们可以利用插值多项式来进行数值计算,从而得到我们所需要的结果。

从数值计算的角度来看,Lagrange插值定理是一个非常实用的工具和方法。

二、Lagrange插值定理在高等代数中的应用除了在数学领域中有着重要的理论意义之外,Lagrange插值定理在高等代数中还有着广泛的应用。

在高等代数课程中,Lagrange插值定理不仅可以帮助学生更深入地理解多项式插值的原理,还可以通过实际案例来展示插值多项式的具体应用。

第一章 第一节 Lagrange插值公式.

第一章 第一节 Lagrange插值公式.

Rn
x

M n+1 n +1
max ! axb
n+1
x
Lagrange余项定理在理论上有重要价值,它刻画了 Lagrange插值的某些基本特征。
n
注1 余项中含有因子n+1 x x xi ,如果插值点x 偏离插 i0
值节点xi 比较远,插值效果可能不理想。如何选择节点xi ,
可以证明,插值问题1.1、1.2 的解是存在且唯一的。为了
得到 Lagrange 公式的一般形式,我们先从最简单的一次插 值入手。
二、线性插值
已知:
x
x0
x1
y
y0
y1
求一个一次多项式P1(x) ,使满足
P1(xi ) yi ,i 0,1.
即求过点 x0, y0 , x1, y1 的一次曲线
使
Rn x
f x Pn x
f n+1
n +
1!
n+1

x

1.9
记 M n+1

max
a xb
f n+1 x ,于是由1.9 式可得
或者
Rn
x

M n+1
n +1!
n+1 x

1.10
max axb
简单才行。如果仅仅给出了一系列节点上的函数值
f xi yi ,i 0,1, 2,L , n ,则应采用 Lagrange 插值。
如果只提供了 f x 的一些离散值,并没给出具体的分析式 子, 就无法利用公式1.9 估计误差了。下面介绍另一种误差

计算方法课后习题集规范标准答案

计算方法课后习题集规范标准答案

习 题 一3.已知函数y =4, 6.25,9x x x ===处的函数值,试通过一个二次插值函解:0120124, 6.25,9;2, 2.5,3y x x x y y y =======由题意 (1) 采用Lagrange插值多项式220()()j j j y L x l x y ==≈=∑27020112012010*********()|()()()()()()()()()()()()(7 6.25)(79)(74)(79)(74)(7 6.25)2 2.532.255 2.25 2.75 2.7552.6484848x y L x x x x x x x x x x x x x y y y x x x x x x x x x x x x ==≈------=++------------=⨯+⨯+⨯⨯-⨯⨯= 其误差为(3)25(3)25(3)2[4,9]2()(7)(74)(7 6.25)(79)3!3()83max |()|40.0117281|(7)|(4.5)(0.01172)0.008796f R f x x f x R ξ--=---==<∴<=又则(2)采用Newton插值多项式2()y N x =≈ 根据题意作差商表:224(7)2(74)()(74)(7 6.25) 2.64848489495N =+⨯-+-⨯-⨯-≈4. 设()()0,1,...,k f x x k n ==,试列出()f x 关于互异节点()0,1,...,i x i n =的Lagrange 插值多项式。

注意到:若1n +个节点()0,1,...,i x i n =互异,则对任意次数n ≤的多项式()f x ,它关于节点()0,1,...,i x i n =满足条件(),0,1,...,i i P x y i n ==的插值多项式()P x 就是它本身。

可见,当k n ≤时幂函数()(0,1,...,)kf x x k n ==关于1n +个节点()0,1,...,i x i n =的插值多项式就是它本身,故依Lagrange 公式有()00(),0,1,...,nn n k kk i j j j j j i j ii jx x x l x x x k n x x ===≠-=≡=-∑∑∏特别地,当0k =时,有()0001nn n ij j j i j ii jx x l x x x ===≠-=≡-∑∑∏而当1k =时有()000nnn ij j j j j i j ii jx x x l x x x x x ===≠⎛⎫- ⎪=≡ ⎪- ⎪⎝⎭∑∑∏ 5.依据下列函数表分别建立次数不超过3的Lagrange 插值多项式和Newton 插值多项式,并验证插值多项式的唯一性。

数值分析Lagrange插值

数值分析Lagrange插值
0
分别利用x 分别利用 0, x1 以及 x1, x2 计算
π
6 , x1 =
π
4
5π ⇒ sin 50 ≈ L1 ( ) ≈ 0.77614 18 (2) f (ξ x ) π π 1
R1 ( x ) = 2!
L1(x) = x −π / 4 × 1 + x −π / 6 × 1 π / 6−π / 4 2 π / 4−π / 6 2
f (n+1) (ξ ) n Rn ( x) = f ( x) − Ln ( x) = ∏(x − xi ) (n + 1)! i =0
Rolle’s Theorem的推论 若 ϕ (x )充分光滑,且 的推论: 充分光滑, 的推论 存在 ξ ∈ (a , b) 使得 ϕ ( n ) (ξ ) = 0 ϕ ( x0 ) = L = ϕ ( xn ) = 0
...
n n
x x
i −1
= ∏∏ ( x i − x j )
i =1 j = 0
由于x 互异,所以(4)右端不为零, (4)右端不为零 由于xi互异,所以(4)右端不为零,从而方程组 (3)的解 (3)的解 a0 ,a1 ,…an 存在且唯一。 a 存在且唯一。
通过解上述方程组(3)求得插值多项式 通过解上述方程组 求得插值多项式pn(x)的方法并 求得插值多项式 的方法并 不可取.这是因为当 较大时解方程组的计算量较大, 这是因为当n较大时解方程组的计算量较大 不可取 这是因为当 较大时解方程组的计算量较大, 而且方程组系数矩阵的条件数一般较大(可能是 而且方程组系数矩阵的条件数一般较大(可能是 病态方程组) 当阶数 当阶数n越高时,病态越重。 病态方程组),当阶数 越高时,病态越重。 为此我们必须从其它 途径来求P 途径来求 n(x): : 不通过求解方程组而 获得插值多项式

拉格朗日(Lagrange)插值算法

拉格朗日(Lagrange)插值算法

拉格朗⽇(Lagrange)插值算法拉格朗⽇插值(Lagrange interpolation)是⼀种多项式插值⽅法,指插值条件中不出现被插函数导数值,过n+1个样点,满⾜如下图的插值条件的多项式。

也叫做拉格朗⽇公式。

这⾥以拉格朗⽇3次插值为例,利⽤C++进⾏实现:1//利⽤lagrange插值公式2 #include<iostream>3using namespace std;45double Lx(int i,double x,double* Arr)6 {7double fenzi=1,fenmu=1;8for (int k=0;k<4;k++)9 {10if (k==i)11continue;12 fenzi*=x-Arr[k];13 fenmu*=Arr[i]-Arr[k];14 }15return fenzi/fenmu;16 }1718int main()19 {20double xArr[4]={};21double yArr[4]={};22//输⼊4个节点坐标23 cout<<"请依次输⼊4个节点的坐标:"<<endl;24for (int i=0;i<4;i++)25 cin>>xArr[i]>>yArr[i];2627//输⼊要求解的节点的横坐标28 cout<<"请输⼊要求解的节点的横坐标:";29double x;30 cin>>x;31double y=0;32for (int i=0;i<4;i++)33 y+=Lx(i,x,xArr)*yArr[i];34 printf("x=%lf时,y=%lf\n",x,y);3536//分界,下⾯为已知y求x37 cout<<"请输⼊要求解的节点的纵坐标:";38 cin>>y;39 x=0;40for (int i=0;i<4;i++)41 x+=Lx(i,y,yArr)*xArr[i];42 printf("y=%lf时,x=%lf\n",y,x);4344 system("pause");45return0;46 }作者:耑新新,发布于转载请注明出处,欢迎邮件交流:zhuanxinxin@。

数值计算方法实验之Lagrange多项式插值(Python代码)

数值计算方法实验之Lagrange多项式插值(Python代码)

数值计算⽅法实验之Lagrange多项式插值(Python代码)⼀、实验⽬的在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]⽽⼜需要给出其在[a,b]上的值时,按插值原则f(x i)= y i(i= 0,1…….,n)求出简单函数P(x)(常是多项式),使其在插值基点x i,处成⽴P(x i)=y i(i=0,1,……,n),⽽在[a,b]上的其它点处成⽴f(x)≈P(x).⼆、实验原理三、实验内容求之f(x)=x4在[0,2]上按5个等距节点确定的Lagrange插值多项式.四、实验程序1import matplotlib.pyplot as plt2from pylab import mpl34#计算插值多项式的系数。

5 x = [0, 0.5, 1, 1.5, 2]6 y = [0, 0.0625, 1, 5.0625, 16]78def ParametersOfLagrangeInterpolation(data_x,data_y,size):9 parameters=[]1011 i=0;#i⽤来控制参数的个数12while i < size:13 j = 0;#j⽤来控制循环的变量做累乘14 temp = 1;15while j < size:16if(i != j):17 temp*=data_x[i]-data_x[j]18 j+=1;19 parameters.append(data_y[i]/temp)20 i += 1;21return parameters2223#计算拉格朗⽇插值公式的值。

2425def CalculateTheValueOfLarangeInterpolation(data_x,parameters,x):26 returnValue=027 i = 0;28while i < len(parameters):29 temp = 130 j = 0;31while j< len(parameters):32if(i!=j):33 temp *=x-data_x[j]34 j+=135 returnValue += temp * parameters[i]36 i += 137return returnValue3839#将函数绘制成图像40def Draw(data_x,data_y,new_data_x,new_data_y):41 plt.plot(new_data_x, new_data_y, label="拟合曲线", color="red")42 plt.scatter(data_x,data_y, label="离散数据",color="yellow")43 plt.scatter(1.75, 9.37890625, label="真实数据", color="orange")44 plt.scatter(1.25, 2.44140625, color="green")45 mpl.rcParams['font.sans-serif'] = ['SimHei']46 mpl.rcParams['axes.unicode_minus'] = False47 plt.title("Lagrange插值拟合数据")48 plt.legend(loc="upper left")49 plt.show()5051 parameters=ParametersOfLagrangeInterpolation(x,y,5)52 datax=[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2]53 datay=[]54for temp in datax:55 datay.append(CalculateTheValueOfLarangeInterpolation(x,parameters,temp))56 x.append(1.75)57 y.append(CalculateTheValueOfLarangeInterpolation(x,parameters,1.75))58 Draw(x,y,datax,datay)59print("得到的四次Lagrange插值多项式为:L(x) = %f(x-0)(x-1)(x-1.5)(x-2) + %f(x-0)(x-0.5)(x-1.5)(x-2) + %f(x-0)(x-0.5)(x-1)(x-2) + %f(x-0)(x-0.5)(x-1)(x-1.5)"%(parameters[1],parameters[2],parameters[3],parameters[4]))五、运算结果(1)图像得到的四次Lagrange插值多项式为:L(x) = -0.166667(x-0)(x-1)(x-1.5)(x-2) + 4.000000(x-0)(x-0.5)(x-1.5)(x-2) + -13.500000(x-0)(x-0.5)(x-1)(x-2) + 10.666667(x-0)(x-0.5)(x-1)(x-1.5)。

拉格朗日(Lagrange)插值

拉格朗日(Lagrange)插值
x) 每个 li 有 n 个根 x0 … xi … xn, 是n次多项式。
li ( x) = Ci ( x x0 )...(x xi )...(x xn ) = Ci ( x x j ) ji j =0 1 li ( xi ) = 1 Ci = j i ( xi xj )
l ( x) y
i =0 i
1
i
l0(x)
l1(x)
称为拉格朗日插值基函数 , 满足条件 li(xj)=ij /* Kronecker Delta */
n1
希望找到li(x),i = 0, …, n 使得 li(xj)=ij ;然后令
Pn ( x ) =
l (x) y
i=0 i
n
i
,则显然有Pn(xi) = yi 。
§4.2 拉格朗日(Lagrange)插值
n 求 n 次多项式 Pn ( x) = a0 a1 x an x 使得
Pn ( x i ) = y i ,
i = 0 , ... , n
条件:无重合节点,即 i j
xi x j
一. 插值多项式的存在唯一性 定理4.2.1 : 在 n 1 个互异节点 xk 处满足插值条件 Pn ( xk ) = yk
n
f
( n 1)
( n 1 ) ( x0 ) = = ( xn ) = 0( n 1 ) ( x ) Ln ( x ) K ( x )( n 1) ! = Rn ( x ) K ( x ) ( n 1) ! ( n) 存在 (a, b) 使得 ( ) = 0 ( n 1 ) n ( n 1 ) f ( ) x f ( x) Rn ( x ) = ( x xi ) = K ( x) (n 1) ! i =0 ( n 1) !

拉格朗日多项式插值

拉格朗日多项式插值

拉格朗日多项式插值法浅析摘要拉格朗日插值多项式是一种最常见的多项式插值法,也是一种最常用的逼近工具。

“学以致用 ”是每一门学科都致力追求的境界,数学自然也不例外。

下面,探讨拉格朗日插值法的基本原理、如何构造拉格朗日多项式、拉格朗日多项式的误差界,并用 MATLAB 程序来实现这一数学算法的自动化,为复杂的分析研究提供了一条数学算法的捷径。

【关键词】:拉格朗日多项式 算法实现 MATLAB在科学研究和实际的工程设计中,几乎所有的问题都可以用)(x f y =来表示其某种内在规律的数量关系。

但理想化的函数关系在实际工程应用中是很难寻找 的,对于那些没有明显解析式的函数关系表达式则只能通过实验观察的数据,利用多项式对某一函数的进行逼近,使得这个逼近函数能够反映)(x f 的特性,而且利用多项式就可以简便的计算相应的函数值。

例如我们不知道气温随日期变化的具体函数关系,但是我们可以测量一些孤立的日期的气温值,并假定此气温随日期变化的函数满足某一多项式。

这样,利用已经测的数据,应用待定系数法便可以求得一个多项式函数f (x )。

应用此函数就可以计算或者说预测其他日期的气温值。

一般情况下,多项式的次数越多,需要的数据就越多,而预测也就越 准确。

当然,构造组合多项式方法比较多,如线性方程求解、拉格朗日系数多项式以及构造牛顿多项式的分段差分和系数表等等,这里只对拉格朗日多项式插值法进行深入探讨。

一、拉格朗日多项式插值算法基本原理函数)(x f y =在区间[a,b]上有定义,在是[ a,b]上取定的 N + 1个互异节点, 且在这些点处的函数值)(0x f , )(1x f ,…,)(n x f 为已知, 即 yi =f (xi ) , (N i ...1,0=),若存在一个和)(x f 近似的函数)(x P N ,满足)()(i i N x f x P = (N i ...1,0=) (1)则称 φ(x) 为 f (x) 的一个插值函数, 点i x 为插值节点,(1)称为插值条件, 区间[a,b]称为插值区间, 而误差函数)()(x P x f E N N -=称为插值余项。

多项式插值和Lagrange差值的基础原理

多项式插值和Lagrange差值的基础原理

多项式插值和Lagrange差值的基础原理多项式插值是数值分析领域中一种常用的数值逼近方法,它用于通过给定的离散数据点构建一个多项式函数,以便在数据点之间进行插值,从而推断出未知数据点的函数值。

而Lagrange插值则是多项式插值方法中的一种,它基于拉格朗日插值多项式原理,并采用拉格朗日基函数进行计算。

一、多项式插值的基本概念多项式插值的基本目标是通过已知数据点(x_i, y_i)构建一个多项式函数P(x),使得P(x_i) = y_i。

其中,x_i是已知的数据点的自变量取值,y_i是对应的因变量取值。

多项式插值方法的核心是确定合适的多项式表达式和系数,以确保插值函数满足已知数据点的值。

二、Lagrange差值的原理Lagrange差值是一种常用的多项式插值方法,它基于拉格朗日插值多项式原理。

根据拉格朗日插值多项式的定义,给定n+1个不同的数据点(x_i, y_i),其中i=0,1,2,...,n,Lagrange插值多项式可以表示为:P(x) = Σ[L_i(x)*y_i]其中,L_i(x)为拉格朗日基函数,其定义如下:L_i(x) = Π[(x-x_j)/(x_i-x_j)] (j≠i)其中,Π表示连乘符号,x_j为其他已知数据点的自变量取值。

三、Lagrange差值的计算步骤1. 第一步是计算拉格朗日基函数L_i(x)的值。

对于给定的插值点x,计算每个基函数的值,并将其与对应的因变量y_i相乘。

2. 第二步是对所有的基函数计算结果进行求和,得到最终的插值函数P(x)。

四、多项式插值的应用多项式插值广泛应用于科学计算、数据分析、图像处理等领域。

通过插值方法可以预测未知数据点的函数值,对于实际问题中的缺失数据或者噪声数据进行补充和平滑处理。

总结:多项式插值是一种常用的数值逼近方法,利用已知数据点构建一个多项式函数,用于推断未知数据点的函数值。

Lagrange差值是多项式插值方法中的一种,基于拉格朗日插值多项式原理,通过计算拉格朗日基函数和已知数据点的函数值,得到插值函数。

常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值

常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值

常见插值算法--拉格朗⽇插值、三次卷积插值、三次样条插值、兰克索斯插值写在前⾯本⽂简单介绍了⼏种常见的插值算法并附带了相应的python代码,本⽂公式使⽤latex编写,如有错误欢迎评论指出,如果谁知道如何修改latex字号也欢迎留⾔关于⼀维、⼆维和多维插值三次卷积插值、拉格朗⽇两点插值(线性插值)、兰克索斯插值在⼆维插值时改变x和y⽅向的计算顺序不影响最终结果,这三个也是图像缩放插值时常⽤的插值算法,⽽其他插值在改变计算顺序时会产⽣明显差异,多维的情况笔者没有尝试,读者可以⾃⾏尝试或推导最近邻插值法(Nearest Neighbour Interpolation)在待求像素的四邻像素中,将距离待求像素最近的像素值赋给待求像素p_{11}p_{12}pp_{21}p_{22}python代码1def NN_interpolation(srcImg, dstH, dstW):2 scrH, scrW, _ = srcImg.shape3 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)4for i in range(dstH - 1):5for j in range(dstW - 1):6 scrX = round(i * (scrH / dstH))7 scrY = round(j * (scrW / dstW))8 dstImg[i, j] = srcImg[scrX, scrY]9return dstImg拉格朗⽇插值(Lagrange Interpolation)拉格朗⽇插值法需要找到k个p_i(x)函数,使得每个函数分别在在x_i处取值为1,其余点取值为0,则y_ip_i(x)可以保证在x_i处取值为y_i,在其余点取值为0,因此L_k(x)能恰好经过所有点,这样的多项式被称为拉格朗⽇插值多项式,记为L_k(x)=\sum_{i=1}^ky_ip_i(x)p_i(x)=\prod_{j \neq i}^{1 \leq j \leq k}\frac{x-x_j}{x_i-x_j}以四点即三次图像插值为例,因为横坐标间隔为1,则设四个点横坐标为-1、0、1和2,可得p_1(x)、p_2(x)、p_3(x)和p_4(x)假设y_1、y_2、y_3和y_4分别为1、2、-1、4,则可得拉格朗⽇函数如下图所⽰,待插值点横坐标范围为[0,1]在K=2时在k=2时,也被称为线性插值通⽤公式p_1=\frac{x-x_2}{x_1-x_2}p_2=\frac{x-x_1}{x_2-x_1}\begin{align} L_2x &= p_1y_1+p_2y_2 \nonumber \\ &= \frac{x-x_2}{x_1-x_2}y_1 + \frac{x-x_1}{x_2-x_1}y_2 \nonumber \end{align}图像插值像素分布如图所⽰p_{11}p_{12}pp_{21}p_{22}即当x_{i+1}=x_i+1时,设p与p_{11}的横纵坐标差分别为dx和dy\begin{align} L_2x &= \frac{x-x_2}{x_1-x_2}y_1 + \frac{x-x_1}{x_2-x_1}y_2 \nonumber \\ &= (x_2-x)y_1+(x-x_1)y_2 \nonumber \\ &= (1-dx)y_1+dxy_2 \nonumber \\ &= (y_2-y_1)dx+y_1 \nonumber \end{align}L_2'x=y_2-y_1在K=3时通⽤公式p_1=\frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}p_2=\frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}p_3=\frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\begin{align} L_3x &= p_1y_1+p_2y_2+p_3y_3 \nonumber \\ &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}y_1+\frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}y_2+\frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}y_3 \nonumber \end{align}图像插值像素分布如图所⽰p_{11}p_{12}p_{13}p_{21}p_{22}p_{23}pp_{31}p_{32}p_{33}即当x_{i+1}=x_i+1时,设p与p_{11}的横纵坐标差分别为dx和dy\begin{align} L_3x &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}y_1 + \frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}y_2 + \frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}y_3 \nonumber \\ &= \frac{-dx(1-dx)}{(-1)\cdot(-2)}y_1 + \frac{-(1+dx)(1-dx)}{1\cdot(-1)}y_2 + \frac{(1+dx)dx}{2\cdot 1}y_3 \nonumber \\ &= (\frac{1}{2}d^2x-\frac{1}{2}dx)y_1 - (d^2x-1)y_2 + (\frac{1}{2}d^2x+\frac{1}{2}dx)y_3 \nonumber \\ &= d^2x(\frac{1}{2}y_1-y_2+\frac{1}{2}y_3)+dx(-\frac{1}{2}y_1+\frac{1}{2}y_3)+y_2 \nonumber \end{align}L_3'x=dx(y_1-2y_2+y_3)+(\frac{1}{2}y_3-\frac{1}{2}y_1)在K=4时通⽤公式p_1=\frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}\frac{x-x_4}{x_1-x_4}p_2=\frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}\frac{x-x_4}{x_2-x_4}p_3=\frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\frac{x-x_4}{x_3-x_4}p_4=\frac{x-x_1}{x_4-x_1}\frac{x-x_2}{x_4-x_2}\frac{x-x_3}{x_4-x_3}\begin{align} L_4x &= p_1y_1+p_2y_2+p_3y_3+p_4y_4 \nonumber \\ &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}\frac{x-x_4}{x_1-x_4}y_1 + \frac{x-x_1}{x_2-x_1}\frac{x-x_3} {x_2-x_3}\frac{x-x_4}{x_2-x_4}y_2 + \frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\frac{x-x_4}{x_3-x_4}y_3 + \frac{x-x_1}{x_4-x_1}\frac{x-x_2}{x_4-x_2}\frac{x-x_3}{x_4-x_3}y_4\nonumber \end{align}图像插值p_{11}p_{12}p_{13}p_{14}p_{21}p_{22}p_{23}p_{24}pp_{31}p_{32}p_{33}p_{34}p_{41}p_{42}p_{43}p_{44}即当x_{i+1}=x_i+1时,设p与p_{11}的横纵坐标差分别为dx和dy\begin{align} L_4x &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}\frac{x-x_4}{x_1-x_4}y_1 + \frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}\frac{x-x_4}{x_2-x_4}y_2 + \frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\frac{x-x_4}{x_3-x_4}y_3 + \frac{x-x_1}{x_4-x_1}\frac{x-x_2}{x_4-x_2}\frac{x-x_3}{x_4-x_3}y_4 \nonumber \\ &= \frac{dx[-(1-dx)][-(2-dx)]}{(-1)\cdot(-2)\cdot(-3)}y_1 + \frac{(1+dx)[-(1-dx)][-(2-dx)]}{1\cdot(-1)\cdot(-2)}y_2 + \frac{(1+dx)dx[-(2-dx)]}{2\cdot 1\cdot(-1)}y_3 + \frac{(1+dx)dx[-(1-dx)]}{3\cdot 2\cdot 1}y_4 \nonumber \\ &= \frac{d^3x-3d^2x+2dx}{-6}y1 + \frac{d^3x-2d^2x-dx+2}{2}y_2 + \frac{d^3x-d^2x-2dx}{-2}y_3 + \frac{d^3x-dx}{6}y_4 \nonumber \\ &= d^3x(-\frac{1}{6}y_1+\frac{1}{2}y_2-\frac{1} {2}y_3+\frac{1}{6}y_4)+d^2x(\frac{1}{2}y_1-y_2+\frac{1}{2}y_3)+dx(-\frac{1}{3}y_1-\frac{1}{2}y_2+y_3-\frac{1}{6}y_4)+y_2 \nonumber \end{align}\begin{align} L_4'x &= d^2x(-\frac{1}{2}y_1+\frac{3}{2}y_2-\frac{3}{2}y_3+\frac{1}{2}y_4)+dx(y_1-2y_2+y_3)+(-\frac{1}{3}y_1-\frac{1}{2}y_2+y_3-\frac{1}{6}y_4) \nonumber \\ &= -[\frac{1}{2}d^2x(y_1-3y_2+3y_3-y_4)-dx(y_1-2y_2+y_3)+\frac{1}{6}(2y_1+3y_2-6y_3+y_4)] \nonumber \end{align}python代码插值核计算的时候乘法和加减法计算的顺序不同可能会导致结果存在细微的差异,读者可以⾃⾏研究⼀下1class BiLagrangeInterpolation:2 @staticmethod3def LagrangeInterpolation2(x, y1, y2):4 f1 = 1 - x5 f2 = x6 result = y1 * f1 + y2 * f27return result89 @staticmethod10def LagrangeInterpolation3(x, y1, y2, y3):11 f1 = (x ** 2 - x) / 2.012 f2 = 1 - x ** 213 f3 = (x ** 2 + x) / 2.014 result = y1 * f1 + y2 * f2 + y3 * f315return result1617 @staticmethod18def LagrangeInterpolation4(x, y1, y2, y3, y4):19 f1 = - (x ** 3 - 3 * x ** 2 + 2 * x) / 6.020 f2 = (x ** 3 - 2 * x ** 2 - x + 2) / 2.021 f3 = - (x ** 3 - x ** 2 - 2 * x) / 2.022 f4 = (x ** 3 - x) / 6.023 result = y1 * f1 + y2 * f2 + y3 * f3 + y4 * f424return result2526def biLag2_2(self, srcImg, dstH, dstW):27 dstH, dstW = int(dstH), int(dstW)28 srcH, srcW, _ = srcImg.shape29 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')30 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)31for dstY in range(dstH):32for dstX in range(dstW):33for channel in [0, 1, 2]:34# p11 p1235# p36# p21 p2237# 储存为 p(y, x)38 p = [dstY * srcH / dstH, dstX * srcW / dstW]39 p11 = [math.floor(p[0]), math.floor(p[1])]40 p12 = [p11[0], p11[1] + 1]4142 p21 = [p11[0] + 1, p11[1]]43 p22 = [p21[0], p12[1]]4445 diff_y, diff_x = p[0] - p11[0], p[1] - p11[1]46 r1 = grangeInterpolation2(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel])47 r2 = grangeInterpolation2(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel])4849 c = grangeInterpolation2(diff_y, r1, r2)5051 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)52return dstImg5354def biLag3_3(self, srcImg, dstH, dstW):55 dstH, dstW = int(dstH), int(dstW)56 srcH, srcW, _ = srcImg.shape57 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')58 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)59for dstY in range(dstH):60for dstX in range(dstW):61for channel in [0, 1, 2]:62# p11 p12 p1363#64# p21 p22 p2365# p66# p31 p32 p3367# 储存为 p(y, x)68 p = [dstY * srcH / dstH, dstX * srcW / dstW]69 p22 = [math.floor(p[0]), math.floor(p[1])]70 p21 = [p22[0], p22[1] - 1]71 p23 = [p22[0], p22[1] + 1]7273 p11 = [p21[0] - 1, p21[1]]74 p12 = [p11[0], p22[1]]75 p13 = [p11[0], p23[1]]7677 p31 = [p21[0] + 1, p21[1]]78 p32 = [p31[0], p22[1]]79 p33 = [p31[0], p23[1]]8081 diff_y, diff_x = p[0] - p22[0], p[1] - p22[1]82 r1 = grangeInterpolation3(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel], srcImg[p13[0], p13[1], channel])83 r2 = grangeInterpolation3(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel], srcImg[p23[0], p23[1], channel])84 r3 = grangeInterpolation3(diff_x, srcImg[p31[0], p31[1], channel], srcImg[p32[0], p32[1], channel], srcImg[p33[0], p33[1], channel]) 8586 c = grangeInterpolation3(diff_y, r1, r2, r3)8788 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)89return dstImg9091def biLag4_4(self, srcImg, dstH, dstW):92 dstH, dstW = int(dstH), int(dstW)93 srcH, srcW, _ = srcImg.shape94 srcImg = np.pad(srcImg, ((1, 2), (1, 2), (0, 0)), 'edge')95 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)96for dstY in range(dstH):97for dstX in range(dstW):98for channel in [0, 1, 2]:99# p11 p12 p13 p14100#101# p21 p22 p23 p24102# p103# p31 p32 p33 p34104#105# p41 p42 p43 p44106# 储存为 p(y, x)107 p = [dstY * srcH / dstH, dstX * srcW / dstW]108 p22 = [math.floor(p[0]), math.floor(p[1])]109 p21 = [p22[0], p22[1] - 1]110 p23 = [p22[0], p22[1] + 1]111 p24 = [p22[0], p22[1] + 2]112113 p11 = [p21[0] - 1, p21[1]]114 p12 = [p11[0], p22[1]]115 p13 = [p11[0], p23[1]]116 p14 = [p11[0], p24[1]]117118 p31 = [p21[0] + 1, p21[1]]119 p32 = [p31[0], p22[1]]120 p33 = [p31[0], p23[1]]121 p34 = [p31[0], p24[1]]122123 p41 = [p21[0] + 2, p21[1]]124 p42 = [p41[0], p22[1]]125 p43 = [p41[0], p23[1]]126 p44 = [p41[0], p24[1]]127128 diff_y, diff_x = p[0] - p22[0], p[1] - p22[1]129 r1 = grangeInterpolation4(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel], srcImg[p13[0], p13[1], channel], srcImg[p14[0], p14[1], channel]) 130 r2 = grangeInterpolation4(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel], srcImg[p23[0], p23[1], channel], srcImg[p24[0], p24[1], channel]) 131 r3 = grangeInterpolation4(diff_x, srcImg[p31[0], p31[1], channel], srcImg[p32[0], p32[1], channel], srcImg[p33[0], p33[1], channel], srcImg[p34[0], p34[1], channel]) 132 r4 = grangeInterpolation4(diff_x, srcImg[p41[0], p41[1], channel], srcImg[p42[0], p42[1], channel], srcImg[p43[0], p43[1], channel], srcImg[p44[0], p44[1], channel]) 133134 c = grangeInterpolation4(diff_y, r1, r2, r3, r4)135136 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)137return dstImg三次卷积插值法(Cubic Convolution Interpolation)使⽤上图中的卷积核进⾏加权平均计算,卷积核为u(s),四个等距(距离为1)的采样点记为x_0、x_1、x_2和x_3,采样数值记为y_0、y_1、y_2和y_3,且保证四个点均在[-2,2]区间上,计算得到g(x),假设y_1、y_2、y_3和y_4分别为1、2、-1、4,则可得三次卷积插值函数如下图所⽰,待插值点横坐标范围为[0,1]公式推导设u(s)=\begin{cases} A_1|s|^3+B_1|s|^2+C_1|s|+D_1, &0<|s|<1 \\ A_2|s|^3+B_2|s|^2+C_2|s|+D_2, &1<|s|<2 \\ 1, &s=0 \\ 0, &otherwise \end{cases}\because函数在s=0,1,2处连续\therefore\begin{cases} 1=u(0^+)=D_1 \\ 0=u(1^-)=A_1+B_1+C_1+D_1 \\ 0=u(1^+)=A_2+B_2+C_2+D_2 \\ 0=u(2^-)=8A_2+4B_2+2C_2+D_2 \end{cases} (1)\because函数在s=0,1,2处导函数连续\therefore\begin{cases} u'(0^-)=u'(0+) \\ u'(1^-)=u'(1+) \\ u'(2^-)=u'(2+)\end{cases} \Rightarrow \begin{cases} -C_1=C_1 \\ 3A_1+2B_1+C_1=3A_2+2B_2+C_2\\ 12A_2+4B_2+C+2=0 \end{cases} ~~~~ (2)联⽴⽅程组(1)(2),设A_2=a,解得\begin{cases} A_1=a+2 \\ B_1=-(a+3) \\ C_1=0 \\ D_1=1 \\ A_2=a \\ B_2=-5a \\ C_2=8a \\ D_2=-4a \end{cases}\Rightarrow u(s)=\begin{cases} (a+2)|s|^3-(a+3)|s|^2+1, &0<|s|<1 \\ A_2|s|^3+B_2|s|^2+C_2|s|+D_2, &1<|s|<2\\ 1, &s=0 \\ 0, &otherwise \end{cases}\because g(x)=\sum_kC_ku(s+j-k), ~~~~k=j-1,j, j+1,j+2且0<s<1⼜\because \begin{cases}\begin{align} u(s+1)&=as^3-2as^2+as \nonumber \\ u(s)&=(a+2)s^3-(a+3)s^2+1 \nonumber \\ u(s-1)&=-(a+2)s^3+(2a+3)s^2-as \nonumber \\ u(s-2)&=-as^3+as^2 \nonumber \end{align}\end{cases}\begin{align} \therefore g(x) &= C_{j-1}u(s+1)+C_{j}u(s)+C_{j+1}u(s-1)+C_{j+2}u(s-2) \nonumber \\ &= C_{j-1}(as^3-2as^2+as)+C_j[(a+2)s^3-(a+3)s^2+1]+C_{j+1}[-(a+2)s^3+ (2a+3)s^2-as]+C_{j+2}[-a^3+as^2] \nonumber \\ &= s^3[aC_{j-1}+(a+2)C_j-(a+2)C_{j+1}-aC_{j+2}]+s^2[-2aC_{j-1}-(a+3)C_j+(2a+3)C_{j+1}+aC_{j+2}]+s[aC_{j-1}-aC_{j+1}]+C_j \nonumber \end{align} ~~(3)f在x_j处泰勒展开得到f(x)=f(x_j)+f'(x_j)(x-x_j)+\frac{1}{2}f''(x_j)(x-x_j)^2+\cdots\therefore \begin{cases} f(x_{j+1})=f(x_j)+f'(x_j)(x_{j+1}-x_j)+\frac{1}{2}f''(x_j)(x_{j+1}-x_j)^2+\cdots \\ f(x_{j+2})=f(x_j)+f'(x_j)(x_{j+2}-x_j)+\frac{1}{2}f''(x_j)(x_{j+2}-x_j)^2+\cdots \\ f(x_{j-1})=f(x_j)+f'(x_j)(x_{j-1}-x_j)+\frac{1}{2}f''(x_j)(x_{j-1}-x_j)^2+\cdots \end{cases}令x_{j+1}-x_j=h\because x_{i+1}=x_i+1\therefore x_{j+2}-x_j=2h,x_{j-1}-x_j=-h\therefore \begin{cases} f(x_{j+2})=f(x_j)+2f'(x_j)h+2f''(x_j)h^2+\cdots \\ f(x_{j+1})=f(x_j)+f'(x_j)h+\frac{1}{2}f''(x_j)h^2+\cdots \\ f(x_{j-1})=f(x_j)-f'(x_j)h+\frac{1}{2}f''(x_j)h^2+\cdots \end{cases}\therefore \begin{cases} c_{j-1}=f(x_j)-f'(x_j)h+\frac{1}{2}f''(x_j)h^2+o(h^3) \\ c_j=f(x_j) \\ c_{j+1}=f(x_j)+f'(x_j)h+\frac{1}{2}f''(x_j)h^2+o(h^3)\\ c_{j+2}=f(x_j)+2f'(x_j)h+2f''(x_j)h^2+o(h^3) \end{cases} ~~ (4)将(4)代⼊(3),得g(x)=-(2a+1)[2hf'(x_j)+h^2f''(x_j)]s^3+[(6a+3)hf'(x_j)+\frac{4a+3}{2}h^2f''(x_j)]s^2-2ahf'(x_j)s+f(x_j)+o(h^3)\because h=1,s=x-x_J\therefore sh=x-x_j\begin{align}\therefore f(x)&= f(x_j)+f'(x_j)(x-x_j)+\frac{1}{2}f''(x_j)(x-x_j)^2+o(h^3) \nonumber \\ &= f(x_j)+f'(x_j)sh+\frac{1}{2}f''(x_j)s^2h^2+o(h^3) \nonumber \end{align}\therefore f(x)-g(x)=(2a+1)[2hf'(x_j)+h^2f''(x_j)]s^3-(2a+1)[3hf'(x_j)+h^2f''(x_j)]s^2+[(2a+1)hf'(x_j)]s+o(h^3)\because 期望f(x)-g(x)趋于0\therefore 2a+1=0 \Rightarrow a=-\frac{1}{2}\therefore u(s)=\begin{cases} \frac{3}{2}|s|^3-\frac{5}{2}|s|^2+1, &0<|s|<1 \\ -\frac{1}{2}|s|^3+\frac{5}{2}|s|^2-4|s|+2, &1<|s|<2 \\ 1, &s=0 \\ 0, &otherwise \end{cases}\therefore g(s)=s^3[-\frac{1}{2}c_{j-1}+\frac{3}{2}c_j-\frac{3}{2}c_{j+1}+\frac{1}{2}c_{j+2}]+s^2[c_{j-1}-\frac{5}{2}c_j+2c_{j+1}-\frac{1}{2}c_{j+2}]+s[-\frac{1}{2}c_{j-1}+\frac{1} {2}c_{j+1}]+c_j图像插值p_{11}p_{12}p_{13}p_{14}p_{21}p_{22}p_{23}p_{24}pp_{31}p_{32}p_{33}p_{34}p_{41}p_{42}p_{43}p_{44}python代码1class BiCubicConvInterpolation:2 @staticmethod3def CubicConvInterpolation1(p0, p1, p2, p3, s):4# ⽤g(s)公式计算,已经将四个u(s)计算完毕并整理5# as^3 + bs^2 + cs + d6 a = 0.5 * (-p0 + 3.0 * p1 - 3.0 * p2 + p3)7 b = 0.5 * (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3)8 c = 0.5 * (-p0 + p2)9 d = p110return d + s * (c + s * (b + s * a))1112 @staticmethod13def CubicConvInterpolation2(s):14# ⽤u(s)公式计算15 s = abs(s)16if s <= 1:17return 1.5 * s ** 3 - 2.5 * s ** 2 + 118elif s <= 2:19return -0.5 * s ** 3 + 2.5 * s ** 2 - 4 * s + 220else:21return 02223def biCubic1(self, srcImg, dstH, dstW):24# p11 p12 p13 p1425#26# p21 p22 p23 p2427# p28# p31 p32 p33 p3429#30# p41 p42 p43 p4431 dstH, dstW = int(dstH), int(dstW)32 scrH, scrW, _ = srcImg.shape33 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')34 dstImg = np.zeros((dstH, dstW, 1), dtype=np.uint8)35for dstY in range(dstH):36for dstX in range(dstW):37for channel in [0]:38 y = dstY * scrH / dstH39 x = dstX * scrW / dstW40 y1 = math.floor(y)41 x1 = math.floor(x)4243 array = []44for i in [-1, 0, 1, 2]:45 temp = self.CubicConvInterpolation1(srcImg[y1 + i, x1 - 1, channel],46 srcImg[y1 + i, x1, channel],47 srcImg[y1 + i, x1 + 1, channel],48 srcImg[y1 + i, x1 + 2, channel],49 x - x1)50 array.append(temp)5152 temp = self.CubicConvInterpolation1(array[0], array[1], array[2], array[3], y - y1)53 dstImg[dstY, dstX, channel] = np.clip(temp, 0, 255)5455return dstImg5657def biCubic2(self, srcImg, dstH, dstW):58# p11 p12 p13 p1459#60# p21 p22 p23 p2461# p62# p31 p32 p33 p3463#64# p41 p42 p43 p4465 dstH, dstW = int(dstH), int(dstW)66 scrH, scrW, _ = srcImg.shape67 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')68 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)69for dstY in range(dstH):70for dstX in range(dstW):71for channel in [0, 1, 2]:72 y = dstY * scrH / dstH73 x = dstX * scrW / dstW74 y1 = math.floor(y)75 x1 = math.floor(x)7677 array = []78for i in [-1, 0, 1, 2]:79 temp = 080for j in [-1, 0, 1, 2]:81 temp += srcImg[y1 + i, x1 + j, channel] * self.CubicConvInterpolation2(x - (x1 + j))82 array.append(temp)8384 temp = 085for i in [-1, 0, 1, 2]:86 temp += array[i + 1] * self.CubicConvInterpolation2(y - (y1 + i))87 dstImg[dstY, dstX, channel] = np.clip(temp, 0, 255)8889return dstImg三次样条插值在n-1个区间上寻找n-1个三次曲线,使其满⾜相邻曲线在端点处值相等、⼀阶导数相等,⼆阶导数相等,在加以边界条件后可得每个曲线的⽅程,然后沿x轴依次偏移对应的距离即可得到插值结果,如仅需要特定范围内的结果,则可以⼤幅减少计算量公式推导设S_i(x)=a_i+b_i(x-x_i)+c_i(x-x_i)^2+d_i(x-x_i)^3, ~~~~i=0,1,...,n-1则 \begin{cases} S_i'(x)=b_i+2c_i(x-x_i)+3d_i(x-x_i)^2\\ S_i''(x)=2c_i+6d_i(x-x_i)\\ S_i'''(x)=6d_i\\ \end{cases} ~~~~i=0,1,...,n-1设h_i(x)=x_{i+1}-x_i,可得\begin{cases} S_i(x)=a_i+b_ih_i+c_ih_i^2+d_ih_i^3\\ S_i'(x)=b_i+2c_ih_i+3d_ih_i^2\\ S_i''(x)=2c_i+6d_ih_i\\ S_i'''(x)=6d_i\\ \end{cases} ~~~~i=0,1,...,n-1\because S_i(x)过点(x_i,y_i)\therefore S_i(x)=a_i=y+i, ~~~~i=0,1,...,n-1 ~~~~~~(1)\because S_i(x)与S_{i+1}(x)在X_{i+1}处相等\therefore S_i(x_{i+1})=S_{i+1}(x_{i+1})\Rightarrow a_i+b_ih_i+c_ih_i^2+d_ih_i^3=y_{i+1}, ~~~~i=0,1,...,n-2~~~~~~(2)\because S_i'(x)与S_{i+1}'(x)在X_{i+1}处相等\therefore S_i'(x)-S_{i+1}'(x)=0\Rightarrow b_i+2c_ih_i+3d_ih_i^2-b_{i+1}=0~~~~~~(3)\because S_i''(x)与S_{i+1}''(x)在X_{i+1}处相等\therefore S_i''(x)-S_{i+1}''(x)=0\Rightarrow 2c_i+6d_ih_i-2c_{i+1}=0, ~~~~i=0,1,...,n-2~~~~~~(4)设m_i=S_i(x_i)=2c_i,即c_i=\frac{1}{2}m_i, ~~~~i=0,1,...,n-1~~~~~~(5)将(5)代⼊(4),得2c_i+6d_ih_i-2c_{i+1}=0\Rightarrow m_i+6h_id_i-m_{i+1}=0\Rightarrow d_i=\frac{m_{i+1}-m_i}{6h_i}, ~~~~i=0,1,...,n-2~~~~~~(6)将(1)(5)(6)代⼊(2),得\begin{align} &a_i+b_ih_i+c_ih_i^2+d_ih_i^3=y_{i+1} \nonumber \\ \Rightarrow&y_i+b_ih_i+\frac{1}{2}m_ih_i^2+\frac{m_{i+1}-m_i}{6h_i}h_i^3=y_{i+1} \nonumber \\\Rightarrow&b_i=\frac{y_{i+1}-y_i}{h_i}-\frac{1}{2}m_ih_i-\frac{1}{6}(m_{i+1}-m_i)h_i \nonumber \\ \Rightarrow&b_i=\frac{y_{i+1}-y_i}{h_i}-\frac{1}{3}m_ih_i-\frac{1}{6}m_{i+1}h_i, ~~~~i=0,1,...,n-2~~~~~~(7) \nonumber \end{align}将(5)(6)(7)代⼊(3),得\begin{align} &\frac{y_{i+1}-y{i}}{h_i}-\frac{1}{3}m_ih_i-\frac{1}{6}m_{i+1}h_i+2\cdot\frac{1}{2}m_ih_i+3\frac{m_{i+1}-m_i}{6h_i}h_i^2-(\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{1}{3}m_{i+1}h_{i+1}-\frac{1}{6}m_{i+2}h_{i+1})=0 \nonumber \\ \Rightarrow&\frac{y_{i+1}-y{i}}{h_i}-\frac{1}{3}m_ih_i-\frac{1}{6}m_{i+1}h_i+m_ih_i+\frac{1}{2}(m_{i+1}-m_i)h_i-\frac{y_{i+2}-y_{i+1}}{h_{i+1}}+\frac{1}{3}m_{i+1}h_{i+1}+\frac{1}{6}m_{i+2}h_{i+1}=0 \nonumber \\ \Rightarrow&m_ih_i(-\frac{1}{3}+1-\frac{1}{2})+m_{i+1}h_i(-\frac{1}{6}+\frac{1} {2})+\frac{1}{3}m_{i+1}h_{i+1}+\frac{1}{6}m_{i+2}h_{i+1}=\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{y_{i+1}-y_{i}}{h_{i}} \nonumber \\ \Rightarrow&\frac{1}{6}(m_ih_i+2m_{i+1}h_i+2m_{i+1}h_{i+1}+m_{i+2}h_{i+1})=\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{y_{i+1}-y_{i}}{h_{i}} \nonumber \\ \Rightarrow&m_ih_i+2m_{i+1}(h_i+h_{i+1})+m_{i+2}h_{i+1}=6(\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{y_{i+1}-y_{i}}{h_{i}}), ~~~~i=0,1,...,n-2~~~~~~(8) \nonumber \end{align}由(8)可知i=0,1,...,n-2,则有m_0,m_1,...,m_n,需要两个额外条件⽅程组才有解⾃然边界(Natural)m_0=0,m_n=0\begin{bmatrix} \tiny 1 & 0 & 0 & 0 & 0 & \cdots & 0\\ h_0 & 2(h_0+h_1) & h_1 & 0 & 0 & \cdots & 0\\ 0 & h_1 & 2(h_1+h_2) & h_2 & 0 & \cdots & 0\\ 0 & 0 & h_2 & 2(h_2+h_3) & h_3 & \cdots & 0\\ \vdots& & & \ddots & \ddots & \ddots & \vdots\\ 0 & \cdots & & & h_{n-2} & 2(h_{n-2}+h_{n-1}) & h_{n-1}\\ 0 & \cdots & & & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3\\\vdots\\m_{n-1}\\m_n \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ \frac{y_4-y_3}{h_3}-\frac{y_3-y_2}{h_2}\\ \vdots\\ \frac{y_n-y_{n-1}}{h_{n-1}}-\frac{y_{n-1}-y_{n-2}}{h_{n-2}}\\ 0 \end{bmatrix}固定边界(Clamped)\begin{align} &\begin{cases} S_0'(x_0)=A\\ S_{n-1}'(x_n)=B \end{cases} \nonumber \\ \Rightarrow&\begin{cases} b_0=A\\ b_{n-1}+2c_{n-1}h_{n-1}+3d_{n-1}h_{n-1}^2=B\end{cases} \nonumber \\ \Rightarrow&\begin{cases} A=\frac{y_1-y_0}{h_0}-\frac{h_0}{2}m_0-\frac{h_0}{6}(m_1-m_0)\\ B=\frac{y_n-y_{n-1}}{h_{n-1}}-\frac{1}{3}m_{n-1}h_{n-1}+m_{n-1}h_{n-1}+\frac{1}{2}m_nh_{n-1}-\frac{1}{2}m_{n-1}h_{n-1} \end{cases} \nonumber \\ \Rightarrow&\begin{cases} 2h_0m_0+h_0m_1=6(\frac{y_1-y_0}{h_0}-A)\\ h_{n-1}m_{n-1}+2h_{n-1}m_{n}=6(B-\frac{y_n-y_{n-1}}{h_{n-1}}) \end{cases} \nonumber \\ \end{align}\begin{bmatrix} 2 & 1 & 0 & 0 & 0 & \cdots & 0\\ h_0 & 2(h_0+h_1) & h_1 & 0 & 0 & \cdots & 0\\ 0 & h_1 & 2(h_1+h_2) & h_2 & 0 & \cdots & 0\\ 0 & 0 & h_2 & 2(h_2+h_3) & h_3 & \cdots & 0\\ \vdots& & & \ddots & \ddots & \ddots & \vdots\\ 0 & \cdots & & & h_{n-2} & 2(h_{n-2}+h_{n-1}) & h_{n-1}\\ 0 & \cdots & & & 0 & 1 & 2 \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3\\\vdots\\m_{n-1}\\m_n \end{bmatrix}=6\begin{bmatrix} \frac{y_1-y_0}{h_0}-A\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ \frac{y_4-y_3}{h_3}-\frac{y_3-y_2}{h_2}\\ \vdots\\\frac{y_n-y_{n-1}}{h_{n-1}}-\frac{y_{n-1}-y_{n-2}}{h_{n-2}}\\ B-\frac{y_n-y_{n-1}}{h_{n-1}} \end{bmatrix}⾮节点边界(Not-A-Knot)\begin{align} &\begin{cases} S_0'''(x_1)=S_1'''(x_1)\\ S_{n-2}'''(x_{n-1})=S_{n-1}'''(x_{n-1}) \end{cases} \nonumber \\ \Rightarrow&\begin{cases} 6\cdot\frac{m_1-m_0}{6h_0}=6\cdot\frac{m_2-m_1}{6h_1}\\ 6\cdot\frac{m_{n-1}-m_{n-2}}{6h_{n-2}}=6\cdot\frac{m_n-m_{n-1}}{6h_{n-1}} \end{cases} \nonumber \\ \Rightarrow&\begin{cases} h_1(m_1-m_0)=h_0(m_2-m_1)\\ h_{n-1}(m_{n-1}-m_{n-2})=h_{n-2}(m_n-m_{n-1}) \end{cases} \nonumber \\ \Rightarrow&\begin{cases} -h_1m_0+(h_1+h_0)m_1-h_0m_2=0\\ -h_{n-1}m_{n-2}+(h_{n-1}+h_{n-2})m_{n-1}-h_{n-2}m_n=0 \end{cases} \nonumber \\ \end{align}\begin{bmatrix} -h_1 & h_0+h_1 & -h_0 & 0 & 0 & \cdots & 0\\ h_0 & 2(h_0+h_1) & h_1 & 0 & 0 & \cdots & 0\\ 0 & h_1 & 2(h_1+h_2) & h_2 & 0 & \cdots & 0\\ 0 & 0 & h_2 &2(h_2+h_3) & h_3 & \cdots & 0\\ \vdots& & & \ddots & \ddots & \ddots & \vdots\\ 0 & \cdots & & & h_{n-2} & 2(h_{n-2}+h_{n-1}) & h_{n-1}\\ 0 & \cdots & & & -h_{n-1} & h_{n-1}+h_{n-2} & -h_{n-2} \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3\\\vdots\\m_{n-1}\\m_n \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ \frac{y_4-y_3}{h_3}-\frac{y_3-y_2}{h_2}\\ \vdots\\ \frac{y_n-y_{n-1}}{h_{n-1}}-\frac{y_{n-1}-y_{n-2}}{h_{n-2}}\\ 0 \end{bmatrix}在n=4时通⽤公式⾃然边界\begin{bmatrix} 1 & 0 & 0 & 0 \\ h_0 & 2(h_0+h_1) & h_1 & 0 \\ 0 & h_1 & 2(h_1+h_2) & h_2 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ 0 \end{bmatrix}固定边界\begin{bmatrix} 2 & 1 & 0 & 0 \\ h_0 & 2(h_0+h_1) & h_1 & 0 \\ 0 & h_1 & 2(h_1+h_2) & h_2 \\ 0 & 0 & 1 & 2 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} \frac{y_1-y_0}{h_0}-A\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ B-\frac{y_3-y_2}{h_2} \end{bmatrix}⾮节点边界\begin{bmatrix} -h_1 & h_0+h_1 & -h_0 & 0 \\ h_0 & 2(h_0+h_1) & h_1 & 0 \\ 0 & h_1 & 2(h_1+h_2) & h_2 \\ 0 & -h_2 & h_1+h_2 & -h_1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ 0 \end{bmatrix}图像插值x_{i+1}-x_i=1 \Rightarrow h_i(x)=1在n=4时,即四个点时如下所⽰p_{11}p_{12}p_{13}p_{14}p_{21}p_{22}p_{23}p_{24}pp_{31}p_{32}p_{33}p_{34}p_{41}p_{42}p_{43}p_{44}⾃然边界(可⽤TDMA或化简计算)\begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 4 & 1 & 0 \\ 0 & 1 & 4 & 1 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ y_0+y_2-2y_1\\ y_1+y_3-2y_2\\ 0 \end{bmatrix}固定边界(只能⽤TDMA计算)\begin{bmatrix} 2 & 1 & 0 & 0 \\ 1 & 4 & 1 & 0 \\ 0 & 1 & 4 & 1 \\ 0 & 0 & 1 & 2 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} y_1-y_0-A\\ y_0+y_2-2y_1\\ y_1+y_3-2y_2\\ y_2-y_3+B \end{bmatrix}⾮节点边界(只能化简计算)\begin{bmatrix} -1 & 2 & -1 & 0 \\ 1 & 4 & 1 & 0 \\ 0 & 1 & 4 & 1 \\ 0 & -1 & 2 & -1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ y_0+y_2-2y_1\\ y_1+y_3-2y_2\\ 0 \end{bmatrix}python代码1class BiSplineInterpolation:2 @staticmethod3 def TDMA(a, b, c, d):4 n = len(d)56 c[0] = c[0] / b[0]7 d[0] = d[0] / b[0]89for i in range(1, n):10 coef = 1.0 / (b[i] - a[i] * c[i - 1])11 c[i] = coef * c[i]12 d[i] = coef * (d[i] - a[i] * d[i - 1])1314for i in range(n - 2, -1, -1):15 d[i] = d[i] - c[i] * d[i + 1]1617return d1819 @staticmethod20 def Simplified_Natural4(y1, y2, y3, y4):21 # 四点⾃然边界化简公式22 d1 = y1 + y3 - 2 * y223 d2 = y2 + y4 - 2 * y32425 k0 = 026 k1 = (4 * d1 - d2) * 0.427 k2 = (4 * d2 - d1) * 0.428 k3 = 02930return [k0, k1, k2, k3]3132 @staticmethod33 def Simplified_Not_A_Knot4(y1, y2, y3, y4):34 # 四点⾮节点边界化简公式35 d1 = y1 + y3 - 2 * y236 d2 = y2 + y4 - 2 * y33738 k0 = 2 * d1 - d239 k1 = d140 k2 = d241 k3 = 2 * d2 - d14243return [k0, k1, k2, k3]4445 # TDMA矩阵说明46 # a0 和 c3 没有实际意义,占位⽤47 # a0 [b0 c0 00 ] [x0] [d0]48 # [a1 b1 c1 0 ] [x1] = [d1]49 # [0 a2 b2 c2] [x2] [d2]50 # [00 a3 b3] c3 [x3] [d3]5152 def SplineInterpolationNatural4(self, x, y1, y2, y3, y4):53 # ⽤TDMA计算54 # matrix_a = [0, 1, 1, 0]55 # matrix_b = [1, 4, 4, 1]56 # matrix_c = [0, 1, 1, 0]57 # matrix_d = [0, 6 * (y1 + y3 - 2 * y2), 6 * (y2 + y4 - 2 * y3), 0]58 # matrix_x = self.TDMA(matrix_a, matrix_b, matrix_c, matrix_d)5960 # 化简计算61 matrix_x = self.Simplified_Natural4(y1, y2, y3, y4)6263 a = y264 b = y3 - y2 - matrix_x[1] / 3.0 - matrix_x[2] / 6.065 c = matrix_x[1] / 2.066 d = (matrix_x[2] - matrix_x[1]) / 6.06768 s = a + b * x + c * x * x + d * x * x * x69return s7071 def SplineInterpolationClamped4(self, x, y1, y2, y3, y4):72 # 仅有TDMA计算,⽆法化简73 A, B = 1, 17475 matrix_a = [0, 1, 1, 1]76 matrix_b = [2, 4, 4, 2]77 matrix_c = [1, 1, 1, 0]78 matrix_d = [6 * (y2 - y1 - A), 6 * (y1 + y3 - 2 * y2), 6 * (y2 + y4 - 2 * y3), 6 * (B - y4 + y3)]79 matrix_x = self.TDMA(matrix_a, matrix_b, matrix_c, matrix_d)8081 a = y282 b = y3 - y2 - matrix_x[1] / 3.0 - matrix_x[2] / 6.083 c = matrix_x[1] / 2.084 d = (matrix_x[2] - matrix_x[1]) / 6.08586 s = a + b * x + c * x * x + d * x * x * x87return s8889 def SplineInterpolationNotAKnot4(self, x, y1, y2, y3, y4):90 # ⽆法使⽤TDMA计算91 matrix_x = self.Simplified_Not_A_Knot4(y1, y2, y3, y4)9293 a = y294 b = y3 - y2 - matrix_x[1] / 3.0 - matrix_x[2] / 6.095 c = matrix_x[1] / 2.096 d = (matrix_x[2] - matrix_x[1]) / 6.09798 s = a + b * x + c * x * x + d * x * x * x99return s100101 def biSpline4(self, srcImg, dstH, dstW):102 dstH, dstW = int(dstH), int(dstW)103 srcH, srcW, _ = srcImg.shape104 srcImg = np.pad(srcImg, ((1, 2), (1, 2), (0, 0)), 'edge')105 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)106for dstY in range(dstH):107for dstX in range(dstW):108for channel in [0, 1, 2]:109 # p11 p12 p13 p14110 #111 # p21 p22 p23 p24112 # p113 # p31 p32 p33 p34114 #115 # p41 p42 p43 p44116 # 储存为 p(y, x)117 p = [dstY * srcH / dstH, dstX * srcW / dstW]118 p22 = [math.floor(p[0]), math.floor(p[1])]119 p21 = [p22[0], p22[1] - 1]120 p23 = [p22[0], p22[1] + 1]121 p24 = [p22[0], p22[1] + 2]122123 p11 = [p21[0] - 1, p21[1]]124 p12 = [p11[0], p22[1]]125 p13 = [p11[0], p23[1]]126 p14 = [p11[0], p24[1]]127128 p31 = [p21[0] + 1, p21[1]]129 p32 = [p31[0], p22[1]]130 p33 = [p31[0], p23[1]]131 p34 = [p31[0], p24[1]]132133 p41 = [p21[0] + 2, p21[1]]134 p42 = [p41[0], p22[1]]135 p43 = [p41[0], p23[1]]136 p44 = [p41[0], p24[1]]137138 diff_y, diff_x = p[0] - p22[0], p[1] - p22[1]139 r1 = self.SplineInterpolationNatural4(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel], srcImg[p13[0], p13[1], channel], srcImg[p14[0], p14[1], channel]) 140 r2 = self.SplineInterpolationNatural4(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel], srcImg[p23[0], p23[1], channel], srcImg[p24[0], p24[1], channel]) 141 r3 = self.SplineInterpolationNatural4(diff_x, srcImg[p31[0], p31[1], channel], srcImg[p32[0], p32[1], channel], srcImg[p33[0], p33[1], channel], srcImg[p34[0], p34[1], channel]) 142 r4 = self.SplineInterpolationNatural4(diff_x, srcImg[p41[0], p41[1], channel], srcImg[p42[0], p42[1], channel], srcImg[p43[0], p43[1], channel], srcImg[p44[0], p44[1], channel]) 143144 c = self.SplineInterpolationNatural4(diff_y, r1, r2, r3, r4)145146 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)。

数值分析实验四(Lagrange插值)

数值分析实验四(Lagrange插值)

《数值分析》实验报告实验编号:实验四课题名称:Lagrange插值一、算法介绍对Lagrange型的n次插值多项式,先构造n+1个插值节点x[0],x[1],…,x[n]上的n次插值基函数对任一点xi所对应的插值基函数l[i](x)=[(x-x[0])…(x-x[i-1])(x-x[i+1])…(x-x[n])]/[(x[i]-x[0])…(x[i]-x[i-1])(x[i]-x[i+1 ])…(x[i]-x[n])],其中i=0,1,2,…,n。

有了这n+1个n次插值基函数,n次Lagrange 型插值多项式就容易写出来了,表达式为:f(x)=y[1]*l[1](x)+y[2]*l[2](x)+…+y[n]*l[n](x)。

此程序中n=10。

二、程序代码// testView.cpp : implementation of the CTestView class//#include "stdafx.h"#include "test.h"#include "testDoc.h"#include "testView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)//{{AFX_MSG_MAP(CTestView)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTestView construction/destructionCTestView::CTestView(){// TODO: add construction code here}CTestView::~CTestView(){}BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CTestView drawingvoid CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereint i,j,k;double x,y,p_x,p_y,l,xx[100],f[100],F[100],sum,p_sum;CPen MyPen,*OldPen;pDC->SetViewportOrg(400,400); //定义坐标原点for(i=-500;i<500;i++){pDC->SetPixel(0,i,RGB(0,0,0));pDC->SetPixel(i,0,RGB(0,0,0)); //画出坐标}pDC->TextOut(-210,5,"-1");pDC->TextOut(196,5,"1");//原函数MyPen.CreatePen(PS_SOLID,1,RGB(255,0,0));//定义画笔颜色OldPen=pDC->SelectObject(&MyPen);x=-1.0,y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->MoveTo(p_x,p_y);for (x=-1.0;x<=1.0;x+=0.0001){y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->LineTo(p_x,p_y);}pDC->SelectObject(OldPen);MyPen.DeleteObject();//Lagrange插值x=-1.0;MyPen.CreatePen(PS_SOLID,1,RGB(0,255,0));OldPen=pDC->SelectObject(&MyPen);for(i=0;i<=10;i++){f[i]=1/(1+25*x*x);xx[i]=x;x+=0.2;}x=-1.0;y=1/(1+25*x*x);p_x=x*200,p_y=-y*200; //将x和y坐标各放大200倍pDC->MoveTo(p_x,p_y);for(k=0;k<=1000;k++){sum=0;for(i=0;i<=10;i++){l=1;for(j=0;j<=10;j++){if(i!=j)l=l*(x-xx[j])/(xx[i]-xx[j]);}sum+=f[i]*l;}p_x=x*200;p_y=-sum*200;pDC->LineTo(p_x,p_y);x+=0.002;}pDC->SelectObject(OldPen);MyPen.DeleteObject();}/////////////////////////////////////////////////////////////////////////////// CTestView printingBOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CTestView diagnostics#ifdef _DEBUGvoid CTestView::AssertValid() const{CView::AssertValid();}void CTestView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CTestDoc* CTestView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));return (CTestDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CTestView message handlers三、运算结果截屏红色的曲线为原函数图像,绿色曲线为Lagerange插值多项式函数对应的图像四、算法分析上述图像中绿色的曲线为Lagrange插值多项式所对应的图像,通过观察可见函数图像在靠近区间端点的地方出现了Runge现象。

lagrange插值法

lagrange插值法

lagrange 插值法实验基本原理: lagrange 插值法是用来解决离散点的插值问题。

若给定两个插值点),(),,(1100y x y x 其10x x ≠,在公式中取1=n ,则La g r a n g e 插值多项式为:)()()()()()(001010010110101x x x x y y y x x x x y x x x x y x p ---+=--+--=是经过),(),,(1100y x y x 的一条直线,故此法称为线性插值法。

2、若函数给定三个插值点 2,1,0),,(=i y x i i ,,其中i x 互不相等,在公式中取1=n ,则Lagrange 插值多项式为: ))(())(())(())(())(())(()(1202102210120120102102x x x x x x x x y x x x x x x x x y x x x x x x x x y x p ----+----+----=是一个二次函数,若2,1,0),,(=i y x i i 三点不在一条直线上,则该曲线是一条抛物线,这种插值法称为二次插值或抛物插值。

为了解决这个问题,我们为此构造了这个矩阵⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----+---.........))(())(()())((12010212010212010x x x x x x x x x x x x x x x x 就可以找到相应系数。

实验结果分析:在应用拉格朗日插值法时应注意以下几个问题:1、在能获得原始资料时应尽量获取原始资料, 不能盲目地用组数据代入公式来估计未知数据。

2、在利用拉格朗日多项式进行插值估计时, 要求所研究范围的值的变化不受特殊或偶照因素的影响, 即的值是在正常条件下的。

3、如果有两组值(i x ,iy ),(j x ,j y ) 的i x =j x ;则这两组值只能取一组代入多项式计算, 否则便会出现 i y 与j y 的项分母为零的情况这种情况对于这种情况, 用哪组值代入多项式估计更好, 往往不易确定。

计算方法-第2章-1、插值法(拉格朗日插值)

计算方法-第2章-1、插值法(拉格朗日插值)

2019/1/15
26
证明:假设在区间[a,b]上f(x)的插值多项式为 Ln ( x) 令
Rn ( x) f ( x) Ln ( x)
显然在插值节点为 xi (i 0,1,, n)上 Rn ( xi ) f ( xi ) Ln ( xi ) 0 , i 0,1,, n 因此Rn ( x)在[a, b]上至少有n 1个零点
(k 0,1,2,, n)

n1 ( x) Ln ( x) yk ' ( x x ) k 0 k n 1 ( xk )
n
2019/1/15
18
总 结
于是, y f ( x)在节点xi (i 0 ,1, , n)上, 以l j ( x) (i 0 ,1, , n) 为插值基函数的插值多 项式(记为Ln ( x))为
本章只讨论多项式插值与分段插值
2019/1/15 7
§ 2.2
拉格朗日插值
• 此插值问题可表述为如下: • 问题 求作次数 n 多项式 Ln ( x) ,使满足条件
Ln x yi , (i 0,1,, n)
• 这就是所谓的拉格朗日(Lagrange)插值。
2019/1/15
8
§ 2.2.1
线性插值的局限性
2019/1/15
12
三、抛物插值
问题 求作二次式 L2 ( x) ,使满足条件
L2 ( x j ) y j
( j k 1, k , k 1)
二次插值的几何解释是用通过三个点
的抛物线来近似考察曲线,故称为拋物插值。类似于线性 插值,构造基函数,要求满足下式:
L2(x) yk 1lk 1 ( x) yklk ( x) yk 1lk 1 ( x)

数学基础课里的lagrange插值公式

数学基础课里的lagrange插值公式

数学基础课里的lagrange插值公式lagrange插值公式:
1. Lagrange插值法是一种经典的插值方法,在数学和工程领域里都是一种常用的数值算法,也可以用来求解一元函数的极值点。

它实际上是对有n个数据点(比如:xi,yi)的函数f ( x) 进行拟合,形成n-1阶有理曲线,使得拟合曲线经过这些数据点。

2. Lagrange插值公式的可求性:在n个点的插值中,已知n个数据点(xi,yi),求使拟合曲线恰
好经过n个点的系数 ak 的问题。

3. Lagrange 插值公式:向量f (x) 和向量自变量x 可定义如下:f (x) = (f1 (x),f2 (x),…,fn-1 (x),fn (x));xi = (x1,x2,…,xn),那么有f (x) = Σ
j=1 n Lj(x).fj (*j = 1, 2,…, n*)
(其中Lj (x) 为Lagrangebasis 的基函数,可定义为:Lj (x) =Π(x/xj, i !=j))
4. Lagrange 插值公式的优点:
(1) Lagrange插值法简单易懂,实现简单;
(2) Lagrange插值法的拟合精度高;
(3) Lagrange插值法的拟合速度也是很快的,适用
性强。

5. Lagrange 插值公式的缺点:
(1) Lagrange插值法拟合数据点多时,计算量大;
(2) Lagrange插值法只适用于有n个数据点的插值,不能求解多元插值。

计算方法_习题第一、二章答案

计算方法_习题第一、二章答案

第一章 误差1 问3.142,3.141,722分别作为π的近似值各具有几位有效数字?分析 利用有效数字的概念可直接得出。

解 π=3.141 592 65…记x 1=3.142,x 2=3.141,x 3=722.由π- x 1=3.141 59…-3.142=-0.000 40…知3411110||1022x π--⨯<-≤⨯ 因而x 1具有4位有效数字。

由π- x 2=3.141 59…-3.141=-0.000 59…知2231021||1021--⨯≤-<⨯x π因而x 2具有3位有效数字。

由π-722=3.141 59 …-3.142 85…=-0.001 26…知231021|722|1021--⨯≤-<⨯π因而x 3具有3位有效数字。

2 已知近似数x*有两位有效数字,试求其相对误差限。

分析 本题显然应利用有效数字与相对误差的关系。

解 利用有效数字与相对误差的关系。

这里n=2,a 1是1到9之间的数字。

%5101211021|*||*||)(|1211*=⨯⨯≤⨯≤-=+-+-n ra x x x x ε3 已知近似数的相对误差限为0.3%,问x*至少有几位有效数字?分析 本题利用有效数字与相对误差的关系。

解 a 1是1到9间的数字。

1112*10)1(2110)19(21102110003%3.0)(--⨯+≤⨯+⨯=⨯<=a x r ε 设x*具有n 位有效数字,令-n+1=-1,则n=2,从而x*至少具有2位有效数字。

4 计算sin1.2,问要取几位有效数字才能保证相对误差限不大于0.01%。

分析 本题应利用有效数字与相对误差的关系。

解 设取n 位有效数字,由sin1.2=0.93…,故a 1=9。

411*10%01.01021|*||*||)(-+-=≤⨯≤-=n r a x x x x ε解不等式411101021-+-≤⨯n a 知取n=4即可满足要求。

计算方法-插值法(二)

计算方法-插值法(二)

x0 f (x0)
x1 f (x1) x2 f (x2)
P0,1(x) P1,2(x)
P0,1,2 ( x)
(x x0) (x x0)
x3 f (x3) P2,3(x) P1,2,3(x) P0,1,2,3(x)
(x x0)
x4 f (x4)
P3,4(x) P2,3,4(x)
P1,2,3,4 ( x)
S1( x), x [ x0 ,x2 ]
Sn ( x), x [ xn1,xn ]
(1) S(x)在每个小区间[xk , xk1]上都是三次多项式 (2) S(x)满足 S(x j ) y j , j 0,1,, n (3) S(x)都在区间[a,b]上连续,导数值未知
高次插值的病态性质(德国Runge 20世纪初)
设函数
f
(x)
1 1 x2
,
x [5,5],将[5,5]n等分取n
1个节点xi
5
ih,
h 10 ,i 0,1,,n,试就n 2,4,6,8,10作f (x)的n次Lagrange插值多项式。
n
解:
yi
f
(xi )
1 1 xi2
作n次Lagrange插值多项式
注:同样是三次多项式,三次样条插值与分段 Hermite 插值的根本区 别在于S(x)自身光滑,不需要知道 f 的导数值(除了在2个端点可能需 要);而Hermite插值依赖于f 在所有插值点的导数值。
15
三次样条插值数学定义:
a ≤ x0, x1, …, xn ≤ b为区间[a, b]的一个分割,如果
Ln (x)
n j0
y jl j
n
1
j0
1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(
x1
)
M M M
ln
(
xn
)
cn
f
(xn
)
由Lagrange插值基函数满足(2)式可知,方程组变成
1 0 L
0
1
L
M M L
0
0
L
0 c0 f (x0 )
0
c1
f
(
x1
)
M M M
1
cn
f (xn )
因此得到插值多项式 pn(x)= f(x0)l0(x)+f(x1) l1(x)+…+ f(xn) ln(x)
Pn (xi ) yi , i 0,1,L , n
n = 1 已知 x0 , x1 ; y0 , y1 ,求
使得
P1(x) a0 + a1x 使得P1(x0 ) y0 , P1(x1) y1
可见 P1(x) 是过 ( x0 , y0 ) 和 ( x1, y1 ) 两点的直线。
y y
P (x) y + 1 0 (x x )
0.00660
sin 50 = 0.7660444…
利用x0, x1 作为插值节点的实际误差 0.01001
利用x1, x2作为插值节点的实际误差 0.00596
n
=
2
L2 (x)
(x
(
6
4
4
)( x
)(
6
3
)
3
)
1 2
+
(x
(
4
6
6
)( x
)(
4
3
)
3
)
1 2
由于xi互异,所以(4)右端不为零,从而方程组 (3)的解 a0 ,a1 ,…an 存在且唯一。
通过解上述方程组(3)求得插值多项式pn(x)的方法并 不可取.这是因为当n较大时解方程组的计算量较大, 而且方程组系数矩阵的条件数一般较大(可能是病 态方程组),当阶数n越高时,病态越重。
为此我们必须从其它途 径来求Pn(x):
这就是本章要讨论的“插值问题”
插值问题的定义
当精确函数 y = f(x) 非常复杂或未知时,在区
间[a,b]上一系列节点 x0 … xm 处测得函数值 y0 = f(x0), …, ym = f(xm),由此构造一个简单易算的 近似函数 g(x) f(x),满足条件
g(xj) = f(xj) (j = 0, … m)
不通过求解方程组而获 得插值多项式
基本思想:在n次多项式空间Pn中找一组合适的基函数 0(x),1(x),…, n(x),使
pn(x)=a0 0(x) +a1 1(x) +…+an n(x) 不同的基函数的选取导致不同的插值方法
Lagrange插值
Newton插值
3.3 Lagrange插值
求 n 次多项式 Pn ( x) a0 + a1 x + + an xn 使得
pn(xj)=f(xj),j=0,1,…,n. …... (1)
令 pn(x)=a0+a1x+…+anxn,
…... (2)
只要证明Pn(x)的系数a0 ,a1,…, an存在唯一即可
为此由插值条件(1)知Pn(x)的系数满足下列n+1 个代数方程构成的线性方程组
a0+a1x0+…+anx0n=f(x0) a0+a1x1+…+anx1n= f(x1) ……………………. a0+a1xn+…+anxnn= f(xn)
……(3)
而ai(i=0,1,2,…,n)的系数行列式是Vandermonde行列式
x x x 1
2 ... n
0
0
0
1
2 ... n
x x x V( , ,..., )
1
1
1
x x x 0 1 n ... ... ... ... ...
x x x 1
2 ... i1
(
xi
x
)
j
i1 j0
Rn (x)
f (x) Ln (x)
f (n+1) ( )
(n +1) !
n
(x xi )
i0
Rolle’s Theorem的推论: 若 ( x)充分光滑,且 ( x0 ) ( xn ) 0 存在 (a, b) 使得 (n)( ) 0
证明:由于Rn(xi) =0 ,i=0,1,…,n
称Ln(x)为n次Lagrange插值多项 式
记为Ln(x)= f(xj)lj(x)
➢ 插值余项 /* Remainder */
定理4.3.1 若 f (n+1) (x) 在[a , b]内存在, 则在[a , b]上
的n+1个互异的点,对 f(x)所作的n次Lagrange插
值多项式Ln (x) 有误差估计
+
(x
6
)( x
4
)
3
(
3
6
)(
3
4
)
2
sin 500
5
L2 ( 18
)
0.76543
R2 ( x)
cos x
3!
(x
6
)(
x
4
)(
x
3
)
;
1 2
cos x
3 2
0.00044
R2
5
18
0.00077
sin 50 = 0.7660444…
2次插值的实际误差 0.00061
/ 6
4 /4
1 2
+
x /
/ 4
6 /6
1 2
sin 500
5
L1( 18
)
0.77614
R1(x)
f
(2) (x )
2!
(x
6
)( x
4
),
1 2
sin x
3 2
0.01319
R1
(
5
18
)
0.00762
利用
x1
4
,
x2
3
计算得:sin 50 0.76008,
0.00538
R%1
5
18
n
Rn (x)
u(x) i
(x 0
xi
)
任意固定 x xi (i = 0, …, n), 考察
n
n
(t) Rn (t) u(x) (t xi ) f (t) Ln(t) u(x) (t xi )
i0
i0
(t)有 n+2 个不同的根 x0 … xn x
(n+1) (x ) 0, x (a, b)
1
0 x x
0
1
0
=
x x1 x0 x1
y0 +
x x0 x1 x0
1
y1 l ( x ) y
i
i
i 0
l0(x)
l1(x)
与 节点有关,而与f 无关
• 构造基函数
lj (x)
(x x0 )(x x1)L (x j x0 )(x j x1)L
(x x j1)(x x j+1)L (x xn ) (x j x j1)(x j x j+1)L (x j xn )
u(x) f (n+1) ( )
(n +1) !
例:已知
sin
6
1 2
,
sin
4
1, 2
sin3
3 2
分别利用 sin x 的1次、2次 Lagrange 插值计算
sin 50, 并估计误差。
解: n = 1 分别利用x0, x1 以及 x1, x2 计算
利用
x0
6
,
x1
4
L1
(
x
)
x /
n x
x
i
x x i0 j
i
i j
j=0,1,…,n (1)
这里每个lj(x)都是n次多项式,且由(1)式容易验证
lj(x)满足
0, i j
l j (xi) 1, i j
(2)
可以证明函数组l0(x),l1(x),…, ln(x) 在插值区 间[a,b]上线性无关,所以这n+1个函数可作 为Pn的一组基函数,称为Lagrange插值基函数
(*)
这个问题称为“插值问题”
这里的 g(x) 称为f(x) 的插值函数。 节点 x0 … xm称为插值节点, 条件(*)称为插值条件,区间[a,b]称为插值区间
g(x) f(x)
x0
x1
x2
x
x3
x4
插值函数的类型有很多种
最常用的插值函数是代…数? 多项式 用代数多项式作插值函数的插值称为代数插值
第三章 插值法(Interpolation Method)
举例
已经测得在某处海洋不同深度处的水温如下:
深度(M) 466 741 950 1422 1634 水温(oC)7.04 4.28 3.40 2.54 2.13
根据这些数据,希望合理地估计出其它深度(如 500米,600米,1000米…)处的水温
插值问题
插值法
本章主要讨论的内 容
插值函数
代 数
• 一、插值问题解的存在唯一性? • 二、插值多项式的常用构造方法?
插 值
• 三、插值函数的误差如何估计?
3.2 代数插值问题解的存在惟一性
给定区间[a,b]上互异的n+1个点{xj}nj=0的一
相关文档
最新文档