拉格朗日插值公式--计算方法

合集下载

拉格朗日插值法解题步骤

拉格朗日插值法解题步骤

拉格朗日插值法解题步骤:
拉格朗日插值法是一种数学方法,用于通过已知的离散数据点来构造一个多项式,这个多项式可以用来估计或逼近其他未知的数据点。

以下是拉格朗日插值法的解题步骤:
1.确定已知数据点:首先,你需要有一组已知的数据点。

这些数据点是你用来进行插值的已知信息。

2.构造拉格朗日多项式:对于每一个数据点 (xi, yi),构造一个拉格朗日基函数。

3. 计算拉格朗日多项式的值:将每个已知数据点的横坐标xi 代入拉格朗日多项式L(x),得到对应的yi 值。

这样,你就可以得到一个新的数据点集,这些点的坐标是(xi, L(xi))。

4. 使用插值多项式进行预测:对于你想要预测的x 值,代入拉格朗日多项式L(x),即可得到对应的y 值。

这就是拉格朗日插值法的基本步骤。

需要注意的是,这种方法只适用于已知的数据点是离散的情况。

如果数据点是连续变化的,你可能需要使用其他方法,如样条插值等。

拉格朗日插值公式变形

拉格朗日插值公式变形

拉格朗日插值公式变形
拉格朗日插值公式的变形可以通过改变变量和系数来实现,下面是一个例子:
拉格朗日插值公式可以表示为$f(k)=\sum_{i=0}^{n}y_i\prod_{j\neq i}(k-x_j)(x_i-x_j)$。

如果我们将$x_i$代入公式,那么只要第$i$项存在(不为$0$),其他项都是$0$(因为其他项的分子一定会存在$x_j-x_j$或$x_i-x_j$,导致分子是$0$),且$\prod_{j\neq i}(k-x_j)(x_i-x_j)$项一定是$1$。

这样我们就得到了一个$n$次多项式。

为了减少计算复杂度,可以采用连续取值的方法,假设$x=1,2,3,\ldots,n$,将这些数代入公式,得到化简版:
$f(x)=\sum_{i=0}^{n}y_i\prod_{j\neq i}(k-j)(i-j)$
分子可以通过预处理前缀积$\prod_{j=1}^{n}(k-j)\prod_{j=1}^{n}(k-j)$得到;分母可以通过预处理阶乘得到。

这样得到了$O(n)$的算法,公式如下:
$f(x)=\sum_{i=0}^{n}y_i\pre{i-1}×suf{i+1}(fac(i)×fac(n-i))$
其中,$\pre{i-1}$和$suf{i+1}$分别表示前缀和后缀运算,$fac(n-i)$表示阶乘运算。

拉格朗日 插值 区间误差限

拉格朗日 插值 区间误差限

拉格朗日插值区间误差限拉格朗日插值方法是一种常用的数值插值方法,用于在给定一组已知数据点的情况下,通过构造一个多项式函数来拟合这些数据点,并在插值区间内求得未知值。

然而,由于插值方法的近似性质,插值结果与真实值之间总会存在一定的误差。

本文将介绍拉格朗日插值法以及其误差限的计算方法。

一、拉格朗日插值法简介拉格朗日插值法是一种基于多项式的插值方法,其基本思想是通过构造一个满足给定数据点的插值多项式来逼近真实的函数曲线。

具体而言,对于给定的n个数据点(xi, yi),拉格朗日插值法的插值多项式可以表示为:P(x) = Σ[ yi * Li(x) ],i=0 to n其中,Li(x)是拉格朗日基函数,定义为:Li(x) = Π[ (x - xj) / (xi - xj) ],j=0 to n,i ≠ j这样,通过求解插值多项式P(x),我们可以在插值区间内求得未知值。

二、插值误差限的计算尽管拉格朗日插值法可以通过构造插值多项式来逼近真实函数曲线,但由于插值方法本质上是一种近似方法,插值结果与真实值之间总会存在一定的误差。

我们可以通过计算插值误差限来评估插值的可靠性。

在拉格朗日插值法中,插值误差限可通过以下等式进行估计:| f(x) - P(x) | ≤ M / (n + 1)! * | x - x0 | * | x - x1 | * ... * | x - xn |其中,f(x)是真实函数的值,P(x)是插值多项式的值,M是插值区间上函数f(x)的最大导数的上界,n是插值多项式的次数。

三、拉格朗日插值法的应用示例为了更好地理解拉格朗日插值法及其误差限的计算方法,我们来看一个具体的示例。

假设我们要通过拉格朗日插值法来估计函数f(x) = sin(x)在区间[0, π]内的某个未知值。

已知在该区间内取了n+1个等间距的数据点(xi, yi),其中i=0, 1, 2, ..., n。

