Matlab学习笔记(1)—数据拟合

引言

关于数据的拟合,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的基础操作的同时,同时也掌握其大部分的数学原理。

发布了29 篇原创文章 · 获赞 36 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Zengmeng1998/article/details/104554582
今日推荐