在號令窗口,輸入如下:
% 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');
按“Enter”鍵。
得如下圖1所示。
您對2010年的生齒有何猜想?
輸入如下號令:
p
按“Enter”鍵。
得如下圖2所示。
讓我們用t中的多項式擬合數據并將其外推到t =2010。多項式中的系數是經由過程求解包含11 x 11 Vandermonde矩陣的線性方程組而獲得的,該矩陣的元素是標度時候的冪 ,A(i,j)= s(i)^(nj);
程序如下:
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
擬合數據p的度為d的多項式的系數c是經由過程求解線性方程組而獲得的,該線性方程組涉及Vandermonde矩陣的最后d + 1列: A(:,n-d:n)* c?= p
若是d小于10,則方程式多于未知數,而且最小二乘法是合適的。 若是d等于10,則方程可以切確求解,而且多項式現實上是對數據進行插值的。 無論哪種環境,都可以利用MATLAB的反斜杠運算符來解決該系統。 這是三次擬合的系數。
輸入如下程序:
c = A(:,n-3:n)\p
按“Enter”鍵。
得如圖3所示。
此刻,我們評估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
按“Enter”鍵。
如圖4所示。
比力三次擬合和四次擬合。 請注重,外推點很是分歧。
程序如下:
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
按“Enter”鍵。
如圖5所示。
跟著度數的增添,外推變得加倍不不變。
程序如下:
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
按“Enter”鍵。
如圖6所示。
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!