首先,我们可以根据已知数据点构造拉格朗日插值多项式P(x),并计算出未知值的近似值。

几种常用的插值方法

几种常用的插值方法

几种常用的插值方法常用的插值方法包括线性插值、多项式插值、样条插值和径向基函数插值等,下面将依次介绍这些方法。

1.线性插值:线性插值是最简单的插值方法之一,它假设函数在两个已知点之间的变化是线性的。

对于给定的两个点(x0,y0)和(x1,y1),线性插值公式为:y=y0+(x-x0)*(y1-y0)/(x1-x0)其中,y是需要插值的点对应的函数值,x是插值点的横坐标。

2.多项式插值:多项式插值方法通过在给定的一组点上构建一个多项式函数来进行插值。

常用的多项式插值方法包括拉格朗日插值和牛顿插值。

- 拉格朗日插值通过构建一个n次多项式来插值n+1个给定的点。

具体来说,对于给定的n+1个点(x0, y0), (x1, y1), ..., (xn, yn),拉格朗日插值公式为:y = Σ(yk * lk(x))其中,lk(x)是拉格朗日基函数,计算公式为:lk(x) = Π((x - xj) / (xi - xj)),(j ≠ i)- 牛顿插值通过构建一个n次插值多项式来插值n+1个给定的点。

具体来说,对于给定的n+1个点(x0, y0), (x1, y1), ..., (xn, yn),牛顿插值公式为:y = Σ(Π(x - xj) / Π(xi - xj) * finDiff(yj))其中,finDiff(yj)是每个节点的差商,计算公式为:finDiff(yj) = (ΣΠ(xj - xi) * yj) / ΣΠ(xi - xj),(i ≠ j) 3.样条插值:样条插值方法通过使用分段函数来逼近给定的一组点。

常用的样条插值方法有线性样条插值和三次样条插值。

-线性样条插值在每两个相邻点之间使用线性函数进行插值,保证了插值函数的一阶导数是连续的。

-三次样条插值在每两个相邻点之间使用三次多项式进行插值,保证了插值函数的一阶和二阶导数都是连续的。

三次样条插值具有良好的平滑性和精度。

4.径向基函数插值:径向基函数插值是一种基于局部函数的插值方法,它假设函数值仅取决于与插值点的距离。

拉格朗日插值法总结

拉格朗日插值法总结

拉格朗日插值法总结拉格朗日插值法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)的估计问题。

与此相关的问题是插值过程的收敛性的问题。

拉格朗日插值法1

拉格朗日插值法1
ans 0.505 1.122
y2=lagrage(x,y,2PI/9) ;
输出y2=0.6380
均差与牛顿插值多项式
1、1)定义称 为函数 关于 的一阶均差, 称为 的二阶均差。一般的,称 为 的k阶均差(均差也称为差商)。
2)牛顿插值公式推导
根据均差定义,把x看成[a,b]上一点,则有
把后一式带入前一式可得
最后一项中,均差部分含有x,为余项部分,记为
2、例题
设数据 由表给出,表中第4行为 ,可以看出数学模型为 ,用最小二乘法确定a和b。
i
0
1
2
3
4
1.00
5.10
1.629
1.25
5.79
1.756
1.50
6.53
1.876
1.75
7.45
2.008
2.00
8.46
2.135
解:根据给定数据 描图可确定拟合曲线方程为 ,它不是线性形式。两边取对数得 ,若令 ,则得 。为确定A,b,先将 转化为 ,数据见上表。
Function yi=lagrage(x,y,xi)
n=length(x);
S=0;
For k=1:n
t=1;
for(j=1:n)
if j~=k
t=t*(xi-yi)/x(k)-x(j);
end
end
S=t*y(k)+s;
end;
yi=s;
3、例题
1)计算
x
100
121
144
y
10
11
12
解:
L2(x)= +
end
end
for i=1:n;z=1

拉格朗日插值与多阶多项式

拉格朗日插值与多阶多项式

拉格朗日插值与多阶多项式在数学领域中,拉格朗日插值是一种常用的插值方法,用于通过已知的数据点构造一个多项式函数,以逼近未知函数。

这种方法以法国数学家约瑟夫·拉格朗日的名字命名,他在18世纪提出了这一概念。

拉格朗日插值的基本思想是通过构造一个多项式函数,使其在已知数据点处与未知函数相等。

这个多项式函数被称为拉格朗日插值多项式。

它的形式为:P(x) = Σ yi * Li(x)其中,P(x)是拉格朗日插值多项式,yi是已知数据点的函数值,Li(x)是拉格朗日基函数。

拉格朗日基函数Li(x)的定义如下:Li(x) = Π (x - xj) / (xi - xj)其中,i ≠ j,xi和xj是已知数据点的横坐标。

