数据拟合
1.拟合多项式。
载入文件randomData.mat,这个文件中包括x和y两个变量。编写脚本对其做第一、第二、第三、第四和第五次多项式拟合。仿照下图,用蓝色的点绘制x和y的散点图,然后在同一坐标系下,用不同颜色绘制多项式拟合曲线,并在合适的位置加入标注(xlabel,ylabel,legend)。要想达到比较好的拟合效果,你可能会用到(能够返回3个变量,详见help),以及与之相匹配的polyval(能够接收中心和缩放的变量)。最终图像应如下图所示:
本实验使用polyfit将x中的数据以 0 为进行中心化,并缩放为具有标准差 1,这可避免在拟合计算中出现病态的 Vandermonde 矩阵,绘图如下:
分析:使用带四个输入的polyval,根据缩放后的数据(x-mu(1))/mu(2)计算ScaledFit。
代码:
load randomData;
this=figure();
plot(x,y,'.k');
color=['b' 'c' 'g' 'y' 'r']; %颜色矩阵
hold on;
for i=1:5
[ScaledFit,~,mu]=polyfit(x,y,i);
plot(x,polyval(ScaledFit,x,[],mu),color(i)); %收缩后绘图
end
title('Polynomial fits to noisy data'); %属性
legend('Data','Order1','Order2','Order3','Order4','Order5')
xlabel('x')
hold off;
2.经济增长模型
增加生产、发展经济所依靠的主要因素有增加投资、增加劳动力以及技术革新等,在研究国民经济产值与这些因素的数量关系时,由于技术水平不像资金、劳动力那样容易定量化,作为初步的模型,可认为技术水平不变,只讨论产值和资金、劳动力之间的关系。在科学技术发展不快时,如资本主义经济发展的前期,这种模型是有意义的。
用Q,K,L分别表示产值、资金、劳动力,要寻求的数量关系Q(K,L)。经过简化假设与分析,在经济学中,推导出一个著名的Cobb-Douglas生产函数:
Q(K,L) = aKαLβ,0<α,β<1(*)
式中α,β,a要由经济统计数据确定。现有美国马萨诸塞州1900—1926年上述三个经济指数的统计数据,如下表,试用数据拟合的方法,求出式(*)中的参数α,β,a。
表1
t Q K L | t Q K L |
1900 1.05 1.04 1.05 1901 1.18 1.06 1.08 1902 1.29 1.16 1.18 1903 1.30 1.22 1.22 1904 1.30 1.27 1.17 1905 1.42 1.37 1.30 1906 1.50 1.44 1.39 1907 1.52 1.53 1.47 1908 1.46 1.57 1.31 1909 1.60 2.05 1.43 1910 1.69 2.51 1.58 1911 1.81 2.63 1.59 1912 1.93 2.74 1.66 1913 1.95 2.82 1.68 | 1914 2.01 3.24 1.65 1915 2.00 3.24 1.62 1916 2.09 3.61 1.86 1917 1.96 4.10 1.93 1918 2.20 4.36 1.96 1919 2.12 4.77 1.95 1920 2.16 4.75 1.90 1921 2.08 4.54 1.58 1922 2.24 4.54 1.67 1923 2.56 4.58 1.82 1924 2.34 4.58 1.60 1925 2.45 4.58 1.61 19262.58 4.54 1.64 |
提示:由于(*)式关于参数α,β,a是非线性的,因此,可以有两种方式进行拟合,一是直接使用MATLAB软件中的曲线或曲面拟合命令。另一个是将非线性函数转化成线性函数的形式,使用线性拟合。
本实验采用曲面拟合lsqcurvefit()命令求解,绘图如下:
另解:对待拟合函数两边同时取对数有lnQ=lna+α*lnK+β*lnL,转化为线性关系,以[lna;α;β]为待求系数向量,使用regress(lnQ',[ones lnK' lnL'])命令进行线性拟合,这里就不赘贴代码了。
代码:
带拟合函数:
function remat=linfunc(x,y)
remat=x(1)*(y(1,:).^x(2)).*(y(2,:).^x(3));
end
Q=[1.05 1.18 1.29 1.30 1.30 1.42 1.50 1.52 1.46 1.60 1.69 1.81 1.93 1.95 ...
2.01 2.00 2.09 1.96 2.20 2.12 2.16 2.08 2.24 2.56 2.34 2.45 2.58];
K=[1.04 1.06 1.06 1.22 1.27 1.37 1.44 1.53 1.57 2.05 2.51 2.63 2.74 2.82 3.24 ...
3.24 3.61 4.10 4.36 4.77 4.75 4.54 4.54 4.58 4.58 4.58 4.54];
L=[1.05 1.08 1.18 1.22 1.17 1.30 1.39 1.47 1.31 1.43 1.58 1.59 1.66 1.68 1.65 ...
1.62 1.86 1.93 1.96 1.95 1.90 1.58 1.67 1.82 1.60 1.61 1.64];
%数据打表
xishu=[0.1 0.1 0.2];
[X,Y]=lsqcurvefit('linfunc',xishu,[K;L],Q); %曲面拟合
fprintf('Q=a*K^alpha*L^bate')
a=X(1)
alpha=X(2)
bate=X(3) %输出解
lim=0:0.1:3;
[xlim,ylim]=meshgrid(lim,lim); %制作点阵进行三维绘图
Q=X(1)*(xlim.^X(2)).*(ylim.^X(3));
mesh(xlim,ylim,Q);
总结:
[1]了解最小二乘拟合的基本原理和方法;[2]掌握用MATLAB作最小二乘多项式拟合和曲线拟合的方法;
[3〕通过实例学习如何用拟合方法解决实际问题,注意与插值方法的区别。
[4]了解各种参数辨识的原理和方法;
[5]通过范例展现由机理分析确定模型结构,拟合方法辨识参数,误差分析等求解实际问题的过程;
通过该实验的学习,掌握几种基本的参数辨识方法,了解拟合的几种典型应用,观察不同方法得出的模型的准确程度,学习参数的误差分析,进一步了解数学建模过程。这对于学生深入理解数学概念,掌握数学的思维方法,熟悉处理大量的工程计算问题的方法具有十分重要的意义。