这个例子表明,即使用适度的多项式来预测数据,也能预测未来。
这个例子比MATLAB更老。它开始作为一个练习( 计算机方法,通过数学计算 )福赛斯,马尔科姆和摩尔,由Prentice Hall出版在1977。
现在,MATLAB使改变参数和看到结果变得容易得多,但是基本的数学原理是不变的。
以下是1900至2000年间的美国人口普查数据。
% Time interval t = (1900:10:2000)'; % Population p = [75.995 91.972 105.711 123.203 131.669 ... 150.697 179.323 203.212 226.505 249.633 281.422]'; % Plot plot(t,p,'bo'); axis([1900 2020 0 400]); title('Population of the U.S. 1900-2000'); ylabel('Millions');
你对2010的人口有什么看法?
p
p = 75.9950 91.9720 105.7110 123.2030 131.6690 150.6970 179.3230 203.2120 226.5050 249.6330
让我们用t中的多项式拟合数据,并用它外推到t=2010。通过求解一个线性涉及11-by-11范德蒙矩阵方程组得到的多项式的系数,它的元素是缩放的时间的力量,A(i,j) = s(i)^(n-j);
n = length(t); s = (t-1950)/50; A = zeros(n); A(:,end) = 1; for j = n-1:-1:1 A(:,j) = s .* A(:,j+1); end
系数C一次多项式拟合数据的P D是通过求解一个线性涉及过去的D + 1列的Vandermonde matrix方程组:
A(:,n-d:n)*c ~= p
如果D小于10,有比未知数和方程的最小二乘解更合适。如果D等于10,方程可以精确求解,多项式插值数据实际上。在任何情况下,该系统是用MATLAB的反斜杠算子解决。这里有三次拟合系数。
c = A(:,n-3:n)\p
c = 1.2629 23.7261 100.3659 155.9043
现在我们每年从1900到2010计算多项式,并绘制结果。
v = (1900:2020)'; x = (v-1950)/50; w = (2010-1950)/50; y = polyval(c,x); z = polyval(c,w); hold on plot(v,y,'k-'); plot(2010,z,'ks'); text(2010,z+15,num2str(z)); hold off
四次拟合与四次拟合的比较。请注意,外推点是非常不同的。
c = A(:,n-4:n)\p; y = polyval(c,x); z = polyval(c,w); hold on plot(v,y,'k-'); plot(2010,z,'ks'); text(2010,z-15,num2str(z)); hold off
随着度数的增加,外推变得更加不稳定。
cla plot(t,p,'bo') hold on axis([1900 2020 0 400]) colors = hsv(8); labels = {'data'}; for d = 1:8 [Q,R] = qr(A(:,n-d:n)); R = R(1:d+1,:); Q = Q(:,1:d+1); c = R\(Q'*p); % Same as c = A(:,n-d:n)\p; y = polyval(c,x); z = polyval(c,11); plot(v,y,'color',colors(d,:)); labels{end+1} = ['degree = ' int2str(d)]; end legend(labels, 'Location', 'NorthWest') hold off
《MATLAB教学(六)函数拟合与未来预测》有1个想法
Pingback 引用通告: MATLAB基础教学 | Hannes的站点