插值与拟合

导入:什么是插值?什么是拟合?

导语:假设我们现在通过做实验得到了一批数据点,但光有点我们还无法知道这些数据代表了什么,到底数据点之间存在线性关系还是指数关系,对这些我们一概不知。因此我们需要找到一些方法来对散点进行处理得到变量之间的关系曲线,这样我们才好分析。(PS:已经了解插值与拟合概念的读者可以在目录选择感兴趣的内容阅读)

那就以小明同学为例吧,小明同学正在做实验,他得到的实验原始数据为:x=1:1:17; y=[3.5 4 4.3 4.6 4.7 4.8 4.8 4.7 4.6 4 3.9 3.3 2.8 2.5 2.2 1.8 1.3],而他想知道数据x与y之间有什么关系,但遗憾的是,这位同学并没有什么特别的天赋能从数据中直接看出x和y之间的关系,那么怎样才能拥有这种“天赋”呢。

他很快想到了,虽然我们不能直接看出数据点之间的关系,但可以把这些点画在图上再观察啊!说干就干,小明立刻把数据点标在了图上。

请添加图片描述
好像还不是很直观,如果我们能根据数据点做出一条连续的线来那效果一定会更好,那么我们想办法将这些数据用线连起来吧。

既然是基于这些数据点来画图,那么我们来试试连点成线,先用直线将这些数据点连起来。
在这里插入图片描述
啊这,看上去虽然直观了一点,但如果小明敢在实验报告上这样搞肯定会被老师骂死的。于是小明立刻换了一种方法,他决定使用某种方法将线条做得弯曲一点。请添加图片描述
看上去舒服多了。不过仔细观察可以发现,虽然曲线更好看了,但还是因必须通过所有数据点这一规定,而出现了一些不必要的弯折。

小明想着,反正实验数据有点波动正常,那非要连点成线呢,因此他决定更大胆一点!不再让曲线非得穿过所有数据点,而是打算根据所有数据点的位置去画一条尽可能靠近所有数据点绝对光滑的曲线。

有前面的连线结果看上去好像数据线条好像对应着二次函数对应的曲线,那我们就试着拿这样的曲线去靠近数据点吧。
在这里插入图片描述
怎么样,是不是感觉舒服了不少。虽然小明同学实验做得不怎么样导致数据点产生了较多偏移,但我们依然可以判断出横纵轴变量之间应该符合二次函数的关系。

至此我们就理解了插值拟合的概念。

插值就是我们为了稳妥起见,在保证曲线通过所有数据点时,使数据点间的线条尽可能光滑、尽可能靠近原始图像的方法;

拟合则是我们在发现了数据的函数关系后,大胆决定使用这种函数关系的图像去靠近所有数据点的方法。

> 拟合也是广义上的插值

好了,下课。

诶~,不对,同学们都回来,我们再拖个堂😆,把插值中对数据点中光滑曲线的操作和拟合时确保偏差最小的方法讲一讲。👨‍🏫 👨‍🏫 👨‍🏫

插值

插值其实就是一个解压缩的过程,它其实是函数求值的逆过程——由值求函数。我们希望通过插值方法解压缩,来看到压缩之前的那个未知函数长什么样子。

有了上面的例子我们自然知道,直接把数据点连起来的方法不太聪明,我们要想办法用曲线通过所有数据点,而这曲线我们自然也不能凭感觉随便画一条,还是需要特定的数学方法给出。这样的根据已知数据点绘制曲线的特别方法就是插值的重点~

拉格朗日插值法

