插值是已知点都在函数曲线上,然后找到最接近的函数;
拟合是用一条函数曲线,尽可能多的接近所有已知点。
一、插值
指已知多个点的坐标,用函数进行拟合,从而预测其他未知点的函数值。
1、一维插值
用多项式作为插值函数:
注:不适合用高次多项式作为插值函数
范德蒙行列式法:
范德蒙行列式=vander(已知条件的自变量列矩阵)
多项式系数矩阵=范德蒙行列式\已知条件的因变量列矩阵
插值估计值=polyval(多项式系数矩阵,要求的插值点的自变量值)
范德蒙行列式:
例:
clc, clear
x0=[1:6]'; y0=[16, 18, 21, 17, 15, 12]';
A=vander(x0), p=A\y0
x=[1.5, 2.6];
yh=polyval(p,x) %求估计值
拉格朗日插值法 :
拉格朗日插值法函数:
function y=lagrange(x0,y0,x);
n=length(x0);m=length(x);
for i=1:m
z=x(i); s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
end
具体调用如下:
插值估计值=lagrange(已知条件的自变量列矩阵,已知条件的因变量列矩阵,要求的插值点的自变量值);
分段线性函数作为插值函数:
y2=interp1(x0,y0,x); %分段线性插值
三次样条插值作为插值函数(最准确):
有三种形式:
y3=interp1(x0,y0,x,'spline'); %三次样条插值
pp4=csape(x0,y0); %三次样条插值
y4=fnval(pp4,x); %得到插值后的估计值
yx5=griddedInterpolant(x0,y0,'spline') %三次样条插值
y5=yx5(x);%求插值估计值
得到以下结果:
sp =包含以下字段的 struct:
form: 'pp'
breaks: [0 0.4000 1 2 3.1416]
coefs: [4×4 double]
pieces: 4
order: 4
dim: 1
ans =-0.1627 0.0076 0.9965 0
-0.1627 -0.1876 0.9245 0.3894
0.0244 -0.4804 0.5238 0.8415
0.0244 -0.4071 -0.3637 0.9093
根据提供的结果,可以得到以下解释:
- `form: 'pp'` 表示插值的形式是 pp 形式。
- `breaks: [0 0.4000 1 2 3.1416]` 表示节点的位置,即插值区间的分割点。
- `coefs: [4×4 double]` 是一个大小为 4×4 的矩阵,其中包含了样条插值的系数。每一行代表一个插值段,每一列对应于插值段的一个系数。
- `pieces: 4` 表示插值区间被分割成了 4 个插值段。
- `order: 4` 表示插值所采用的多项式阶数为 4,即是三次样条插值。
- `dim: 1` 表示插值的维度为 1。
2、二维插值
用interp2函数
z=interp2(x0,y0,z0,x,y,'method')
用三次样条插值法
pp=csape({x0,y0},z0'); %双三次样条插值,注意这里z0要转置
z=fnval(pp,{x,y}); z=z'; %为了和z0的矩阵维数一致
这里x0,x为行向量,y0,y为列向量。
3、散乱数据插值
主要用于补充未知点,然后画出三维图。
1、ZI=griddatatx(x,y,z,XI,YI)
2、scatteredInterpolant(已知的插值点,Method,ExtrapolationMethod)
Fz=scatteredInterpolant(x0',y0',z0','natural','nearest')
[xi,yi]=meshgrid(xi,yi); %化成网格数据
zi=Fz(xi,yi);
mesh(xi,yi,zi)%画出网格图像
二、拟合
线性拟合
约束线性最小二乘解:
多项式拟合:
即可线性又可非线性拟合
fittype和fit函数(只能一元、二元函数)
fittype定义拟合函数类(可以直接调用库),fit用来拟合函数。
,例:
g=@(a,b,c,d,k,x)(a+b*x).*(x<k)+(c+d*x).*(x>=k); %定义匿名函数
%自变量放最后%分段函数的定义用法
g=fittype(g) %生成fittype类型的函数类
x=[0.81;0.91;0.13;0.91;0.63;0.098;0.28;0.55;0.96;0.96;0.16;0.97;0.96];
y=[0.17;0.12;0.16;0.0035;0.37;0.082;0.34;0.56;0.15;-0.046;0.17;-0.091;-0.071];
f=fit(x,y,g,'StartPoint',[1, 0, 1, 0, 0.5]) %函数拟合%startpoint从哪个点开始搜索
非线性拟合
lsqcurvefit函数(多元函数)
lsqcurvefit(匿名函数,初始拟合点,已知自变量,已知因变量,拟合下限,拟合上限,算法选择)
初始拟合点,拟合上下限均为行向量。