通过拉格朗日插值,我们可以在已知数据点处构造一个多项式函数,从而近似地描述未知函数的行为。

这个多项式函数的阶数取决于已知数据点的个数。

如果已知数据点的个数为n+1,那么拉格朗日插值多项式的最高阶数为n。

多阶多项式是指多项式函数的阶数大于1的情况。

在拉格朗日插值中,我们可以通过增加已知数据点的个数来构造更高阶的多项式函数,从而提高近似的精度。

然而,需要注意的是,随着阶数的增加,多项式函数的复杂性也会增加。

高阶多项式函数可能会在数据点之间产生震荡现象,这被称为龙格现象。

为了避免这种情况,我们需要谨慎选择数据点,以及适当控制多项式函数的阶数。

除了拉格朗日插值,还有其他插值方法,例如牛顿插值和埃尔米特插值。

这些方法都有各自的特点和适用范围。

在实际应用中,我们需要根据具体问题的需求来选择合适的插值方法。

总结起来,拉格朗日插值是一种常用的插值方法,通过构造多项式函数来近似描述未知函数的行为。

多阶多项式可以提高近似的精度,但需要注意控制阶数,以避免龙格现象的出现。

在实际应用中,我们需要根据具体问题的需求来选择合适的插值方法。

通过插值方法,我们可以更好地理解和分析数据,从而为问题的解决提供有力的支持。

数值积分的插值求积公式

数值积分的插值求积公式

数值积分的插值求积公式数值积分的插值求积公式是一种常见的数值计算方法,它通过建立一个插值多项式来逼近被积函数,在一定的积分区间内进行积分近似计算。

插值多项式通过给定的数据点来拟合函数曲线,从而实现对被积函数的逼近。

下面将介绍几种常用的数值积分的插值求积公式。

1. 拉格朗日插值公式拉格朗日插值公式是最简单的插值方法之一,它通过已知的数据点构造一个一维Lagrange插值多项式,从而得到近似积分值。

对于给定的n+1个数据点(x0, y0), (x1, y1), ..., (xn, yn),拉格朗日插值多项式L(x)可以表示为:L(x) = y0 * L0(x) + y1 * L1(x) + ... + yn * Ln(x)其中Li(x)是关于x的n次多项式,满足Li(xj) = δij,即在第i 个点处取值为1,其它点处取值为0。

对于有限积分问题,可以通过计算插值多项式的积分来近似求解。

2. 牛顿插值公式牛顿插值公式是一种高效的插值方法,其基本思想是通过差商来递推计算插值多项式。

对于给定的n+1个数据点(x0, y0), (x1,y1), ..., (xn, yn),牛顿插值多项式N(x)可以表示为:N(x) = y0 + (x - x0) * f[x0, x1] + (x - x0)(x - x1) * f[x0, x1, x2] + ... + (x - x0)(x - x1)...(x - xn-1) * f[x0, x1, ..., xn]其中f[xi, xj, ..., xk]表示差商的计算,它可以递归地定义为:f[xi, xj] = (f[xj] - f[xi]) / (xj - xi)f[xi, xj, ..., xk] = (f[xj, ..., xk] - f[xi, ..., xj-1]) / (xk - xi)通过计算牛顿插值多项式的积分,可以得到数值积分的近似解。

3. 辛普森插值公式辛普森插值公式是一种基于二次多项式拟合的插值方法,在区间[a, b]上将被积函数近似表示为三个节点上的二次多项式。

数据插值方法范文

数据插值方法范文

数据插值方法范文数据插值是指利用已知数据点来估算或预测未知数据点的方法。

在实际应用中,数据插值常常用于填补缺失数据、估算缺失数据以及生成光滑曲线等任务。

本文将介绍常用的数据插值方法。

1.线性插值方法:线性插值是数据插值的一种简单且常用方法。

它假设在两个已知数据点之间的未知数据点的取值是线性变化的。

线性插值的计算公式可以表示为:y=y1+(x-x1)*(y2-y1)/(x2-x1),其中x1和x2是已知数据点的位置,y1和y2是对应的取值,x是待插值点的位置,y是对应的待插值的值。

2.拉格朗日插值方法:拉格朗日插值方法是一种高次插值方法。

它通过构造一个多项式函数来逼近已知数据点,然后利用多项式进行插值。

拉格朗日插值的计算公式可以表示为:y = Σ(yi * L(xi)),其中xi和yi是已知数据点的位置和取值,L(xi)是拉格朗日插值多项式的系数。

3.牛顿插值方法:牛顿插值方法也是一种高次插值方法。

与拉格朗日插值不同的是,牛顿插值使用了差商的概念来构造插值多项式。

牛顿插值的计算公式可以表示为:y=Σ(Di*ωi),其中Di是差商,ωi是权重。

牛顿插值可以通过迭代计算差商并更新权重来求解。

