Matlab学习笔记(1)—数据拟合
- 引言
- 多项式拟合
- polyfit使用讲解
- 使用举例
- 非线性拟合
- lsqcurvefit函数使用
- 使用举例
- 一个相关实验题
- 实验求解
- 求解结果
- 小结
引言
关于数据的拟合,matlab自带了许多使用便捷的函数,笔者此文主要讲解polyfit与lsqcurvefit两个函数的使用方法。
多项式拟合
多项式拟合的在matlab中常用polyfit来实现。
polyfit使用讲解
函数的使用方法主要为以下几种方式:
1、p = polyfit(x,y,n)
其中x、y为输入的需要拟合的数据,n:多项式需要拟合的最高阶数,p为最终的多项式的对应系数
2、[p,S] = polyfit(x,y,n)
S:拟合函数的误差和(残差)
3、y=polyval(p,x)
输出polyfit拟合函数在X出的函数值
使用举例
x=0:1:24;
y=[15,14,14,14,14,15,16,18,20,22,23,25,28,31,32,31,29,27,25,24,22,20,18,17,16];
p = polyfit(x,y,4)
y2=polyval(p,x);
plot(x,y,x,y2,x,y,'o')
legend('原曲线','拟合效果')
[p,S] = polyfit(x,y,4)
输出结果:
P=
0.0009 -0.0521 0.8658 -3.5257 16.6041
S=
R: [5×5 double]
df: 20
normr: 6.0236(残差)
非线性拟合
拟合数据,当函数类型已知,需要拟合出最优参数时,适合使用lsqcurvefi函数解决问题。
lsqcurvefit函数使用
函数的使用方法主要为以下几种方式:
1、X = lsqcurvefit(FUN,X0,XDATA,YDATA)
X:拟合出的最优参数值;FUN:拟合的参数;X0:起始点;Xdata、Ydata:拟合数据
2、 X = lsqcurvefit(FUN,X0,XDATA,YDATA,LB,UB)
LB:拟合参数范围的下限;UB:拟合参数范围的上限
3、 X = lsqcurvefit(FUN,X0,XDATA,YDATA,LB,UB,OPTIONS)
OPTION:拟合参数使用的优化算法
4、[X,RESNORM] = lsqcurvefit(FUN,X0,XDATA,YDATA,...)
RESNORM:残差平方和
5、 [X,RESNORM,RESIDUAL] = lsqcurvefit(FUN,X0,...)
RESIDUAL:残差和
使用举例
xdata = ...
[0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
[455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
fun=@(x,xdata)x(1)*exp(x(2)*xdata);
x0=[10,-2];
x=lsqcurvefit(fun,x0,xdata,ydata)
times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')
运行结果:
X=0.7500 -1.0000
一个相关实验题
实验求解
xdata=0:1:24
ydata=[15,14,14,14,14,15,16,18,20,22,23,25,28,31,32,31,29,27,25,24,22,20,18,17,16];
%进行2 3 4阶多项拟合与非线性拟合
f2=polyfit(xdata,ydata,2);
y2=polyval(f2,xdata);
disp('2阶拟合的误差平方和:')
norm((y2-ydata).^2,2)
f3=polyfit(xdata,ydata,3);
y3=polyval(f3,xdata);
disp('3阶拟合的误差平方和:')
norm((y3-ydata).^2,2)
f4=polyfit(xdata,ydata,4);
y4=polyval(f4,xdata);
disp('4阶拟合的误差平方和:')
norm((y4-ydata).^2,2)
fun=inline('c(1)*exp(-c(2)*(xdata-c(3)).^2)','c','xdata');
disp('概率曲线拟合的误差平方和:')
[x,resnorm]=lsqcurvefit(fun,[0,0,0],xdata,ydata);
resnorm
times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',xdata,y2,'r-',xdata,y3,'-',xdata,y4,times,fun(x,times),'b-')
legend('数据点','二阶拟合曲线','三阶拟合曲线','四阶拟合曲线','拟合概率曲线')
title('天气数据拟合效果对比图')
求解结果
2阶拟合的误差平方和:ans =72.9324
3阶拟合的误差平方和:ans = 33.2654
4阶拟合的误差平方和:ans =11.6926
概率曲线拟合的误差平方和:resnorm =749.9382
小结
笔者主要讲解的是Matlab相关函数的使用方法,与使用求解举例,但是函数的数学原理,仍大有研究之处,希望笔者以后再学习过程中,在熟悉Matlab的基础操作的同时,同时也掌握其大部分的数学原理。