线性和非线性拟合

线性拟合

一阶拟合:$y=a_1x+a_2$,这就是线性拟合了。

二阶拟合:$y=a_1x^2+a_2x+a_3​$,这就不是线性拟合了。

polyfit

a=polyfit(x,y,n)

  • 最小二乘法计算拟合多项式系数
  • x,y为拟合数据向量
  • n为拟合多项式次数
  • 通过a保存多项式系数,从最高次向最低次排列

polyval

y=polyval(a,x)

  • 计算多项式的函数值
  • 返回在x处多项式的值
  • a为多项式系数,元素按多项式降幂排序

代码

1
2
3
4
5
6
7
8
% 求拟合多项式系数,即a
x = [1.0 1.5 2.0 2.5 3.0]';
y = [0.9 1.7 2.2 2.6 3.0]';
a = polyfit(x,y,1) % 1指一阶拟合,也就是指多项式次数
% 求拟合结果
xi = 1 : 0.1 : 3;
yi = polyval(a, xi); % 求多项式的函数值
plot(x,y,'o',xi,yi); % 作图对比原数据和拟合结果

结果

线性拟合.png

图中点是原始数据,线是拟合结果,线有点点弯。

指定形式拟合

fittype

定义拟合形式

fit

根据数据向量,按照某种拟合形式拟合。

代码

1
2
3
4
5
x = [1.0 1.5 2.0 2.5 3.0]';
y = [0.9 1.7 2.2 2.6 3.0]';
p = fittype('a*x+b*sin(x)+c'); % 定义拟合形式
f = fit(x,y,p) % 向量x,y按照p的形式拟合
plot(f,x,y); % 作图对比拟合结果

结果

指定形式拟合.png

图中代码没有定义x,y也可以运行,是因为工作区中已经有这两个变量了。

作者:@臭咸鱼

本文为作者原创,转载请注明出处:https://chouxianyu.github.io

欢迎讨论和交流!