4.三次样条插值方法:三次样条插值方法是一种光滑插值方法,其主要思想是以每两个已知数据点为节点,通过拟合三次多项式来进行插值。

三次样条插值的计算公式可以表示为:S(x) = ai + bi(x-xi) + ci(x-xi)^2 + di(x-xi)^3,其中ai、bi、ci、di是多项式的系数,xi是已知数据点的位置。

5.克里金插值方法:克里金插值方法是一种空间插值方法,主要用于地质学、气象学等领域。

它假设未知点的取值是由已知点的取值通过一定的权重加权求和得到的。

克里金插值的计算公式可以表示为:Z(x)=Σ(λi*Zi),其中Z(x)是待插值点的取值,Zi是已知数据点的取值,λi是权重。

除了以上介绍的几种常用的数据插值方法外,还有一些其他的插值方法,如最邻近插值、反距离权重插值、径向基函数插值等。

常见的插值方法及其原理

常见的插值方法及其原理

常见的插值方法及其原理1. 拉格朗日插值法(Lagrange Interpolation)拉格朗日插值法是一种基于多项式的插值方法,通过n+1个已知点的函数值来构造一个n次多项式。

具体的计算公式如下:L(x) = Σ[yk * lk(x)], k=0 to n其中yk为已知点(xi, yi)的函数值,lk(x)为拉格朗日基函数,定义为:lk(x) = Π[(x - xj)/(xi - xj)], j=0 to n, j≠k拉格朗日插值法的原理是通过构造一个通过已知点的n次多项式,来代替未知函数的近似值。

利用拉格朗日基函数的性质,可以保证插值多项式通过已知点。

2. 牛顿插值法(Newton Interpolation)牛顿插值法是一种递推的插值方法,通过已知点的函数值和差商来逐步构造插值多项式。

差商的定义如下:f[x0]=y0f[x1]=(f[x1]-f[x0])/(x1-x0)f[x2]=(f[x2]-f[x1])/(x2-x1)...f[xn] = (f[xn] - f[xn-1]) / (xn - xn-1)利用差商的定义,可以得到牛顿插值多项式的表达式:N(x) = f[x0] + f[x0, x1](x-x0) + f[x0, x1, x2](x-x0)(x-x1) + ... + f[x0, x1, ..., xn](x-x0)(x-x1)...(x-xn)牛顿插值法的原理是通过递推计算差商来得到插值多项式。

通过使用差商来处理已知点的函数值差异,可以得到更高次的插值多项式。

3. 样条插值法(Spline Interpolation)样条插值法是一种基于分段低次插值函数的插值方法,常用的是三次样条插值。

样条插值法通过寻找一组分段函数,使得满足原函数的插值条件,并要求函数在每个插值点处的函数值、一阶导数和二阶导数连续。

这样可以保证插值函数在每个插值点处的平滑性。

三次样条插值法的原理是将整个插值区间划分为多个小区间,在每个小区间内使用三次多项式进行插值。

拉格朗日插值法理论及误差分析

拉格朗日插值法理论及误差分析

拉格朗日插值法理论及误差分析首先,我们先来了解一下拉格朗日多项式的基本概念。

对于给定的n个不同的点(xi, yi),其中xi是x轴上的点,yi是对应的函数值。

拉格朗日多项式的一般形式可以表示为:L(x) = y0 * l0(x) + y1 * l1(x) + y2 * l2(x) + ... + yn *ln(x)其中,li(x)是拉格朗日基函数,定义为:li(x) = (x - x0)(x - x1)...(x - xi-1)(x - xi+1)...(x - xn) / (xi - x0)(xi - x1)...(xi - xi-1)(xi - xi+1)...(xi - xn)使用拉格朗日插值法,我们可以根据已知数据点构造出一个多项式L(x),该多项式在给定数据点上与原始函数的值完全相同。

求解出多项式L(x)后,我们可以通过求解L(x)的值得到在x处的近似值。

然而,在实际应用中,我们常常关注的是拉格朗日插值法的误差分析。

即,我们需要评估插值多项式与原始函数之间的误差有多大。

f(x) - L(x),≤ M / (n + 1)! * ,(x - x0)(x - x1)...(x - xn)其中,M是在给定区间上的最大值函数M = max,f^(n+1)(x)。

需要注意的是,这个误差上界取决于插值节点的选择,并且对于特定的节点,可以找到与原始函数完全匹配的插值多项式。

进一步地,如果对于给定的k>n,求得插值多项式L(x)的k阶导数,则该导数也可以与原始函数f(x)的k阶导数具有很大的相似性,从而提供了在估计导数时的一种方法。

总的来说,拉格朗日插值法是一种简单而有效的插值方法,可以对给定数据进行插值和近似,而误差分析能够帮助我们评估插值结果的准确程度。

