插值与拟合——拟合

一、拟合的引入

拟合:给定测量数据 (xi,yi), 要求构造函数y=φ(x),使得y=φ(x)在某种意义下到这些数据点的距离最小。
通常,假设φ(x)的函数结构已知,为了得到具体的函数表达式,只需要确定其中的某几个参数。
最小二乘拟合:在确定参数时,要求误差平方和最小,即
在这里插入图片描述

二、拟合函数的求解

最小二乘拟合问题

在科学研究和工程实践中,经常需要从一组实验(或观察)数据(xi,yi)中寻找因变量y和自变量x之间的函数关系y=f(x)。由于观测数据往往不够准确,因此并不要求y=f(x)经过所有的点(xi,yi),而只要求误差ei=f(xi)-yi 按照某种准则达到最小。通常,以
∑ i = 1 n \sum_{i=1}^n i=1n e i e_i ei2 = ∑ i = 1 n \sum_{i=1}^n i=1n[ f( x i x_i xi) - y i y_i yi ]2
作为误差的度量标准,这就是所谓的最小二乘法。

例题
在这里插入图片描述
可以看到,我们需要求得以上数据的拟合曲线,我们有两种方法可求。
方法一:
我们可以通过求解矛盾方程组
x i x_i xi2 c(1) + x i x_i xi c(2) + c(3) = y i y_i yi, (i = 1,…,6)
可写成A c =b的形式(类似于插值)
求解方程组的最小二乘解即可得到多项式拟合的系数c
方法二:
利用多项式拟合函数—polyfit

使用格式:a=polyfit(x,y,n)

功能:用n次多项式对给定的数据点进行最小二乘拟合。
参数说明:x,y 是给定的数据点的坐标向量,n是多项式的次数,a是多项式的系数向量(按降幂排列,长度为n+1)

代码如下:

x=[0.5:0.5:3]';
y=[1.75, 2.45, 3.81, 4.80, 8.00, 8.60]';

%% 方法一:通过求解矛盾方程组
% A=zeros(6,3);
% for i =1:6
%     A(i,1)=x(i)^2;
%     A(i,2)=x(i);
%     A(i,3)=1;
% end
% b=y;
% c=A\b;
%% 方法二:利用ployfit
c=polyfit(x,y,2);
%% 画多项式曲线
%方法一:用plot
%x0=0.5:0.05:3;
%y0=c(1)*x0.^2+c(2)*x0+c(3);
%plot(x0,y0,'b-',x0,y0,'r+');
%legend('拟合曲线','数据点','Location','NorthWest')
%方法二:用fplot
f=@(x)polyval(c,x);
fplot(f,[0.5, 3]);
hold on
plot(x,y,'r+');

拟合得到的曲线:
在这里插入图片描述
在这里插入图片描述
方法和上面的例题是类似的,就不多说了
方法一:

x=[19 25 31 38 44]';
y=[19.0 32.3 49.0 73.3 98.8]';

%构造系数矩阵
% A=zeros(5, 2);
% for i = 1:5
%     A(i, 1)=1;
%     A(i, 2)=x(i)^2;
% end
%或者
A=[ones(5,1), x.^2];
 b=y;
 c=A\b;
 a=c(1);
 b=c(2);
 
 %画拟合曲线
 f=@(x)a+b*x.^2;
fplot(f,[19, 44]);
hold on
plot(x, y ,'r+');

e=f(x)-y;
MSE=mean(e.^2)
MAE=mean(abs(e))

方法二:

x=[19 25 31 38 44]';
X=x.^2;
y=[19.0 32.3 49.0 73.3 98.8]';

%用y=a+b*x^2 对数据点进行最小二乘法拟合
%令X=x^2
%则 y=a+b*X

c=polyfit(X, y, 1);
%y=c(1)*X+c(2)
a=c(2);
b=c(1);

%画拟合曲线
 f=@(x)a+b*x.^2;
fplot(f,[19, 44]);
hold on
plot(x, y ,'r+');

两种方法拟合的曲线是类似的,拟合的效果也比较好
在这里插入图片描述

扫描二维码关注公众号,回复: 14781819 查看本文章

三、一般的非线性最小二乘拟合

某些非线性最小二乘问题可以转化为线性最小二乘问题进行求解

例如

x=[-5 -4 -3 -2 -1 0 1 2 3 4 5];
y=[0.11 0.34 0.73 1.27 1.81 2.00 1.79 1.30 0.73 0.35 0.14];
用y=a*exp(-x2/b2)

