今天开始做《MATLAB在数学建模中的应用》(卓金武)的学习笔记。博主的MATLAB是R2016a。

1.1 数据的读入和写出
1.1.1 Excel与MATLAB的交互(略)

1.1.2 记事本与MATLAB的交互

  1. 读取
    load(‘filename.***’)
    记事本中只有数据时,可以采用load,将数据以矩阵形式存储在filename的变量中。
    [A,B,C,……]=textread(‘filename’,‘format’,N)
    ABC为对每列数据要保存的变量名;format为读取格式;N为读取次数。
  2. 写入
    save file obj1 obj2…… 将各变量obj1 obj2……保存在file文件中(.mat格式) fid=fopen(‘out.txt’,‘wt’); fprintf(fid,‘format’,obj);
    将obj保存在out。txt中

1.2 多项式拟合

  1. polyfit(X,Y,N);多项式拟合,返回降幂排列的多项式系数。
    polyval(P,xi);计算多项式的值;
    X,Y为数据点,P是返回的系数。xi为要求计算的点的横坐标。
  2. 图形窗口拟合
    ①先画出数据点
    ②点击图形窗口的Tools-Basic Fitting,按图中设置。
x=[1,2,3,4,5,6,7,8,9];
y=[9,7,6,3,-1,2,5,7,20];
plot(x,y,'r*')

【MATLAB在数学建模中的应用】【一】-LMLPHP
【MATLAB在数学建模中的应用】【一】-LMLPHP
分别使用二阶,三阶对数据进行拟合,三阶多项式效果最好。

3.指定函数拟合

syms t
x=[0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];
y=[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02];
plot(x,y,'r*')

运行以上程序我们通过图像发现可以用函数
【MATLAB在数学建模中的应用】【一】-LMLPHP
进行拟合。

syms t
x=[0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];
y=[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02];
f=fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'});
cfun=fit(x,y,f)%显示拟合函数
xi=0:.1:20;
yi=cfun(xi);
plot(x,y,'r*',xi,yi,'b-')

fittype(‘自定义函数’,‘independent’,‘自变量’,‘coefficients’,{‘系数1’,’……’});
运行以上程序我们可以得出自定义函数的系数。

曲线拟合工具箱
在命令行窗口输入cftool可以打开Curve Fitting Tool

【MATLAB在数学建模中的应用】【一】-LMLPHP
1.3数据拟合应用实例
1.3.1 人口预测模型

T=1:1:30;
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];
%30年的人口数据
plot(T,Y,'r*')

运行如上程序。发现人口随时间的变化呈非线性过程,而且存在一个与横坐标轴平行的渐近线。于是我们用logistics曲线模型进行拟合。

logistics曲线的基本形式是
【MATLAB在数学建模中的应用】【一】-LMLPHP
用如下公式替换,可以转化为线性模型
【MATLAB在数学建模中的应用】【一】-LMLPHP

T=1:1:30;
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];
%30年的人口数据
for t=1:30
    x(t)=exp(-t);
    y(t)=1/Y(t);
end
c=zeros(30,1)+1;
X=[c,x'];
B=inv(X'*X)*X'*y'%回归系数B
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=28*U/Q%计算并输出F检验值
%回归模型的拟合值
for j=1:10
    Y(j)=1/(B(1,1)+B(2,1)*exp(-j));
end
plot(T,Y)%输出logistics曲线

08-11 21:40