当然,拉格朗日插值法也有其局限性,例如在大数据集上计算困难,并且在边界条件不明确或节点选择不当时会出现振荡。

因此,在具体应用中,我们需要根据实际情况选择合适的插值方法。

计算方法例题

计算方法例题

所求三次多项式为
P3 ( x) yk lk ( x)
k 0
3
5
x( x 4)( x 5) ( x 2)( x 4)( x 5) x( x 2)( x 5) ( x 2) x( x 4) (3) 84 40 24 35
5 3 1 2 55 x x x 1 42 14 21 5 1 55 24 P3 (1) 1 42 14 21 7
l0 ( x) l1 ( x)
x( x 4)( x 5) x( x 4)( x 5) (2 0)(2 4)(2 5) 84
( x 2)( x 4)( x 5) ( x 2)( x 4)( x 5) (0 (2))(0 4)(0 5) 40
n
Pn ( x) l0 ( x) y0 l1 ( x) y1 ln ( x) yn lk ( x) yk
k 0
(
k 0
n
n
x xj xk x j
j 0 j k
yk )
2.拉格朗日插值举例
已知函数y=f(x)的观察数据为
试构造拉格朗日插值多项式P3(x),并计算P3(-1)。 解: 已知4对数据,求得的多项式不超过3次。先构造插值基函数
x x2
x x1
p (0.5) x
2
2
- 3x 8 0.5 - 3 0.5 8 1.125 6 6
2
四.贝齐尔曲线
1.公式
Bn ( P0 , P1 ,, Pn , t ) Pk Bk ,n (t )
k 0
n
(0 t 1)
其中 Bk ,n (t )

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

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

常见插值算法--拉格朗⽇插值、三次卷积插值、三次样条插值、兰克索斯插值写在前⾯本⽂简单介绍了⼏种常见的插值算法并附带了相应的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次多项式P(x)中,设x1,x2,……,xn互不相同,y1,y2,……,yn是任意实数,则:其中,x和y是一个数组,P(x)是一个n次多项式。

例如,当n=2时,范德蒙行列式为:当n=3时,范德蒙行列式为:巧妙的是,当所有x的值互不相同时,范德蒙行列式的值不为零。

范德蒙行列式还有许多性质和应用,它的一些性质如下:1、行列式的值不变:如果我们改变行和列的顺序而不改变行列式中的值,那么它的值不变。

2、范德蒙行列式与特殊函数的关系:范德蒙行列式的元素也可以表示为一些有特殊函数风格的函数。

二、拉格朗日插值拉格朗日插值是一种使用多项式函数来近似原始数据的方法。

假设我们有一组数据(x1,y1),(x2,y2),……,(xn,yn),并且想要使用函数f(x)来近似这些数据。

那么我们可以定义一个n次多项式P(x),使得它在所有的点上都和真实数据相同,即:这个方程成为拉格朗日插值多项式,其中Lj(x)是拉格朗日插值系数,它具有如下形式:应用拉格朗日插值的一个重要方面是处理非连续函数的数据,比如在期权或其他金融领域中。

三、范德蒙行列式和拉格朗日插值之间的关系范德蒙行列式和拉格朗日插值之间有一个重要的联系,即我们可以使用范德蒙行列式来求出拉格朗日插值多项式的系数。

假设我们想要使用n个数据点来近似某个函数,那么我们可以使用以下公式来计算插值多项式的系数:其中,每个Lj(x)都是拉格朗日插值系数,而Vj是权重因子,它的值等于范德蒙行列式的值,即:当计算拉格朗日插值系数时,我们需要计算范德蒙行列式的值,然后通过这些系数来计算插值多项式。

内差法计算公式

内差法计算公式

内差法计算公式内插法是一种通过已知数据点之间的关系来估计未知数据点的方法。

常见的内插法包括线性插值、多项式插值和样条插值等。

下面是一些常用的内插法计算公式:1. 线性插值(Linear Interpolation):当已知数据点 (x0, y0) 和 (x1, y1),要计算在 x0 和 x1 之间某个点 x 的估计值 y,可以使用线性插值公式:y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)2. 拉格朗日插值(Lagrange Interpolation):当已知 n+1 个数据点 (x0, y0), (x1, y1), ..., (xn, yn),要计算在这些点之间某个点 x 的估计值 y,可以使用拉格朗日插值公式:y = L0(x)*y0 + L1(x)*y1 + ... + Ln(x)*yn其中 Li(x) 是拉格朗日基函数,计算公式为:Li(x) = (x - x0)*(x - x1)*...*(x - xi-1)*(x - xi+1)*...*(x - xn) / ((xi - x0)*(xi - x1)*...*(xi - xi-1)*(xi - xi+1)*...*(xi - xn))3. 牛顿插值(Newton Interpolation):当已知 n+1 个数据点 (x0, y0), (x1, y1), ..., (xn, yn),要计算在这些点之间某个点 x 的估计值 y,可以使用牛顿插值公式:y = y0 + c0*(x - x0) + c1*(x - x0)*(x - x1) + ... + cn*(x - x0)*(x - x1)*...*(x - xn-1)其中 c0, c1, ..., cn 是差商(Divided Difference)的计算结果。

