一.插值
什么是插值
首先看一下 百度百科的定义
在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。
从古到今,百度百科的定义一直。。。
这是啥意思?
简而言之就是 我现在有n个点对应的函数值 ,但是我想知道 在这个区间内的n+x个点的函数值,这就是插值
举个例子:
我们已经知道一定数量的离散的点,如下
x=[0.5 1 1.5 2 2.5 3]
y=[1.75 2.45 3.81 4.8 8 8.6]
plot(x,y,'o')
接下来,我们 想把他用光滑的线连接起来,比如:
x=[0.5 1 1.5 2 2.5 3]
y=[1.75 2.45 3.81 4.8 8 8.6]
xi=0.5:0.1:3
y3=lagrange(x,y,xi)
y2=spline(x,y,xi)
y1=interp1(x,y,xi)
subplot(3,1,1)
plot(x,y,'o',xi,y1)
title('分段线性插值')
subplot(3,1,2)
plot(x,y,'o',xi,y2)
title('三次样条插值')
subplot(3,1,3)
plot(x,y,'o',xi,y3)
title('拉格朗日插值')
这是我们所说的插值,插值有很多种类,本文暂时介绍三种。
第一个命令interp1
1.分段线性插值(interp1)
interp1叫做分段线性插值,就是先插入一些点,再将这些点用直线连接起来。
调用格式如下:
yi=interp1(x,y,xi)
这里面,x与y是已知的点形成的矩阵,xi,yi是插入的点,在这里我们取步长为0.1
就插入了26个点然后将这26个点用直线连接起来
然后将这26个点用直线连接起来,就得到了
这是就是分段线性插值(interp1)
2.三次样条插值(spline)
在工程实际中,我们对一些图形有比较高的要求,比如飞机的机翼形线,要求是二阶光滑的。
调用格式
yy=spline(x,y,xx)
继续以刚刚的x,y值为例:
x=[0.5 1 1.5 2 2.5 3]
y=[1.75 2.45 3.81 4.8 8 8.6]
plot(x,y,'o')
xi=0.5:0.1:3
yi=spline(x,y,xi)
hold on
plot(xi,yi)
3.拉格朗日插值
来看一下拉格朗日插值的定义
在进行拉格朗日插值之前,我们需要定义一个m文件,如下:
function yy=lagrange(x,y,xx)
m=length(x);
n=length(y);
if m~=n,error('向量x与y的长度必须一致')
end
s=0;
for i=1:n
t=ones(1,length(xx))
for j=1:n
if j~=i
t=t.*(xx-x(j))/(x(i)-x(j))
end
end
s=s+t*y(i)
end
yy=s
再进行插值
x=[0.5 1 1.5 2 2.5 3]
y=[1.75 2.45 3.81 4.8 8 8.6]
plot(x,y,'o')
xi=0.5:0.1:3
yi=lagrange(x,y,xi)
hold on
plot(xi,yi)
二.拟合
如果说插值是先找点再连线,那么拟合就是根据已知点求出曲线方程,在画线。
多项式拟合(polyfit)
将已知点拟合成一个多项函数:y=
调用格式
a=polyfit(x,y,n)
表示对已知点x,y进行拟合,求得n次多项式的系数向量(a)
如:x=[0.5 1 1.5 2 2.5 3]
y=[1.75 2.45 3.81 4.8 8 8.6]
a=polyfit(x,y,5)
%进行五阶多项式拟合
%a =
% -2.9333 24.4067 -75.7400 108.9983 -69.6317 17.3500
%故此,拟合形成的五阶多项式为
%y=-2.9333x^5+25.4067x^4-75.7400x^3+108.9983x^2-67.6317*x+17.3500
接着用polyval命令求得y的值
polyval调用格式:
y1=polyval(a,x1)
a为多项式向量
polyfit的输出是一个多项式系数的行向量。为了计算在xi数据点的多项式值。
x1=0.5:0.1:3
y1=polyval(a,x)
plot(x,y,'o',x1,y1)
好啦,今天的讲解就到这里啦,码字不易,小伙伴们点个赞再走叭