Этот пример показывает, что экстраполяция данных с использованием многочленов даже скромной степени рискованна и ненадежна.
Этот пример старше MATLAB ®. Он начался как упражнение в компьютерных методов для математических вычислений, Форсайт, Малкольм и Молер, опубликованные Prentice-Hall в 1977.
Теперь MATLAB значительно облегчает изменение параметров и просмотр результатов, но основные математические принципы остаются неизменными.
Создайте и постройте два вектора с данными переписи США с 1910 по 2000 год.
% Time interval t = (1910:10:2000)'; % Population p = [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([1910 2020 0 400]); title('Population of the U.S. 1910-2000'); ylabel('Millions');

Что вы думаете о населении в 2010 году?
p
p = 10×1
91.9720
105.7110
123.2030
131.6690
150.6970
179.3230
203.2120
226.5050
249.6330
281.4220
Подгонка данных с полиномом в t и использовать его для экстраполяции населения в t = 2010. Получите коэффициенты в многочлене, решив линейную систему уравнений, включающую матрицу Вандермонда 11 на 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 для многочлена степени d подходит для данных p путем решения линейной системы уравнений, включающей последнее d+1 столбцы матрицы Вандермонде:
A(:,n-d:n)*c ~= p
Если d < 10, то существует больше уравнений, чем неизвестных, и решение наименьших квадратов является подходящим.
Если d == 10, то вы можете решить уравнения точно, и полином фактически интерполирует данные.
В любом случае для решения проблемы системы используйте оператор обратной косой черты. Коэффициенты для кубического вписывания:
c = A(:,n-3:n)\p
c = 4×1
-5.7042
27.9064
103.1528
155.1017
Теперь оцените полином на каждый год с 1910 по 2010 и постройте график результатов.
v = (1910: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([1910 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