差商的计算涉及递归和分治算法。

这些是常用的内插法计算公式,根据具体的数据和需求,可以选择合适的内插法并使用相应的计算公式。

拉格朗日多项式插值法

拉格朗日多项式插值法

拉格朗日多项式插值法拉格朗日多项式插值法是一种数值计算方法,广泛应用于数学、物理、工程等领域。

它的基本思想是通过一些已知点的函数值来逼近未知函数值,这些已知点可以是离散的或连续的函数值。

在本文中,将详细阐述拉格朗日多项式插值法的步骤和实现过程。

Step 1:确定插值点和插值函数拉格朗日多项式插值法的第一步是选择插值点。

插值点是已知函数值的一组点,通常为离散的。

在选择插值点时,需要根据实际问题进行选择。

选择的插值点应尽可能分布均匀,以提高插值的精度。

然后,在这些插值点上构建插值函数,也就是通过这些点拟合出一条曲线。

Step 2:计算拉格朗日插值多项式的每一项然后,我们需要计算拉格朗日插值多项式的每一项。

拉格朗日插值多项式是一个多项式函数,用来拟合已知函数值的曲线。

在计算多项式的每一项时,需要用到插值点的坐标和函数值。

Step 3:将每一项相加得到拉格朗日插值多项式将每一项相加得到拉格朗日插值多项式,从而得到一个函数与原函数的误差最小。

Step 4:用拉格朗日插值多项式拟合未知函数值用拉格朗日插值多项式拟合未知函数值,将插值函数代入拉格朗日插值公式中计算即可得到未知函数值的近似值。

以上就是拉格朗日多项式插值法的基本步骤,下面将具体介绍如何利用这些步骤实现拉格朗日插值多项式的算法。

实现过程:1.定义插值点的坐标和函数值;2.计算拉格朗日多项式的每一项系数,每一项系数由插值点的函数值和坐标决定;3.将每一项系数相加,得到拉格朗日插值多项式;4.用拉格朗日插值多项式拟合未知函数值,即将未知函数的自变量带入拉格朗日插值多项式中计算。

在实现过程中,需要注意以下几点:1. 插值点的数量要足够多,以保证插值的精度;2. 插值点要均匀分布,尽可能覆盖整个函数区间;3. 对于高次多项式,容易产生龙格现象,需要进行截断。

拉格朗日多项式插值法的优点是计算简单,容易理解,可以应用于一些简单的数学问题的解决;缺点是插值点的选取与插值函数相关,且插值点的数量和位置对插值精度影响较大。

数值分析中的插值方法应用

数值分析中的插值方法应用

数值分析中的插值方法应用数值分析是一门研究数值计算方法和计算机求解数学问题的学科。

在实际问题中,我们经常需要根据有限的数据估计和预测未知数值,而插值方法就是一种常用的数值计算技术,用来构造未知数据点的函数表达式。

本文将介绍数值分析中的插值方法及其应用。

一、线性插值方法1. 线性插值原理线性插值是一种简单而常用的插值方法,它假设函数在给定的两个数据点之间是线性的。

根据两个已知数据点(x0, y0)和(x1, y1),可以通过以下公式求得在这两个点之间插值的函数表达式:y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)2. 线性插值应用场景线性插值方法适用于对连续函数进行近似估计的场景。

例如,在传感器数据处理中,由于数据采样的时间间隔有限,我们需要通过线性插值方法来估计中间时刻的数据值,以获得更精确的测量结果。

二、拉格朗日插值方法1. 拉格朗日插值原理拉格朗日插值是一种基于多项式的插值方法,它通过构造一个满足已知数据点的多项式函数来进行插值。

给定n个数据点,拉格朗日插值多项式的表达式如下:P(x) = Σ yi * li(x),i=0 to n其中,yi是第i个数据点的函数值,li(x)是拉格朗日基函数,计算公式为:li(x) = Π (x - xj) / (xi - xj),j ≠ i2. 拉格朗日插值应用场景拉格朗日插值方法适用于对离散数据进行高次多项式逼近的场景。

例如,在数据拟合中,我们可利用拉格朗日插值方法构造出一个多项式函数,以逼近已知数据点所代表的曲线,从而进行数据的预测和估计。

三、牛顿插值方法1. 牛顿插值原理牛顿插值是一种利用差商的插值方法,它通过构造一个满足已知数据点的插值多项式来进行插值。

