拉格朗日多项式四点插值计算
计算方法 插值法Lagrange插值
的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
拉格朗日差值
对于给定的若n+1个点,对应于它们的次数不超过n的拉格朗日多项式只有一个。
如果计入次数更高的多项式,则有无穷个,因为所有与相差的多项式都满足条件。
其中对应着自变量的位置,而对应着函数在这个位置的取值。
假设任意两个不同的x j都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:[3]拉格朗日基本多项式的特点是在上取值为1,在其它的点上取值为0。
范例假设有某个二次多项式函数,已知它在三个点上的取值为:∙∙∙要求的值。
首先写出每个拉格朗日基本多项式:然后应用拉格朗日插值法,就可以得到的表达式(为函数的插值函数):此时代入数值就可以求出所需之值:。
证明存在性对于给定的k+1个点:,拉格朗日插值法的思路是找到一个在一点取值为1,而在其他点取值都是0的多项式。
这样,多项式在点取值为,而在其他点取值都是0。
而多项式就可以满足在其它点取值为0的多项式容易找到,例如:它在点取值为:。
由于已经假定两两互不相同,因此上面的取值不等于0。
于是,将多项式除以这个取值,就得到一个满足“在取值为1,而在其他点取值都是0的多项式”:这就是拉格朗日基本多项式。
唯一性次数不超过k的拉格朗日多项式至多只有一个,因为对任意两个次数不超过k 的拉格朗日多项式:和,它们的差在所有k+1个点上取值都是0,因此必然是多项式的倍数。
因此,如果这个差不等于0,次数就一定不小于k+1。
但是是两个次数不超过k 的多项式之差,它的次数也不超过k。
所以,也就是说。
这样就证明了唯一性[4]。
几何性质拉格朗日插值法中用到的拉格朗日基本多项式(由某一组确定)可以看做是由次数不超过n的多项式所组成的线性空间:的一组基底。
首先,如果存在一组系数:使得,,那么,一方面多项式P是满足的拉格朗日插值多项式,另一方面P是零多项式,所以取值永远是0。
所以。
这证明了是线性无关的。
同时它一共包含n+1个多项式,恰好等于的维数。
拉格朗日插值法总结
拉格朗日插值法总结拉格朗日插值法2008-05-12 16:44一、问题的背景在实际问题中常遇到这样的函数y=f(x),其在某个区间[a,b]上是存在的。
但是,通过观察或测量或试验只能得到在区间[a,b]上有限个离散点x0,x1,…,xn上的函数值yi=f(xi),(i=0,1,…,n)。
或者f(x)的函数f(x)表达式是已知的,但却很复杂而不便于计算;希望用一个既能反映函数f(x)的特性,又便于计算的简单函数来描述它。
二、插值问题的数学提法:已知函数在n+1个点x0,x1,…,xn上的函数值yi=f(xi),(i=0,1,…,n)求一个简单函数y=P(x),使其满足:P(xi)=yi,(i=0,1,…,n)。
即要求该简单函数的曲线要经过y=f(x)上已知的这个n+1个点:(x0,y0),(x1,y1),…,(xn,yn),同时在其它x∈[a,b]上要估计误差:R(x)=f(x)-P(x)其中P(x)为f(x)的插值函数,x0,x1,…,xn称为插值节点,包含插值节点的区间[a,b]称为插值区间,求插值函数P(x)的方法称为插值法。
若P(x)是次数不超过n的代数多项式,就称P(x)为插值多项式,相应的插值法称为多项式插值。
若P(x)是分段的多项式,就是分段插值。
若P(x)是三角多项式,就称三角插值。
三、插值方法面临的几个问题第一个问题:根据实际问题选择恰当的函数类。
本章我们选择代数多项式类,其原因有两个:(1)代数多项式类简单;微分、积分运算易于实行;(2)根据著名的Weierstrass逼近定理,任何连续的函数都可以用代数多项式作任意精确的逼近。
第二个问题:构造插值函数P(x),使其满足:P(xi)=yi,(i=0,1,…,n)与此相关的问题是:插值问题是否可解(存在性的问题),如果有解,是否唯一?(唯一性的问题)第三个问题:插值误差R(x)=f(x)-P(x)的估计问题。
与此相关的问题是插值过程的收敛性的问题。
几种插值法简介
举例来看:可以认为某水文要素T 随时间t 的变化是连续的,某一个测点的水文要素T 可以看作时间的函数T=f(t),这样在实际水文观测中,对测得的(n+1)个有序值进行插值计算来获取任意时间上的要素值。
①平均值法:若求T i 和T i+1之间任一点T ,则直接取T 为T i 和T i+1的平均值。
插值公式为:T=T i +T i+12②拉格朗日(Lagrange )插值法:若求T i 和T i+1之间任一点T ,则可用T i-1、T 1、T i+1三个点来求得,也可用T i 、T i+1、T i+2这三个点来求得。
前三点内插公式为:T=(t-t i )(t-t i+1)(t i-1-t i )(t i-1-t i+1) T i-1+(t-t i-1)(t-t i+1)(t-t i-1)(t-t i+1) T i +(t-t i )(t-t i-1)(t i+1-t i )(t i+1-t i-1) T i+1后三点内插公式为:T=(t-t i+1)(t-t i+2)(t i -t i+1)(t i -t i+2) T i +(t-t i )(t-t i+2)(ti-t i )(t i -t i+2) T i+1+(t-t i )(t-t i+1)(t i+2-t i )(t i+2-t i+1) T i+2为提高插值结果可靠性,可将前后3点内插值再进一步平均。
③阿基玛(Akima )插值法:对函数T=f(t)的n+1个有序型值中任意两点T i 和T i+1满足:f(t i )=T i df dt |t-ti =k i f’(t i+1)=T’i df dt|t-ti+1=k i+1 式中k i ,k i+1为曲线f(t)在这两点的斜率,而每点的斜率和周围4个点有关,插值公式为:T=P 0+P 1(t-t i )+P 2(t-t i )2+P 3(t-t i )3,来对T i 和T i+1之间的一点T 进行内差。
拉格朗日多项式插值法
拉格朗日多项式插值法
拉格朗日多项式插值法是一种基于插值多项式的数值分析方法,用于给定一组数据点,在这些点上构造一个多项式,从而推断出在其他位置上的函数值。
该方法的主要思想是利用一个多项式来近似描述数据点间的关系,使得多项式在已知数据点上的取值与给定数值相一致。
拉格朗日多项式插值法是一种常用的插值方法,其优点是简单易用、精度高、计算量小,适用于各种类型的数据点。
在实践中,拉格朗日多项式插值法被广泛应用于科学计算、工程设计以及数值模拟等领域。
- 1 -。
插值法数学计算方法
插值法数学计算方法插值法是一种数学计算方法,用于在已知数据点的基础上,通过构建一条插值曲线来估计未知数据点的值。
插值法可以应用于各种数学问题中,例如逼近函数、插值多项式、差值等。
本文将详细介绍插值法的原理和常见的插值方法。
一、插值法的原理插值法的基本思想是通过已知数据点的函数值来构建一个函数表达式,该函数可以通过插值曲线来估计任意点的函数值。
根据已知数据点的数量和分布,插值法可以采用不同的插值方法来构建插值函数。
插值法的原理可以用以下几个步骤来描述:1.收集已知数据点:首先,需要收集一组已知的数据点。
这些数据点可以是实际测量得到的,也可以是其他方式获得的。
2.选择插值方法:根据问题的特性和数据点的分布,选择适合的插值方法。
常见的插值方法包括拉格朗日插值法、牛顿插值法、埃尔米特插值法等。
3.构建插值函数:通过已知数据点,利用选择的插值方法构建插值函数。
这个函数可以拟合已知数据点,并通过插值曲线来估计未知数据点。
4.估计未知数据点:利用构建的插值函数,可以估计任意点的函数值。
通过插值曲线,可以对未知数据点进行预测,获得相应的数值结果。
二、常见的插值方法1.拉格朗日插值法:拉格朗日插值法基于拉格朗日多项式,通过构建一个具有多项式形式的插值函数来逼近已知数据点。
插值函数可以通过拉格朗日基函数计算得到,式子如下:P(x) = ∑[f(xi) * l(x)], i=0 to n其中,P(x)表示插值函数,f(xi)表示已知数据点的函数值,l(x)表示拉格朗日基函数。
2.牛顿插值法:牛顿插值法基于牛顿差商公式,通过构建一个递归的差商表来逼近已知数据点。
插值函数可以通过牛顿插值多项式计算得到,式子如下:P(x) = f(x0) + ∑[(f[x0, x1, ..., xi] * (x - x0) * (x - x1)* ... * (x - xi-1)] , i=1 to n其中,P(x)表示插值函数,f[x0, x1, ..., xi]表示xi对应的差商。
4插值法
4.1 函数插值的基本问题
4.1.1 插值问题的基本概念 函数插值的必要性
使复杂函数简单化 使无解析式的函数(离散型、图形图像)获得解析式
为其他数值方法提供支持手段(如数值积分、微分)
插值问题
定义4-1
4.1 函数插值的基本问题
4.1.1 插值问题的基本概念 代数多项式插值问题
由于多项式有其优良的特性,所以通常都是用多项式作为 插值函数。还有其它类型的插值函数,如有理函数插值、 三角函数插值等
4.1.3 插值多项式的误差估计
最大值估计
设 Max f
a x b ( n 1)
( x) M , 则 Rn ( x)
M n1 ( x) (n 1)!
事后估计
当 f
( n 1)
( ) 无法估计时,可作两次 插值,即
x 0 , x1 , , x n p n ( x )
i 0 n
拉格朗日插值的特点: 基函数整齐、对称,与被插函数无关,均为不超过n次的多项式 插值函数被表示为基函数与函数值的线性组合 不便于增加插值基点,因为基函数与插值基点和个数有关 公式的理论价值高于牛顿插值 例4-4 p70例3 例4-5 p71例4
例4-6 p71例5
4.2.4 拉格朗日插值在密钥管理中的应用
依赖于x的点 (a, b) ,使
f ( n 1) ( ) Rn ( x ) n 1 ( x) (n 1)!
n i 0
其中:
n 1 ( x) ( x x0 )(x x1 ) ( x x n ) ( x xi )
推论:当f(x)是次数不超过次的多项式时,pn(x)=f(x)。
函数插值涉及的基本问题
拉格朗日插值实验报告
拉格朗日插值实验报告一、实验目的本实验旨在通过实际实验,深入理解拉格朗日插值法的原理和应用,掌握其计算过程和相关技巧。
二、实验原理Pn(x) = ∑ [yi * li(x)]其中,li(x)称为拉格朗日基函数,具体的计算公式如下:li(x) = ∏ [(x-xj)/(xi-xj)] (i≠j)利用拉格朗日插值法可以对数据进行插值计算,从而得到原函数未知的点的函数值。
三、实验步骤1.根据实验要求,选择一组离散的数据点,确保它们在横坐标轴上不共线。
2. 使用拉格朗日插值法计算插值多项式的各个基函数li(x)。
3.对插值多项式进行求和,得到最终的插值多项式Pn(x)。
4.在给定的范围内选择一些未知数据点,利用插值多项式Pn(x)计算其函数值。
5.将实际计算的函数值与原函数值进行对比,评估插值方法的准确性和精确度。
四、实验结果以实验要求给定的数据点为例,具体数据如下:x:1,2,3,4,5,6y:5,19,43,79,127,187根据拉格朗日插值法的计算公式,可以得到以下结果:l0(x)=(x-2)(x-3)(x-4)(x-5)(x-6)/(-120)l1(x)=(x-1)(x-3)(x-4)(x-5)(x-6)/120l2(x)=(x-1)(x-2)(x-4)(x-5)(x-6)/(-48)l3(x)=(x-1)(x-2)(x-3)(x-5)(x-6)/48l4(x)=(x-1)(x-2)(x-3)(x-4)(x-6)/(-20)l5(x)=(x-1)(x-2)(x-3)(x-4)(x-5)/20插值多项式Pn(x)=5*l0(x)+19*l1(x)+43*l2(x)+79*l3(x)+127*l4(x)+187*l5(x)综合以上计算结果,可以对给定范围内的未知数据点进行插值计算,从而得到相应的函数值。
五、实验分析与结论在实际实验中,我们可以利用拉格朗日插值法对任意给定的函数进行逼近计算,从而得到函数在离散数据点之间的近似值。
拉格朗日插值公式证明过程
拉格朗日插值公式证明过程好嘞,咱来唠唠拉格朗日插值公式的证明。
你可以把函数想象成一个调皮的小怪兽,它在各个点上有着不同的值,就像小怪兽在不同的领地有着不同的魔法力量。
我们呢,就想找到一个魔法公式,能在知道这个小怪兽在几个特定点的魔法力量(函数值)后,推测出它在其他点的魔法力量。
我们先假设有n + 1个点,这些点就像是小怪兽在不同地方的魔法据点。
我们要构造一个多项式,这个多项式就是能打败小怪兽(准确描述函数)的神器。
我们先搞一些小零件,对于每个据点(点),我们构造一个特殊的小魔法(多项式)。
这个小魔法在自己对应的据点上是老大(值为1),在其他据点就像个小透明(值为0)。
这就好比每个据点都有一个专属的小卫士,只在自己的地盘耀武扬威。
然后呢,我们把这些小魔法组合起来,就像把各个小卫士集合起来组成一个超级战队。
这个超级战队就是我们要的拉格朗日插值多项式啦。
从数学上来说,我们设这些点是(x0, y0), (x1, y1), …, (xn, yn)。
对于每个点xi,我们构造的小魔法Li(x)就像一把特制的钥匙。
这个钥匙的构造可有趣啦,分子是一堆(x - xj)(j不等于i)的乘积,分母是(xi - xj)(j不等于i)的乘积。
这就好像用其他据点的位置关系来确定这个钥匙的形状。
当我们把所有的小魔法Li(x)按照对应的yi加权组合起来,就得到了拉格朗日插值多项式L(x)。
这就像把每个小卫士按照据点的魔法力量(函数值)组合起来。
你看啊,这个L(x)在每个xi点上的值就是yi,就像这个超级战队在每个据点的表现都和小怪兽原本的魔法力量一样。
这证明了我们构造的这个多项式是符合要求的。
而且不管这个函数小怪兽原本有多复杂,我们的拉格朗日插值公式就像一个万能的魔法阵,只要知道几个关键的点,就能把这个函数在其他地方的情况给推测出来。
哈哈,这么一解释,是不是感觉拉格朗日插值公式也没那么神秘啦,就像是我们精心打造的一个超级魔法工具,专门用来对付那些调皮的函数小怪兽的。
数值计算方法实验之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)。
拉格朗日插值多项式的原理介绍及其应用
拉格朗⽇插值多项式的原理介绍及其应⽤ 插值,不论在数学中的数值分析中,还是在我们实际⽣产⽣活中,都不难发现它的⾝影,⽐如造船业和飞机制造业中的三次样条曲线。
那么,什么是插值呢?我们可以先看⼀下插值的定义,如下: (定义)如果对于每个1≤i≤n,P(x i)=y i,则称函数y=P(x)插值数据点(x1,y1),...,(x n,y n). 插值的定义⽆疑是清楚明了的,⽽在众多的数学函数中,多项式⽆疑是最简单,最常见的函数,关于它的理论研究也最为透彻。
因此,我们可以不妨先考虑利⽤多项式来进⾏插值。
那么,这样的多项式是否总是存在呢?答案是肯定的,因为我们有如下定理: (多项式插值定理)令(x1,y1),...,(x n,y n)是平⾯中的n个点,各x i互不相同。
则有且仅有⼀个n−1次或者更低的多项式P满⾜P(x i)=y i,i=1,2,...,n. 证明:先⽤归纳法证明存在性,再证明唯⼀性。
当n=1时,常函数(0次)P1(x)=y1即符合要求。
假设当n−1时存在⼀个次数≤n−2的多项式P n−1,使得P n−1(x i)=y i,i=1,2,...,n−1.则令P n(x)=P n−1(x)+c(x−x1)(x−x2)...(x−x n−1)(x−x n),其中c为待定系数,利⽤P n(x n)=y n即可求出待定系数c.此时,P n(x i)=y i,i=1,2,...,n,且P n(x)的次数≤n−1.这样就证明了存在性。
其次证明唯⼀性。
假设存在两个这样的多项式,设为P(x)和Q(x),它们次数≤n−1且都插值经过n个点,即P(x i)=Q(x i)=y i,i=1,2,...,n.令H(x)=P(x)−Q(x),H的次数也≤n−1,且有n个不同的根x1,x2,...,x n.因此,由多项式基本定理可知,H(x)为0多项式,即恒等于0,故有P(x)=Q(x).这样就证明了存在性。
证毕。
拉格朗日多项式插值
拉格朗日多项式插值法浅析摘要拉格朗日插值多项式是一种最常见的多项式插值法,也是一种最常用的逼近工具。
“学以致用 ”是每一门学科都致力追求的境界,数学自然也不例外。
下面,探讨拉格朗日插值法的基本原理、如何构造拉格朗日多项式、拉格朗日多项式的误差界,并用 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 -=称为插值余项。
多项式入门——拉格朗日插值
多项式⼊门——拉格朗⽇插值多项式⼊门——拉格朗⽇插值插值⽤来求解这样⼀类问题:给定 \(n\) 点 \((x_i,y_i)\) 求过这些点的多项式。
1 简介设 \(f(x)\) 为这个多项式,我们有:\[f(x)\equiv f(a)\bmod (x-a)\tag{1} \]这是因为:\[f(x)-f(a)=(a_0-a_0)+a_1(x-a)+a_2(x^2-a^2)+... \]⽽后者显然有⼀个根为 \(a\) ,所以 \((1)\) 式得证。
通过把这 \(n\) 个点代⼊我们可以得到:\[\begin{cases} f(x)\equiv y_1\bmod x-x_1\\ ...\\ f(x)\equiv y_n\bmod x-x_n \end{cases} \]显然模数互质,所以我们考虑⽤中国剩余定理来解决这个事情。
令 \(M=\prod_{i=1}^n(x-x_i)\) ,\(m_i=\frac{M}{x-x_i}=\prod_{i\not= j}(x-x_j)\) 。
并且在模 \(x-x_i\) 的意义下,我们有:\[m_i^{-1}=\frac{1}{\prod\limits_{i\not=j}(x_i-x_j)} \]这是因为我们有:\[\prod_{i\not =j}(x-x_j)\equiv \prod_{i\not =j}(x-x_j-x+x_i)=\prod_{i\not =j}(x_i-x_j) \]所以上述结论成⽴。
所以我们有:\[f(x)\equiv \sum\limits_{i=1}^ny_im_im_i^{-1}\equiv \sum\limits_{i=1}^ny_i\prod\limits_{j\not=i}\frac{x-x_j}{x_i-x_j} \]这个东西可以在 \(n^2\) 的时间内求出。
2 例题直接模拟上⾯的过程即可。
#include<bits/stdc++.h>#define dd double#define ld long double#define ll long long#define uint unsigned int#define ull unsigned long long#define N 2010#define M numberusing namespace std;const int INF=0x3f3f3f3f;const ll mod=998244353;template<typename T> inline void read(T &x) {x=0; int f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c == '-') f=-f;for(;isdigit(c);c=getchar()) x=x*10+c-'0';x*=f;}inline ll ksm(ll a,ll b,ll mod){ll res=1;while(b){if(b&1) (res*=a)%=mod;a=a*a%mod;b>>=1;}return res;}inline ll inv(ll a){return ksm(a,mod-2,mod);}ll n,k,x[N],y[N],ans;int main(){read(n);read(k);for(int i=1;i<=n;i++){read(x[i]);read(y[i]);}for(int i=1;i<=n;i++){ll fenzi=1,fenmu=1;for(int j=1;j<=n;j++){if(j==i) continue;fenmu*=(x[i]-x[j]);fenmu%=mod;fenzi*=(k-x[j]);fenzi%=mod;}ans+=y[i]*fenzi%mod*inv(fenmu)%mod;ans%=mod;}printf("%lld\n",(ans%mod+mod)%mod);return 0;}注意:需要把分母乘出来再求逆元,这样复杂度的瓶颈就不会是求逆元。
常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值
常见插值算法--拉格朗⽇插值、三次卷积插值、三次样条插值、兰克索斯插值写在前⾯本⽂简单介绍了⼏种常见的插值算法并附带了相应的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)。
数值分析中的插值方法
数值分析中的插值方法在数值分析中,插值是一种通过在已知数据点之间估计未知数据点的方法。
它是一种常见的数据处理技术,用于填补数据间的空白,揭示数据间的关联性,或者建立数据模型。
在本文中,我们将讨论数值分析中的几种常见的插值方法。
一、拉格朗日插值拉格朗日插值是一种基于多项式的插值方法。
假设有n个离散数据点,我们想要在这些点之间插值得到未知数据点的值。
拉格朗日插值可以通过构建一个n次多项式来实现。
例如,给定三个数据点(x0, y0),(x1, y1),(x2, y2),我们可以假定插值多项式为:P(x) = y0 * L0(x) + y1 * L1(x) + y2 * L2(x)其中,L0(x),L1(x),L2(x)是拉格朗日插值多项式的基函数,由以下公式得到:L0(x) = (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2))L1(x) = (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2))L2(x) = (x - x0) * (x - x1) / ((x2 - x0) * (x2 - x1))利用这些基函数,我们可以得到插值多项式P(x),从而计算出未知点的值。
二、牛顿插值牛顿插值是另一种常见的插值方法,也是基于多项式的。
与拉格朗日插值不同的是,牛顿插值使用了差商的概念来构建插值多项式。
差商是一种表示数据间差异的指标,它可以用于计算插值多项式的系数。
对于n个数据点,差商可以由以下递归公式计算得到:f[x0] = f(x0)f[x0, x1] = (f[x1] - f[x0]) / (x1 - x0)f[x0, x1, ..., xn] = (f[x1, x2, ..., xn] - f[x0, x1, ..., xn-1]) / (xn - x0)基于差商,我们可以得到牛顿插值多项式的表达式:P(x) = f[x0] + f[x0, x1] * (x - x0) + f[x0, x1, x2] * (x - x0) * (x - x1) + ...利用牛顿插值,我们可以通过已知数据点构建插值多项式,进而估计未知点的值。
拉格朗日插值公式--计算方法教材
0
x0 x1
1
x1 x0
则有: p1(x)=y0l0(x)+y1l1(x) (5) 注意,这里的l0(x)和l1(x)分别可以看做是满足条件 l0(x0)=1 , l0(x1)=0 l1(x1)=1 , l1(x0)=0 的插值多项式.这两个特殊的插值多项式称作问题3的插值基函 数 (参考图1-1、1-2). 式(5)表明,插值问题3的解p1(x)可以通过插值基函数l0(x)和 l1(x)组合得出,且组合系数恰为所给数据y0,y1.
2011-6-1 考试答卷 3
y
1
l0(x)
1 l1(x)
0
0 x0 图 1-1 x1 x x0 图 1-2
x1
2011-6-1
考试答卷
4
2、抛物插值
线性插值仅仅利用两个节点上的信息,精 确度自然很低,为了提高精确度,进一步 考察下述二次插值。
问题4 求作二次式p2(x),使满足条件
p2(x0)=y0, p2(x1)=y1, p2(x2)=y2 (6) 二次插值的几何解释是,用通过三点 (x0,y0),(x1,y1),(x2,y2)的抛物线y=p2(x)来近 似所考察的曲线y=f(x),因此这类插值亦称 为抛物插值。
1 1 0 0 0 0
问题3 求作一次式p1(x),使满足条 件:p1(x0)=y0,p1(x1)=y1 从几何图形上看,y=p1(x)
我们知道,线性公式(3)亦可表示为下列对称式 x x x x p ( x) y y (4) x x x x 若令: l ( x ) x x1 , l ( x) x x0
这表明除xk以外的所有节点都是lk(x)的零 n 点故
计算方法-第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)
内插值法计算公式
内插值法计算公式插值法是一种通过已知数据点之间进行插值,来求解未知数据点的方法。
它在数学、物理、工程等领域中经常被用于数据处理和函数逼近。
内插值法通过已知数据点之间的数学关系,根据已知数据点的特征和关系,推断出未知数据点的数值。
常见的内插值方法包括拉格朗日插值法、牛顿插值法、分段线性插值法等。
以下将介绍这些常见的内插值方法。
1.拉格朗日插值法:拉格朗日插值法是一种通过已知数据点构造拉格朗日多项式的方法。
给定n+1个不同的数据点(x0, y0), (x1, y1), ..., (xn, yn),希望通过这些数据点推断出未知数据点(x, y)的数值。
拉格朗日插值多项式L(x)的表达式为:L(x) = Σ[yi * Li(x)],其中Li(x) = Π[(x - xj) / (xi - xj)],i ≠ j。
通过构造拉格朗日多项式,将已知数据点(x0, y0), (x1, y1), ..., (xn, yn)代入,即可求得未知数据点(x, y)的数值。
2.牛顿插值法:牛顿插值法也是一种通过已知数据点构造插值多项式的方法。
与拉格朗日插值法不同,牛顿插值法使用了差商的概念。
差商表示数据点之间的差别,用来计算插值多项式的系数。
给定n+1个不同的数据点(x0, y0), (x1, y1), ..., (xn, yn),希望通过这些数据点推断出未知数据点(x, y)的数值。
牛顿插值多项式N(x)的表达式为:N(x) = Σ[f[x0, x1, ..., xi] * Π(x - xj)],其中f[x0,x1, ..., xi]表示差商。
通过计算差商f[x0, x1, ..., xi]的值,将已知数据点(x0, y0),(x1, y1), ..., (xn, yn)代入,即可求得未知数据点(x, y)的数值。
3.分段线性插值法:分段线性插值法是一种将插值区间分成若干小段,每段使用线性插值方法计算的插值方法。
给定连续的数据点(x0, y0), (x1, y1), ..., (xn, yn),希望通过这些数据点推断出未知数据点(x, y)的数值。
多项式插值法和拉格朗日插值
多项式插值法和拉格朗日插值教案一多项式插值法和拉格朗日插值基本内容提要1 多项式插值法的基本概念2 插值多项式的存在性与唯一性分析3 拉格朗日插值多项式的构造及截断误差 4 截断误差的实用估计式 5 逐次线性插值法教学目的和要求1 熟练掌握多项式插值法的基本概念2 理解插值多项式的存在性与唯一性3 掌握拉格朗日插值法 4 掌握截断误差的估计方法5 理解逐次线性插值法的基本思想,掌握Aitken逐次线性插值法6 掌握运用拉格朗日插值法处理问题的基本过程教学重点1 拉格朗日插值基函数及拉格朗日插值多项式的构造2 拉格朗日插值多项式的截断误差分析 3 逐次线性插值法的基本思想教学难点1 插值多项式存在唯一性条件的讨论分析2 插值误差的分析与估计3 Aitken逐次线性插值法的计算过程课程类型新知识理论课教学方法结合提问,以讲授法为主教学过程问题引入实际问题中许多变量间的依赖关系往往可用数学中的函数概念刻画,但在多数情况下,这些函数的表达式是未知的,或者函数已知,但形式十分复杂。
基于未知函数或复杂函数的某些已知信息,如何构造这些函数的近似表达式?如何计算这些函数在其它点处的函数值?所构造的近似表达式与真实函数的误差是多少?插值理论与方法就是解决这些问题的有效工具之一。
§2.1 多项式插值2.1.1 基本概念假设f(x)是定义在区间[a,b]上的未知或复杂函数,但已知该函数在点a≤x0P(xi)=yi,i=0,1,2,L,n,即在给定点xi处,P(x)与f(x)是相吻合的。
(2.1)把P(x)称为f(x)的插值多项式(函通常把上述x0数), f(x)称为被插函数。
[a,b]称为插值区间,条件(2.1)称为插值条件,并把求P(x)的过程称为插值法。
如果P(x)为m次多项式Pm(x)=a0xm+a1xm−1+Lam−1x+am,则称该插值法为多项式插值;如果P(x)为三角多项式,则称为三角插值;如果P(x)为分段多项式,则称为分段插值。