полисоответствие

Полиномиальное аппроксимирование кривыми

Синтаксис

p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
[p,S,mu] = polyfit(x,y,n)

Описание

пример

p = polyfit(x,y,n) возвращает коэффициенты для полиномиального p(x) степени n, который является лучшей подгонкой (в смысле наименьших квадратов) для данных в y. Коэффициенты в p находятся в убывающих степенях, и длиной p является n+1

p(x)=p1xn+p2xn1+...+pnx+pn+1.

[p,S] = polyfit(x,y,n) также возвращает структуру S, который может использоваться в качестве входа к polyval, чтобы получить ошибочные оценки.

пример

[p,S,mu] = polyfit(x,y,n) также возвращает mu, который является двухэлементным вектором с центрированием и масштабированием значений. mu(1) является mean(x), и mu(2) является std(x). Используя эти значения, polyfit сосредотачивает x в нуле и масштабирует его, чтобы иметь модульное стандартное отклонение,

x^=xx¯σx.

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

Примеры

свернуть все

Сгенерируйте 10 точек, равномерно распределенных вдоль синусоиды в интервале [0,4*pi].

x = linspace(0,4*pi,10);
y = sin(x);

Используйте polyfit, чтобы соответствовать полиному 7-й степени к точкам.

p = polyfit(x,y,7);

Оцените полином на более прекрасной сетке и постройте результаты.

x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1)
hold off

Создайте вектор 5 равномерно распределенных точек в интервале [0,1] и оцените y(x)=(1+x)-1 в тех точках.

x = linspace(0,1,5);
y = 1./(1+x);

Соответствуйте полиному степени 4 к 5 точкам. В целом, для точек n, можно соответствовать полиному степени n-1, чтобы точно пройти через точки.

p = polyfit(x,y,4);

Выполните исходную функцию и аппроксимацию полиномом на более прекрасной сетке точек между 0 и 2.

x1 = linspace(0,2);
y1 = 1./(1+x1);
f1 = polyval(p,x1);

Постройте значения функции и аппроксимацию полиномом в более широком интервале [0,2] с точками, используемыми, чтобы получить аппроксимацию полиномом, подсвеченную как круги. Аппроксимация полиномом хороша в исходном интервале [0,1], но быстро отличается от подходящей функции за пределами того интервала.

figure
plot(x,y,'o')
hold on
plot(x1,y1)
plot(x1,f1,'r--')
legend('y','y1','f1')

Сначала сгенерируйте вектор точек x, равномерно распределенных в интервале [0,2.5], и затем оцените erf(x) в тех точках.

x = (0:0.1:2.5)';
y = erf(x);

Определите коэффициенты полинома приближения степени 6.

p = polyfit(x,y,6)
p = 1×7

    0.0084   -0.0983    0.4217   -0.7435    0.1471    1.1064    0.0004

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

f = polyval(p,x);
T = table(x,y,f,y-f,'VariableNames',{'X','Y','Fit','FitError'})
T=26×4 table
     X        Y          Fit         FitError  
    ___    _______    __________    ___________

      0          0    0.00044117    -0.00044117
    0.1    0.11246       0.11185     0.00060836
    0.2     0.2227       0.22231     0.00039189
    0.3    0.32863       0.32872    -9.7429e-05
    0.4    0.42839        0.4288    -0.00040661
    0.5     0.5205       0.52093    -0.00042568
    0.6    0.60386       0.60408    -0.00022824
    0.7     0.6778       0.67775     4.6383e-05
    0.8     0.7421       0.74183     0.00026992
    0.9    0.79691       0.79654     0.00036515
      1     0.8427       0.84238      0.0003164
    1.1    0.88021       0.88005     0.00015948
    1.2    0.91031       0.91035    -3.9919e-05
    1.3    0.93401       0.93422      -0.000211
    1.4    0.95229       0.95258    -0.00029933
    1.5    0.96611       0.96639    -0.00028097
      ⋮

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

x1 = (0:0.1:5)';
y1 = erf(x1);
f1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1,'-')
plot(x1,f1,'r--')
axis([0  5  0  2])
hold off

Составьте таблицу данных о населении в течение лет 1750 - 2000 и постройте точки данных.

year = (1750:25:2000)';
pop = 1e6*[791 856 978 1050 1262 1544 1650 2532 6122 8170 11560]';
T = table(year, pop)
T=11×2 table
    year       pop   
    ____    _________

    1750     7.91e+08
    1775     8.56e+08
    1800     9.78e+08
    1825     1.05e+09
    1850    1.262e+09
    1875    1.544e+09
    1900     1.65e+09
    1925    2.532e+09
    1950    6.122e+09
    1975     8.17e+09
    2000    1.156e+10

plot(year,pop,'o')