给定n个数据点,牛顿插值多项式的表达式如下:P(x) = f[x0] + Σ f[x0, ..., xi] * Π (x - xj),i=0 to n-1其中,f[x0, ..., xi]是差商,计算公式为:f[x0, ..., xi] = (f[x1, ..., xi] - f[x0, ..., xi-1]) / (xi - x0)2. 牛顿插值应用场景牛顿插值方法适用于对具有大量数据点的函数进行插值和逼近的场景。

拉格朗日插值公式--计算方法教材

拉格朗日插值公式--计算方法教材
1 0 1 0 1 0 1 1 0
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 点故

拉格朗日插值法

拉格朗日插值法

拉格朗⽇插值法题⽬描述由⼩学知识得:n+1 个x坐标不同的点确定唯⼀的最⾼次为n次的多项式y=f(n) 。

现在给出n+1 个点,求出这些点构成的多项式在某⼀位置的取值拉格朗⽇插值法假设给出的曲线是个⼆次多项式f(x)=ax2+bx+c现在有三个已经确定的点 (x1,y1) ,(x2,y2) , (x3,y3)代⼊柿⼦f(x1)=ax21+bx1+cf(x2)=ax22+bx2+cf(x3)=ax23+bx3+c很显然可以⽤⾼斯消元求出a,b,c , 时间复杂度O(n3)但拉格朗⽇插值法只需要n2神奇的构造:我们需要构造三条曲线f1,f2,f3对于第⼀条曲线f1(x)令f1(x1)=1,f1(x2)=f1(x3)=0对于第⼆条曲线f2(x)令f2(x2)=1,f2(x1)=f2(x3)=0对于第三条曲线f3(x)令f3(x3)=1,f3(x1)=f3(x2)=0然后y1f1(x) 就能保证在x1处为y1,x2,x3处为取值为 0y2f2(x) 就能保证在x2处为y2,x1,x3处为取值为 0y3f3(x) 就能保证在x3处为y3,x1,x2处为取值为 0再然后f(x)=y1f1(x)+y2f2(x)+y3f3(x)神奇发现这三条曲线就求出了想要的那条曲线推导对于上⾯的三条曲线显然满⾜性质f i(x j)=1 (i=j) 0 (i≠j)然后构造出这么个柿⼦f1(x)=(x−x2)(x−x3) (x1−x2)(x1−x3)进⼀步推⼴f i(x)=j≤n∏j≠ix−x jx i−x j然后就有了f(x)=i=n∑i=1y i∗f i(x)x 取值连续时当题⽬要⽤到的 x 取值是连续的,上⾯的柿⼦可以优化到O(n)先列出柿⼦f(k)=i=n∑i=1y i∗j≤n∏j≠ix k−x jx i−x j考虑O(1) 求出∏j≠i x k−x j x i−x j维护x k的前缀积和后缀积pre i=i∏j=0(x k−x j)suf i=n∏j=i(x k−x j)对于分母,就是个阶乘形式,柿⼦就成了{{Processing math: 100%f(k)=n∑i=0y ipre i−1∗suf i+1fac i∗fac n−i坑:当n−i为奇数的时候分母为负值重⼼拉格朗⽇插值法有毒瘤题⽬会随时增加或者减少差值点,这个时候曲线就会改变,上⾯的柿⼦就需要重新计算了,那么上⾯的复杂度就会退化成n3于是就有了重⼼拉格朗⽇插值 (好像⽜顿插值法也可以办到 = =)还是前⾯的柿⼦f(x)=n∑i=1y i∏i≠jx−x jx i−x j=n∑i=1y i∏i≠j x−x j∏i≠j x i−x j=n∑i=1y i∏n i=1(x−x i)∏i≠j(x i−x j)∗(x−x i)=n∏i=1(x−x i)n∑i=1y i∏i≠j(x i−x j)∗(x−x i)令g=∏n i=1(x−x i),t(i)=∏i≠j(x i−x j)然后柿⼦就成了f(x)=gn∑i=1y i(x−x i)∗t(i)对于每加⼊或减少⼀个点,可以只O(n) 更新t(i)对于求值,可以O(n) 求出 g,然后套公式就好了预处理出逆元时间复杂度O(n)参考资料。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

容易看出这样构造出的p2(x)满足条件(6)。因 而他就是问题4的解
2011-6-1 考试答卷 7
例3 利用100,121和144的开方值 求 115 解:用抛物插值,这里 x0=100,y0=10,x1=121,y1=11,x2=1 44,y2=12.令x=115代人式(8), 求得 115 近似值为10.7228.同精确值比较, 这里得到有4位有效数字的结果。
1 0 1 0 1 0 1 1 0
0
x
0
− x
1
1
x
1

x
0
则有: 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.
l0(x)=c(x-x1)(x-x2) 再利用式(7)剩下的一个条件 l0(x0)=1确定系数c,结果得出
l0 ( x ) = ( x − x 0 )( x − x 2 ) ( x 0 − x 1 )( x 0 − x 2 )
类似的可以构造出满足条件: l1(x1)=1,l1(x0)=l1(x2)=0 2011-6-1 l2(x2)=1,l2(x0)=l2(x1)=0。 考试答卷
6
的插值多项式l1(x)与l2(x),其表达式分别为:
l1 ( x ) = ( x − x 0 )( x − x 2 ) ( x − x 0 )( x − x 1 ) , l2 ( x ) = ( x 1 − x 0 )( x 2 − x 1 ) ( x 2 − x 0 )( x 2 − x 1 )
n n k =0 k k i i
∏ 这里∏的含义是累乘, 表示乘积遍取下标j 从0到除k以外的全部值. 式(10)称作拉格朗日插值公式. 利用插值基函数容易得出问题2的解
j= 0 j≠ k
n
2011-6-1
考试答卷
10
开始 输入x 输入 (xi ,yi ) , i=0,1,2,…,n 0→y 0→k 1→t
§1.2 拉格朗日插值公式
------《数值分析简明教程》
1、线性插值 2、抛物插值 3、一般情况
2011-6-1 考试答卷 1
1、线性插值
首先考察线性插值的简单情形。
表示通过两点(x0,y0),(x1,y1)的直线。因此,一次插 值亦称线性插值。 上述简单的线性插值是人们所熟悉的,它的解p1(x) y −y (x − x ) p1( x) = y + 可表为下列点斜式 x −x 例2 已知 100 = 10 , 121 = 11 , 求 y = 115 (3) 解:这里x0=100,y0=10,x1=121,y1=11.令 x=115代入(3),求得y=10.71428,这个结果有3 位有效数字(试与例1的结果相比较). 2011-6-1 2 考试答卷
0, j ≠ k lk ( x j ) = δ kj = 1, j = k (9)
这表明除xk以外的所有节点都是lk(x)的零 n 点故
lk ( x ) = c

(x − x j)
考试答卷
j= 0 j≠ k
2011-6-1
9
即pn(x)满足插值条件(2).
该公式的形式对称,结构紧凑, n n n x − xj p n ( x ) = ∑ y k lk ( x ) = ∑ (∏ ) yk (10 ) 因而容易编写计算程序.事实上, k =0 k =0 j=0 xk − x j j≠ k 式(10)的逻辑结构上表现为二 事实上由于每个插值基函数lk(x)都是n次式, 重循环.内循环(j循环),然后 pn(x)的次数≤n,又据(9)式有 再通过外循环(k循环)累加得出 p (x) = ∑ y l (x ) = y 插值结果y.图1-3是拉格朗日方法 的算法图框.
x − xj t⇒ t xk − xj j = 0, L ,k − 1, k + 1, L ,n
y + t·yk →y

K=n? = 输出y 输出
k+1→k
图1-3
2011-6-1 考试答卷 结束 11
2011-6-1
考试答卷
12
2011-6-1

考试答卷
5
为了得出插值公式p 先解决一个特殊的二次插值问题: 为了得出插值公式 2(x),先解决一个特殊的二次插值问题: 先解决一个特殊的二次插值问题 求作二次式l 求作二次式 0(x),使满足条件 , l0(x)=1 , l0(x1)=l0(x2)=0 (7) ) 这个问题是容易求解的,事实上,由式( ) 这个问题是容易求解的,事实上,由式(7)的后两个条 的两个零点, 件知, 件知,x1,x2是l0(x)的两个零点,因而 的两个零点
2011-6-1
考试答卷
8
3.一般情况
进一步求解一般形式的问题2.仿照线性 进一步求解一般形式的问题 仿照线性 插值和抛物插值所采用的方法, 插值和抛物插值所采用的方法,仍从构 造所谓插值基函数入手.这里的插值基函 造所谓插值基函数入手 这里的插值基函 次多项式, 数lk(x)=0,1,2,…,n)是n次多项式,且满 是 次多项式 足条件
这样构造出的l0(x),l1(x)和l2(x)称作问题4的插值 基函数 y 设取已知数据y0,y1,y2作为组合系数,将插值基 函数l0(x),l1(x),l2(x)组合得:
(x−x0)(x−x2 ) (x−x0)(x−x1) (x−x1)(x−x2) p2(x) = y0 − y1 − y2 (x0 −x1)(x0 −x2) (x1 −x0)(x1 −x2) (x2 −x0)(x2 −x1) (8)
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 x − x 0 若令: l ( x ) = x − x 1 , l ( x ) =
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),因此这类插值亦称 为抛物插值。
相关文档
最新文档