MATLAB数据拟合(一)

来源:互联网 发布:国家规定加班工资算法 编辑:程序博客网 时间:2024/05/16 07:34

在网上看了其他人的博客,关于数据拟合也更为了解。


以下内容转载自飞扬的博客


MATLAB插值与拟合


 


§1曲线拟合


实例:温度曲线问题


气象部门观测到一天某些时刻的温度变化数据为:


t

0

1

2

3

4

5

6

7

8

9

10

T

13

15

17

14

16

19

26

24

26

27

29


试描绘出温度变化曲线。


曲线拟合就是计算出两组数据之间的一种函数关系,由此可描绘其变化曲线及估计非采集数据对应的变量信息。


曲线拟合有多种方式,下面是一元函数采用最小二乘法对给定数据进行多项式曲线拟合,最后给出拟合的多项式系数。


1.线性拟合函数:regress()


调用格式:  b=regress(y,X)


                     [b,bint,r,rint,stats]= regress(y,X)


                     [b,bint,r,rint,stats]= regress(y,X,alpha)


说明:b=regress(y,X)返回X与y的最小二乘拟合值,及线性模型的参数值β、ε。该函数求解线性模型:


y=Xβ+ε


β是p´1的参数向量;ε是服从标准正态分布的随机干扰的n´1的向量;y为n´1的向量;X为n´p矩阵。


bint返回β的95%的置信区间。r中为形状残差,rint中返回每一个残差的95%置信区间。Stats向量包含R2统计量、回归的F值和p值。


例1:设y的值为给定的x的线性函数加服从标准正态分布的随机干扰值得到。即y=10+x+ε ;求线性拟合方程系数。


程序: x=[ones(10,1) (1:10)'];


      y=x*[10;1]+normrnd(0,0.1,10,1);


      [b,bint]=regress(y,x,0.05)


结果:  x =


        1


        2


        3


        4


        5


        6


        7


        8


        9


       10


y =


   10.9567


   11.8334


   13.0125


   14.0288


   14.8854


   16.1191


   17.1189


   17.9962


   19.0327


   20.0175


b =


              9.9213


              1.0143


bint =


            9.7889   10.0537


            0.9930    1.0357


即回归方程为:y=9.9213+1.0143x


2.多项式曲线拟合函数:polyfit( )


调用格式:  p=polyfit(x,y,n)


                     [p,s]= polyfit(x,y,n)


说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。矩阵s用于生成预测值的误差估计。(见下一函数polyval)


例2:由离散数据


x

0

.1

.2

.3

.4

.5

.6

.7

.8

.9

1

y

.3

.5

1

1.4

1.6

1.9

.6

.4

.8

1.5

2


拟合出多项式。


程序:


             x=0:.1:1;


            y=[.3 .5 1 1.4 1.6 1.9 .6 .4 .8 1.5 2];


            n=3;


            p=polyfit(x,y,n)


            xi=linspace(0,1,100);


            z=polyval(p,xi); %多项式求值


            plot(x,y,'o',xi,z,'k:',x,y,'b')


            legend('原始数据','3阶曲线')


结果:


p =


   16.7832  -25.7459   10.9802   -0.0035


多项式为:16.7832x3-25.7459x2+10.9802x-0.0035


曲线拟合图形:


MATLAB插值与拟合 - 飞扬 Youth - 浇灌一处绿色的风景


如果是n=6,则如下图:


MATLAB插值与拟合(1)


 


也可由函数给出数据。


例3:x=1:20,y=x+3*sin(x)


程序:


       x=1:20;


       y=x+3*sin(x);


       p=polyfit(x,y,6)


       xi=linspace(1,20,100);


       z=polyval(p,xi);     %多项式求值函数


       plot(x,y,'o',xi,z,'k:',x,y,'b')


       legend('原始数据','6阶曲线')


结果:


p =


0.0000   -0.0021    0.0505   -0.5971    3.6472   -9.7295   11.3304


MATLAB插值与拟合 - 飞扬 Youth - 浇灌一处绿色的风景


 


再用10阶多项式拟合


      程序:x=1:20;


y=x+3*sin(x);


p=polyfit(x,y,10)


xi=linspace(1,20,100);


z=polyval(p,xi);


plot(x,y,'o',xi,z,'k:',x,y,'b')


legend('原始数据','10阶多项式')


结果:p =


  Columns 1 through 7


    0.0000   -0.0000    0.0004   -0.0114    0.1814   -1.8065   11.2360


  Columns 8 through 11


  -42.0861   88.5907  -92.8155   40.2671


MATLAB插值与拟合 - 飞扬 Youth - 浇灌一处绿色的风景


 


可用不同阶的多项式来拟合数据,但也不是阶数越高拟合的越好。


3.         多项式曲线求值函数:polyval( )


调用格式:  y=polyval(p,x)


                     [y,DELTA]=polyval(p,x,s)


说明:y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值。


[y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计Y DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则Y DELTA将至少包含50%的预测值。


(未完)


                                                        转自  飞扬youth  的博客  


0 0