Используйте polyfit с тремя выходными параметрами, чтобы соответствовать полиному 5-й степени, использующему центрирование и масштабирование, которое улучшает числовые свойства проблемы. polyfit сосредотачивает данные в year в 0 и масштабирует его, чтобы иметь стандартное отклонение 1, который избегает плохо обусловленной матрицы Вандермонда в подходящем вычислении.

[p,~,mu] = polyfit(T.year, T.pop, 5);

Используйте polyval с четырьмя входными параметрами, чтобы оценить p с масштабированными годами, (year-mu(1))/mu(2). Постройте результаты против исходных лет.

f = polyval(p,year,[],mu);
hold on
plot(year,f)
hold off

Соответствуйте простой модели линейной регрессии к набору дискретных точек 2D данных.

Создайте несколько векторов точек выборочных данных (x, y). Соответствуйте первому полиному степени к данным.

x = 1:50; 
y = -0.3*x + 2*randn(1,50); 
p = polyfit(x,y,1); 

Оцените подходящий полиномиальный p в точках в x. Постройте получившуюся модель линейной регрессии с данными.

f = polyval(p,x); 
plot(x,y,'o',x,f,'-') 
legend('data','linear fit') 

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

Создайте несколько векторов точек выборочных данных (x, y). Используйте polyfit, чтобы соответствовать первому полиному степени к данным. Задайте два выходных параметров, чтобы возвратить коэффициенты для линейной подгонки, а также структуры оценки погрешности.

x = 1:100; 
y = -0.3*x + 2*randn(1,100); 
[p,S] = polyfit(x,y,1); 

Оцените аппроксимацию полиномом первой степени в p в точках в x. Задайте структуру оценки погрешности как третий вход так, чтобы polyval вычислил оценку стандартной погрешности. Оценка стандартной погрешности возвращена в delta.

[y_fit,delta] = polyval(p,x,S);

Отобразите на графике исходные данные, линейную подгонку и 95%-й интервал прогноза y±2Δ.

plot(x,y,'bo')
hold on
plot(x,y_fit,'r-')
plot(x,y_fit+2*delta,'m--',x,y_fit-2*delta,'m--')
title('Linear Fit of Data with 95% Prediction Interval')
legend('Data','Linear Fit','95% Prediction Interval')

Входные параметры

свернуть все

Точки запроса, заданные как вектор. Точки в x соответствуют подходящим значениям функции, содержавшимся в y. Если x не является вектором, то polyfit преобразовывает его в вектор-столбец x(:).

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

Типы данных: single | double
Поддержка комплексного числа: Да

Подходящие значения в точках запроса, заданных как вектор. Значения в y соответствуют точкам запроса, содержавшимся в x. Если y не является вектором, то polyfit преобразовывает его в вектор-столбец y(:).

Типы данных: single | double
Поддержка комплексного числа: Да

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

Выходные аргументы

свернуть все

Подходящие полиномиальные коэффициенты наименьших квадратов, возвращенные как вектор. p имеет длину n+1 и содержит полиномиальные коэффициенты в убывающих степенях с самой высокой степенью, являющейся n. Если или x или y содержат значения NaN и n < length(x), то всеми элементами в p является NaN.

Используйте polyval, чтобы оценить p в точках запроса.

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

Поле Описание
RТреугольный фактор от разложения QR матрицы Вандермонда x
dfСтепени свободы
normrНорма невязок

Если данные в y случайны, то оценкой ковариационной матрицы p является (Rinv*Rinv')*normr^2/df, где Rinv является инверсией R.

Если ошибки в данных в y независимы и нормальны с постоянным отклонением, то [y,delta] = polyval(...) производит ошибочные границы, которые содержат по крайней мере 50% прогнозов. Таким образом, y ± delta содержит по крайней мере 50% прогнозов будущих наблюдений в x.

Центрирование и масштабирование значений, возвращенных как двухэлементный вектор. mu(1) является mean(x), и mu(2) является std(x). Эти значения сосредотачивают точки запроса в x в нуле с модульным стандартным отклонением.

Используйте mu в качестве четвертого входа к polyval, чтобы оценить p в масштабированных точках, (x - mu(1))/mu(2).

Ограничения

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

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

Алгоритмы

polyfit использует x, чтобы сформировать матричный V Вандермонда со столбцами n+1 и строками m = length(x), приводящими к линейной системе

(x1nx1n11x2nx2n11xmnxmn11)(p1p2pn+1)=(y1y2ym),

который polyfit решает с p = V\y. Поскольку столбцы в матрице Вандермонда являются степенями векторного x, количество условия V является часто большим для старших подгонок, приводящих к сингулярной матрице коэффициентов. В тех случаях центрирование и масштабирование могут улучшить числовые свойства системы произвести более надежную подгонку.

Расширенные возможности

Представлено до R2006a