• Home
  • About
    • shawvey photo

      shawvey

      在写bug比赛中荣获第一名🐛

    • Learn More
    • Email
    • Twitter
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Notes

数据建模常规方法的MATLAB实现

22 Jan 2018

Reading time ~4 minutes

本文目录🧾

  • 一、数据拟合
  • 二、人口预测模型
  • 三、薄膜渗透率的测定
  • 四、mesh、meshgrid、surf的用法
  • 五、地形地貌图形的绘制
  • 六、MATLAB循环语句
  • 七、MATLAB取整函数

正文部分📝

一、数据拟合



polyfit 多项式拟合,并且返回多项式各项系数,即P获得拟合函数的各项系数。
polyval 计算多项式的值。



fittype是自定义拟合函数,就是xy函数根据这个自定义的函数来拟合。
cfun()是利用自定义的函数来拟合出数据x,y,根据所给出的x来得到y。

二、人口预测模型

y=[33815 33981 34004 34165 34212 34327 34344 34458 34498 34476 34483 34488 34513 34497 34511 34520 34507 34509 34521 34513 34515 34517 34519 34519 34521 34521 34523 34525 34525 34527];
  % T=年份-起始年份
  T=1:30;
  %对数据作线性处理
  for i=1:30,
      x(i)=exp(-i);
      Y(i)=1/y(i);
  end
  
  %计算回归系数b
  c=zeros(30,1)+1;
  X=[c,x'];
  b=inv(X'*X)*X'*Y'
  
  for i=1:30,
      %计算拟合值
      z(i)=b(1,1)+b(2,1)*x(i);
      %计算离差
      s(i)=Y(i)-sum(Y)/30;
      %计算误差
      w(i)=z(i)-Y(i);
  end
  
  %计算离差平方和
  S=s*s';
  %计算回归误差平方和
  Q=w*w';
  %计算回归平方和
   U=S-Q;
   %计算并输出F检验值
   F=28*U/Q
   %计算非线性回归模型的拟合值
   for j=1:30,
       p(j)=1/(b(1,1)+b(2,1)*exp(-j));
   end
   %输出非线性回归模型的拟合曲线
   plot(T,y)
   hold on
   plot(T,p,'r-');


x’代表x的转置,inv(x)代表x的逆矩阵,即inv(x)*x=E。
c=zeros(30,1)+1 这里是因为a相乘的数为1,所以设置为全1,以便一起计算下面的B。
B=inv(X’X)X’*Y’ 获得方程的所有系数,此处是y=a+bx,所以b中得到ab的值。
求F检验值是有公式的,上面是根据公式在求解。
hold on的作用是在原来的图形之上再画一幅图。

三、薄膜渗透率的测定




linspace是指将100-1000分为均匀10个点。
lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options),其中x0为初始解向量;xdata,ydata为满足关系ydata=F(x, xdata)的数据;lb、ub为解向量的下界和上界lb≤x≤ub,若没有指定界,则lb=[ ],ub=[ ];options为指定的优化参数;

四、mesh、meshgrid、surf的用法

[x,y]=meshgrid(-2:0.2:2,-2:0.2:2);
z=x.*exp(-x.^2-y.^2);
surf(x,y,z)

meshgrid作用是生成网格矩阵。
surf绘制的是三维着色曲面图:

mesh绘制的是由一排排彩色曲线组成的网格图:

五、地形地貌图形的绘制

[x,y]=meshgrid(1:10);
h=[0,0.02,-0.12,0,-2.09,0,-0.58,-0.08,0,0;...
0.02,0,0,-2.38,0,-4.96,0,0,0,-0.1;...
0,0.1,1,0,-3.04,0,-0.53,0,0.1,0;...
0,0,0,3.52,0,0,0,0,0,0;...
-0.43,-1.98,0,0,0,0.77,0,2.17,0,0;...
0,-2.29,0,0.69,0,0,2.59,0,0.3,0;...
-0.09,-0.31,0,0,0,4.27,0,0,0,-0.01;...
0,0,5.13,7.4,0,1.89,0,0,0.04,0;...
0.1,0,0.58,0,0,1.75,0,-0.11,0,0;...
0,-0.01,0,0,0.3,0,0,0,0,0.01];
[xi,yi]=meshgrid(1:0.1:10);
hi=interp2(x,y,h,xi,yi,'spline');
surf(hi);
xlabel('x'),ylabel('y'),zlabel('h');


interp2是插值函数,在interp2(x,y,h,xi,yi,’spline’)中,x,y是原始数据坐标,h是坐标对应的值,xi,yi是插值的坐标,在x,y范围里,超过x,y范围外则为nan。此处hi有100*100个坐标,在[1,10]内,即在x,y里。surf画的坐标是xi,yi以及得到的插值。
插值算法有以下四种:

  • ‘linear’:双线性插值算法(缺省算法)
  • ‘nearest’:最临近插值
  • ‘spline’:三次样条插值
  • ‘cubic’:双三次插值

六、MATLAB循环语句



七、MATLAB取整函数

fix 向零方向取整
round 向最近的方向取整(四舍五入)
floor 向负无穷大方向取整(向地板取值,即向下)
ceil 向正无穷大方向取整(向天花板取值,即向上)



matlab Share Tweet +1