Программная аппроксимация

Функции MATLAB для полиномиальных моделей

Функции Two MATLAB® могут смоделировать ваши данные с полиномом.

Функции аппроксимации полиномом

Функция

Описание

polyfit

polyfit(x,y,n) находит коэффициенты полиномиального p(x) степени n, который соответствует данным y путем минимизации суммы квадратов отклонений данных из модели (подгонка наименьших квадратов).

polyval

polyval(p,x) возвращает значение полинома степени n, который был определен polyfit, оцененным в x.

Этот пример показывает, как моделировать данные с помощью полинома.

Измерьте количество y в нескольких значениях времени t.

t = [0 0.3 0.8 1.1 1.6 2.3];
y = [0.6 0.67 1.01 1.35 1.47 1.25];
plot(t,y,'o')
title('Plot of y Versus t')

Можно попытаться моделировать эти данные с помощью полиномиальной функции второй степени,

y=a2t2+a1t+a0.

Неизвестные коэффициенты, a0, a1, и a2, вычисляются путем минимизации суммы квадратов отклонений данных из модели (подгонка наименьших квадратов).

Используйте polyfit, чтобы найти полиномиальные коэффициенты.

p = polyfit(t,y,2)
p = 1×3

   -0.2942    1.0231    0.4981

MATLAB вычисляет полиномиальные коэффициенты в убывающих степенях.

Полиномиальная модель второй степени данных дана уравнением

y=-0.2942t2+1.0231t+0.4981.

Оцените полином в однородно расположенные с интервалами времена, t2. Затем отобразите на графике исходные данные и модель на том же графике.

t2 = 0:0.1:2.8;
y2 = polyval(p,t2);
figure
plot(t,y,'o',t2,y2)
title('Plot of Data (Points) and Model (Line)')

Оцените модель во временном векторе данных

y2 = polyval(p,t);

Вычислите невязки.

res = y - y2;

Постройте невязки.

figure, plot(t,res,'+')
title('Plot of the Residuals')

Заметьте, что подгонка второй степени примерно следует за основной формой данных, но не получает плавную кривую, на которой данные, кажется, лежат. В невязках, кажется, существует шаблон, который указывает, что различная сила модели необходима. Полином пятой степени (показанный затем) делает лучшее задание следующих колебания данных.

Повторите осуществление, на этот раз с помощью полинома пятой степени от polyfit.

p5 = polyfit(t,y,5)
p5 = 1×6

    0.7303   -3.5892    5.4281   -2.5175    0.5910    0.6000

Оцените полином в t2 и постройте подгонку сверху данных в новом окне рисунка.

y3 = polyval(p5,t2);   
figure
plot(t,y,'o',t2,y3)
title('Fifth-Degree Polynomial Fit')

Примечание

При попытке смоделировать физическую ситуацию, всегда важно рассмотреть, значима ли модель определенного порядка в вашей ситуации.

Линейная модель с неполиномиальными условиями

Этот пример показывает, как соответствовать данным линейной моделью, содержащей неполиномиальные условия.

Когда полиномиальная функция не производит удовлетворительную модель ваших данных, можно попытаться использовать линейную модель с неполиномиальными условиями. Например, рассмотрите следующую функцию, которая линейна в параметрах a0, a1, и a2, но нелинейный в t данные:

y=a0+a1e-t+a2te-t.

Можно вычислить неизвестные коэффициенты a0, a1, и a2 путем построения и решения набора одновременных уравнений и решения для параметров. Следующий синтаксис выполняет это путем формирования матрицы проекта, где каждый столбец представляет переменную, используемую, чтобы предсказать ответ (член в модели), и каждая строка соответствует одному наблюдению за теми переменными.

Введите t и y как вектор-столбцы.

t = [0 0.3 0.8 1.1 1.6 2.3]';
y = [0.6 0.67 1.01 1.35 1.47 1.25]';

Сформируйте матрицу проекта.

X = [ones(size(t))  exp(-t)  t.*exp(-t)];

Вычислите коэффициенты модели.

a = X\y
a = 3×1

    1.3983
   -0.8860
    0.3085

Поэтому моделью данных дают

y=1.3983-0.8860e-t+0.3085te-t.

Теперь оцените модель в расположенных с равными интервалами точках и постройте модель с исходными данными.

T = (0:0.1:2.5)';
Y = [ones(size(T))  exp(-T)  T.*exp(-T)]*a;
plot(T,Y,'-',t,y,'o'), grid on
title('Plot of Model and Original Data')

Множественная регрессия

Этот пример показывает, как использовать множественную регрессию для данных модели, которые являются функцией больше чем одной переменной прогноза.

