插值与拟合
程序员文章站
2022-07-05 19:06:17
...
简介
当面临一堆散乱的数据,看不出这之间符合的函数的关系式,可以先对数据做一个初步整理,可以采用插值拟合的方法。
插值:得到的函数曲线都过这些数据点,只是在这些点的空隙,插入一些值,使之可以得到一个曲线轮廓
拟合:不一定都要这些数据点,但得到的曲线到这些真实数据点的距离应是最小的
MATLAB 插值工具箱
为了得到更平滑的曲线或曲面,可以采用三次样条插值
一维插值(一元函数曲线)
语法: y = interp1(x0,y0,x,’method’);
x0,y0,为真实插值点的行向量,x为插值点,y为插值得到的函数值,method指导插值的方法,默认是线性插值。插值的x0要求是单调的的
x0=[0 3 5 7 9 11 12 13 14 15];
y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6];
x=0:0.1:15; %插值点的间距为0.1
y1=interp1(x0,y0,x);%method省略默认是‘liner’线性插值
y2=interp1(x0,y0,x,'spline');%‘spline’表示立方插值
pp1=csape(x0,y0);%以下这两句表示三次样条插值
y3=ppval(pp1,x);
subplot(1,3,1)%subplot(m,n,p)m表示是图排成m行,n表示图排成n列
%p表示图所在的位置
plot(x0,y0,'+',x,y1)%plot是绘制一维曲线的基本函数
title('Piecewise linear')%图的标题
subplot(1,3,2)
plot(x0,y0,'+',x,y2)
title('Spline1')
subplot(1,3,3)
plot(x0,y0,'+',x,y3)
title('Spline2')
二维插值(二元函数曲面)
clear,clc
x=100:100:500;%x,y,z是真实已有数据
y=100:100:400;
z=[636 697 624 478 450
698 712 630 478 420
680 674 598 412 400
662 626 552 334 310];
pp=csape({x,y},z')
xi=100:10:500;yi=100:10:400;%插值数据
cz=fnval(pp,{xi,yi});%三次样条插值
[i,j]=find(cz==max(max(cz))) %找最高点的地址
x=xi(i),y=yi(j),zmax=cz(i,j) %求最高点的坐标
size(xi),size(yi),size(cz)
subplot(1,1,1),mesh(xi,yi,cz')%注意这里cz要转置,不然维度不一致
matlab插值时外插值是不确定的,可以采用混合插值,把不确定的值换成最近点的插值的结果
clc, clear
x=[129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5];
y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5];
z=-[4,8,6,8,6,8,8,9,9,8,8,9,4,9];
xmm=minmax(x) %求x的最小值和最大值
ymm=minmax(y) %求y的最小值和最大值
xi=xmm(1):xmm(2);
yi=ymm(1):ymm(2);
zi1=griddata(x,y,z,xi,yi','cubic'); %立方插值
zi2=griddata(x,y,z,xi,yi','nearest'); %最近点插值
zi=zi1; %立方插值和最近点插值的混合插值的初始值
zi(isnan(zi1))=zi2(isnan(zi1)) %把立方插值中的不确定值换成最近点插值的结果
subplot(1,2,1), plot(x,y,'*')
subplot(1,2,2), mesh(xi,yi,zi)
曲线拟合的线性最小二乘法
上面我们可以用插值的方式,得到图像,更加明确的观察到数据的分布,但是还是不能得到数据之间的函数关系,现在我们通过拟合的方法,得到数据之间的函数关系
x0=[1990 1991 1992 1993 1994 1995 1996];
y0=[70 122 144 152 174 196 202];
a=polyfit(x0,y0,1)%曲线拟合函数,1表示一阶函数
%x, y为已知数据点向量, 分别表示横,纵坐标, m为拟合多项式的次数,
%结果返回m次拟合多项式系数, 从高次到低次存放在向量p中.
y97=polyval(a,1997)%是求值函数
y98=polyval(a,1998)
xmm=minmax(x0) %求x的最小值和最大值
xi=xmm(1):xmm(2);
yi = a(1)*xi+a(2)
subplot(1,1,1),plot(x0,y0,xi,yi)
上一篇: VSCode中Vue代码格式化
下一篇: MySQL5.7 安装(Redhat)