x=[-5  -4  -3 -2 -1 0 1 2 3 4 5];
y=[0.11    0.34    0.73   1.27  1.81    2.00    1.79    1.30    0.73    0.35  0.14];
figure
plot(x,y,'r+'); %在图一中画出数据点的分布

%y=a*exp(-x^2/b^2)
%log(y)=a-x^2/b^2
%令X=x^2, Y=log(y)
%则,Y=c(1)*X+c(2),
%其中,c(1)=-1/b^2, c(2)=log(a)
X=x.^2;
Y=log(y);
figure(2)
plot(X,Y,'m+');  %图二中画出X,Y的分布

c=polyfit(X,Y,1);
a=exp(c(2));
bb=-1/c(1);
b=sqrt(bb);

figure(1)
hold on
f=@(x)a*exp(-x.^2/b^2); %拟合得到的曲线
fplot(f,[-5, 5]);

得到的图像如下图
在这里插入图片描述
在这里插入图片描述

对于那些不可转化为线性最小二乘问题进行求解的情况
可使用函数进行求解——lsqnonlin和lsqcurvefit

lsqnonlin
用于求解非线性最小二乘问题
sum {FUN(a).^2}
其中, a为待求的参数(向量), FUN(a) 为残差向量。
使用格式:
a) a= LSQNONLIN(FUN,a0);
b) a = LSQNONLIN(FUN,a0,LB,UB);

lsqcurvefit
用于求解非线性最小二乘拟合问题
sum {[FUN(a,xdata)-ydata].^2}
其中, a为待求的参数(向量),xdata和ydata为要拟合的数据点(自变量 x和因变量y的观测值),FUN(a,x) 为给定参数a和自变量x时,根据拟合公式计算因变量y的值的函数。
使用格式:
1)X = LSQCURVEFIT(FUN,X0,XDATA,YDATA)
2)X = LSQCURVEFIT(FUN,X0,XDATA,YDATA,LB,UB)

对了,还有一个函数 fit

常用格式:
FO = fit(X,Y,fittype)
FO = fit(X,Y,fittype, ‘StartPoint’, P0 )
功能: 用fittype指定的模型对数据X,Y进行曲线或曲面拟合,得到的是一个fit对象。
X必须是含1列(曲线拟合)或2列(曲面拟合)的矩阵,Y必须是列向量,X和Y的行数要相同 。P0是待求参数的初值(向量)。
Fittype用于指定拟合函数的类型或形式。

直接看例题吧
在这里插入图片描述

%产生数据点
x0=0:0.2:4;
y0=3*exp(-0.4*x0)+12*exp(-3.2*x0);
y0=y+randn(size(y0))*0.3;
figure(1)
plot(x0,y0,'r+');
hold on
%对这些数据点用y=a*exp(b*x)+c*exp(d*x)
%进行最小二乘拟合

%% 方法一.利用lsqnonlin
%首先定义计算在各个数据点处误差构成的向量
err_fun = @(c) c(1)*exp(c(2)*x0) + c(3)*exp(c(4)*x0)-y0;
c0=[2.5 0 0 0];
c=lsqnonlin( err_fun, c0);

f=@(x) c(1)*exp(c(2)*x) + c(3)*exp(c(4)*x);
fplot(f,[0, 10])

e=err_fun(c);
MSE=mean(e.^2)

%% 方法二. 用lsqcurvefit
fun=@(c, x) c(1)*exp(c(2)*x) + c(3)*exp(c(4)*x);
c0=[2.5 0 0 0];
c=lsqcurvefit( fun, c0, x0, y0);

figure(2)
plot(x0, y0, 'r+');
hold on
f=@(x) fun(c, x);
fplot(f, [0, 4])

%% 方法三. 利用fit
f_type=fittype('a*exp(b*x)+c*exp(d*x)',...
    'independent', 'x', ...
    'coefficients', {
    
    'a', 'b', 'c', 'd'} );

fo=fit(x0', y0', f_type, 'StartPoint',[2,0,0,0]);

figure(3)
fun=@(x)f(x)
fplot(fun,[0,4])
hold on
plot(x0, y0,'r+')


三种方法求得的图像:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、最最最简单的拟合方法

看过上面的例题和函数求解方法,我们惊讶的发现——这是什么东西,根本看不懂
然鹅,我们也会惊讶的发现,曲线的拟合是有捷径可走的。
在控制台输入cftool命令
或者点击 APP—Curve Fitting 就能进入Matlab中的曲线拟合工具
在这里插入图片描述
选择要拟合的x,y变量 ,并选定要拟合的函数类型就能直接进行拟合分析,肥肠银杏。

猜你喜欢

转载自blog.csdn.net/qq_49288154/article/details/122370239