Когда y является функцией больше чем одной переменной прогноза, матричные уравнения, которые выражают отношения среди переменных, должны быть расширены, чтобы хранить дополнительные данные. Это называется множественной регрессией.

Измерьте количество y для нескольких значений x1 и x2. Сохраните эти значения в векторах x1, x2 и y, соответственно.

x1 = [.2 .5 .6 .8 1.0 1.1]';
x2 = [.1 .3 .4 .9 1.1 1.4]';
y  = [.17 .26 .28 .23 .27 .24]';

Модель этих данных имеет вид

y=a0+a1x1+a2x2.

Множественная регрессия определяет неизвестные коэффициенты a0, a1, и a2 путем минимизации суммы квадратов отклонений данных из модели (подгонка наименьших квадратов).

Создайте и решите набор одновременных уравнений путем формирования матрицы проекта, X.

X = [ones(size(x1))  x1  x2];

Решите для параметров при помощи оператора наклонной черты влево.

a = X\y
a = 3×1

    0.1018
    0.4844
   -0.2847

Наименьшие квадраты соответствуют, модель данных

y=0.1018+0.4844x1-0.2847x2.

Чтобы подтвердить модель, найдите максимум абсолютного значения отклонения данных из модели.

Y = X*a;
MaxErr = max(abs(Y - y))
MaxErr = 0.0038

Это значение намного меньше, чем любое из значений данных, указывая, что эта модель точно следует за данными.

Программная аппроксимация

Этот пример показывает, как использовать функции MATLAB для:

Загрузите демонстрационные данные о переписи из census.mat, который содержит американские данные о населении с лет 1790 - 1990.

load census

Это добавляет следующие две переменные в рабочее пространство MATLAB.

  • cdate является вектор-столбцом, содержащим годы 1790 - 1990 с шагом 10.

  • pop является вектор-столбцом с американской численностью населения, соответствующей каждый год в cdate.

Отобразите данные на графике.

plot(cdate,pop,'ro')
title('U.S. Population from 1790 to 1990')

График показывает сильный шаблон, который указывает на высокую корреляцию между переменными.

Вычисление коэффициентов корреляции

В этом фрагменте примера вы определяете статистическую корреляцию между переменными cdate и pop, чтобы выровнять по ширине моделирование данных. Для получения дополнительной информации о коэффициентах корреляции, смотрите Линейную корреляцию.

Вычислите матрицу коэффициента корреляции.

corrcoef(cdate,pop)
ans = 2×2

    1.0000    0.9597
    0.9597    1.0000

Диагональные элементы матрицы представляют совершенную корреляцию каждой переменной с собой и равны 1. Недиагональные элементы очень близко к 1, указывая, что существует сильная статистическая корреляция между переменными cdate и pop.

Подбор кривой многочлену к данным

Этот фрагмент примера применяет polyfit и функции MATLAB polyval, чтобы смоделировать данные.

Вычислите подходящие параметры.

[p,ErrorEst] = polyfit(cdate,pop,2);

Оцените подгонку.

pop_fit = polyval(p,cdate,ErrorEst);

Отобразите на графике данные и подгонку.

plot(cdate,pop_fit,'-',cdate,pop,'+');
title('U.S. Population from 1790 to 1990')
legend('Polynomial Model','Data','Location','NorthWest');
xlabel('Census Year');
ylabel('Population (millions)');

График показывает, что квадратичная аппроксимация полиномом предоставляет хорошее приближение данным.

Вычислите невязки для этой подгонки.

res = pop - pop_fit;
figure, plot(cdate,res,'+')
title('Residuals for the Quadratic Polynomial Model')

Заметьте, что график невязок показывает шаблон, который указывает, что полиномиальная сила второй степени не подходит для моделирования этих данных.

Графическое изображение и вычисление доверительных границ

Доверительные границы являются доверительными интервалами для предсказанного ответа. Ширина интервала указывает на степень уверенности в соответствии.

Этот фрагмент примера применяет polyfit и polyval к выборочным данным census, чтобы произвести доверительные границы для полиномиальной модели второго порядка.

Следующий код использует интервал ±2Δ, который соответствует 95%-му доверительному интервалу для больших выборок.

Оцените подгонку и ошибочную оценку прогноза (дельта).

[pop_fit,delta] = polyval(p,cdate,ErrorEst);

Отобразите на графике данные, подгонку и доверительные границы.

plot(cdate,pop,'+',...
     cdate,pop_fit,'g-',...
     cdate,pop_fit+2*delta,'r:',...
     cdate,pop_fit-2*delta,'r:'); 
xlabel('Census Year');
ylabel('Population (millions)');
title('Quadratic Polynomial Fit with Confidence Bounds')
grid on

95%-й интервал указывает, что у вас есть 95%-й шанс, что новое наблюдение будет находиться в пределах границ.