假设我们现在有三点,要找到一条可以穿过它的曲线,那么我们可以考虑求解多项式,使得其对应函数图像通过这三点。通过三点的曲线可以用二次多项式 y = a 0 x 2 + a 1 x + a 2 y=a_0x^2+a_1x+a_2 y=a0x2+a1x+a2 表示,将三点坐标带入则有方程组 { y 1 = a 0 x 1 2 + a 1 x 1 + a 2 y 2 = a 0 x 2 2 + a 1 x 2 + a 2 y 3 = a 0 x 3 2 + a 1 x 3 + a 2 \left\{\begin{array}{l} y_{1}=a_{0}x_1^2+a_{1} x_{1}+a_{2} \\ y_{2}=a_{0}x_2^2+a_{1} x_{2}+a_{2} \\ y_{3}=a_{0}x_3^2+a_{1} x_{3}+a_{2} \end{array}\right. y1=a0x12+a1x1+a2y2=a0x22+a1x2+a2y3=a0x32+a1x3+a2

请添加图片描述

虽然我们学过,两点确定一条直线,但三点可并不能确定一条二次曲线,因此,确定这样一条过三点的二次曲线的方法是多样的。然后呢,看到章节名就该想到,拉格朗日大神对这个问题又有着独特的看法,那么拉格朗日得到二次曲线的思路如下:

既然我无法直接得到这条二次曲线,那我就通过累加的方法,将三条二次曲线叠加起来得到这条曲线。既然在该过程中唯一要保证的就是通过三个点,那么我们就让三条曲线分别代表一个点。例如,第一根曲线 f 1 ( x ) f_1(x) f1(x),在 x 1 x_1 x1处取值为1,在其余两点取值为0;

请添加图片描述
再令第二根曲线 f 2 ( x ) f_2(x) f2(x),在 x 2 x_2 x2处取值为1,在其余两点取值为0;令第三根曲线 f 3 ( x ) f_3(x) f3(x),在 x 3 x_3 x3处取值为1,在其余两点取值为0;这样操作之后再令函数分别乘以对应的系数 y 1 ,   y 2 ,   y 3 y_1,\ y_2,\ y_3 y1, y2, y3 并求和。因此,最后得到 f ( x ) = y 1 f 1 ( x ) + y 2 f 2 ( x ) + y 3 f 3 ( x ) f(x)=y_1f_1(x)+y_2f_2(x)+y_3f_3(x) f(x)=y1f1(x)+y2f2(x)+y3f3(x),这样的函数 f ( x ) f(x) f(x) 就满足了通过三点的条件。

请添加图片描述
以上就是拉格朗日插值法的核心思想。接下来,我们对过三点的拉格朗日插值法进行严格的推导。

以第1条曲线为例,应当满足 f 1 ( x j ) = { 1 ,   1 = j 0 ,   1 ≠ j f_1(x_j)=\begin{cases} 1,\ 1=j \\ 0,\ 1\neq j \end{cases} f1(xj)={ 1, 1=j0, 1=j,那么显然, f 1 ( x ) = ( x − x 2 ) ( x − x 3 ) ( x 1 − x 2 ) ( x 1 − x 3 ) f_1(x)=\frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)} f1(x)=(x1x2)(x1x3)(xx2)(xx3)

对其他曲线也有 f i ( x ) = Π j ≠ i 1 ≤ j ≤ 3 x − x j x i − x j f_i(x)= \Pi_{j\neq i}^{1\le j\le 3} \frac{x-x_j}{x_i-x_j} fi(x)=Πj=i1j3xixjxxj。因此,最终我们得到, f ( x ) = ∑ i = 1 3 y i f i ( x ) f(x)=\sum_{i=1}^3 y_if_i(x) f(x)=i=13yifi(x)

我们对三点的情况进行推广,就得到了更一般的拉格朗日插值法公式: f ( x ) = ∑ i = 1 N y i f i ( x ) f(x)=\sum_{i=1}^N y_if_i(x) f(x)=i=1Nyifi(x) f i ( x ) = Π j = 1 ,   i ≠ j N x − x j x i − x j f_i(x)=\Pi_{j=1,\ i\neq j}^{N} \frac{x-x_j}{x_i-x_j} fi(x)=Πj=1, i=jNxixjxxj

以数据点 (1,16), (2,18), (3,21), (4,17), (5,15), (6,12) 为例,使用拉格朗日插值法得到结果如下。

在这里插入图片描述

其对应代码为

%% 函数文件
function v=insert1(x,y,u)
    n=length(x);
    v=zeros(size(u));   % 创建与u尺寸一致的全0数组
    for k=1:n
        w=ones(size(u));
        for j=1:n   % 或写为 [1:k-1 k+1:n] 跳过k,这样在写一步便不需做判断
            if j~=k w=(u-x(j))./(x(k)-x(j)).*w; end     % 累乘求得f_i(x)
        end
        v=v+w*y(k); % 累和求得f(x)
    end
end

%% 脚本文件
clear all; clc; close all
x=[1 2 3 4 5 6];
y=[16 18 21 17 15 12];
u=0.75:0.05:6.25;
v=insert1(x,y,u);
plot(x,y,'--',u,v,'-')
axis([0 7 6 22])

例题:已知 x = [-2 -1 1 2], y = [-3 -2 1 3],采用拉格朗日插值法,求 xi=0 处的函数值。读者动手计算此例,进一步掌握拉格朗日插值法的思想。[参考答案见文末]

Hermite插值法

Hermite插值也叫做带指定微商值的插值,由此已经能看出它的特点:拉格朗日插值的插值条件都是在给定节点取已知函数值,而Hermite插值还要求插值函数在给定节点上取已知导数值。

我们先以两点的Hermite插值即三次Hermite插值法为例,讨论Hermite插值法的思路。

给定函数 f ( x ) f(x) f(x) 上两点 ( x 0 ,   y 0 ) ,   ( x 1 ,   y 1 ) (x_0,\ y_0),\ (x_1,\ y_1) (x0, y0), (x1, y1) 及在 x 0 , x 1 x_0,x_1 x0,x1 处函数的的微商值 y 0 ′ ,   y 1 ′ y_0',\ y_1' y0, y1

同拉格朗日插值法的处理,我们将函数 H ( x ) H(x) H(x) 拆分成4个不同的函数,使得它们分别对应两点的函数值与微商值。因此,四个基函数如下
在这里插入图片描述
乘以对应系数,则有 H ( x ) = y 0 h 0 ( x ) + y 1 h 1 ( x ) + y 0 ′ H 0 ( x ) + y 1 ′ H 1 ( x ) H(x)=y_0 h_0(x)+y_1h_1(x)+y_0'H_0(x)+y_1'H_1(x) H(x)=y0h0(x)+y1h1(x)+y0H0(x)+y1H1(x)。接下来的问题就是如何确定函数 h i ( x ) h_i(x) hi(x) H i ( x ) H_i(x) Hi(x)

h 0 ( x ) h_0(x) h0(x) 为例,可以看出 h 0 ( x ) h_0(x) h0(x) 有一个二阶零点 x 1 x_1 x1,因此,可以设 h 0 ( x ) = A ( x − x 1 x 0 − x 1 ) 2 h_{0}(x)=A\left(\frac{x-x_{1}}{x_{0}-x_{1}}\right)^{2} h0(x)=A(x

  • 22
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

力语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值