Подгонка полиномиальных данных особым образом в MATLAB - PullRequest
0 голосов
/ 01 марта 2012

У меня есть некоторые данные, скажем, следующий вектор:

[1,2 2,13 3,45 4,59 4,79]

И я хочу получить полиномиальную функцию, скажем f, чтобы соответствовать этим данным. Таким образом, я хочу пойти с чем-то вроде polyfit. Однако polyfit сводит к минимуму сумму ошибок наименьших квадратов. Но я хочу иметь

F (1) = 1,2 F (2) = 2.13 F (3) = 3,45 F (4) = 4,59 е (5) = 4,79

То есть я хочу манипулировать алгоритмом подбора, чтобы он давал мне точные точки, которые я уже дал, а также некоторые подогнанные значения, где точные значения не приведены. Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 02 марта 2012

Я думаю, что все упускают суть.Вы сказали, что «То есть, я хочу манипулировать алгоритмом подбора, чтобы я давал мне точные точки, а также некоторые подгонянные значения, где точных подгонок нет. Как я могу это сделать?»

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

Вы МОЖЕТЕ сделать это, используя LSQLIN, установивнабор ограничений на равенство для точек, которые должны быть точно подогнаны, а затем позволить остальным точкам соответствовать в смысле наименьших квадратов.

Проблема в том, что для этого потребуется многочлен высокого порядка.Чтобы точно соответствовать 5 точкам плюс некоторые другие, порядок многочлена будет немного выше.А многочлены высокого порядка, особенно те, которые имеют ограниченные точки, будут делать неприятные вещи.Но не стесняйтесь делать то, что вы будете, до тех пор, пока вы ожидаете плохой результат.

Редактировать: я должен добавить, что лучше выбрать сплайн наименьших квадратов, который вы МОЖЕТЕ ограничитьпроходить через заданный набор точек, подбирая другие точки в смысле наименьших квадратов, и в результате все равно не делать что-то дикое и безумное.

0 голосов
/ 01 марта 2012

То, что вы спрашиваете, называется интерполяция Лагранжа .Существует обмен файлами MATLAB.http://www.mathworks.com/matlabcentral/fileexchange/899-lagrange-polynomial-interpolation
Однако вы должны отметить, что полиномиальная аппроксимация по методу наименьших квадратов обычно предпочтительнее интерполяции Лагранжа, поскольку в данных, которые у вас есть, в принципе будет шум, а интерполяция Лагранжа будет соответствовать шуму так же, как и вашим данным.Так что, если вы знаете, что ваши данные на самом деле представляют собой многомерный многочлен M и имеют N данных, где N >> M, то у вас будет многочлен порядка N с Лагранжем.

0 голосов
/ 01 марта 2012

У вас есть варианты.

  1. Используйте полифит, просто дайте ему достаточно свободного времени для точного соответствия.То есть:

    values = [1.2 2.13 3.45 4.59 4.79];
    p = polyfit(1:length(values), values, length(values)-1);
    

    Сейчас

    polyval(p,2)  %returns 2.13
    
  2. Использовать интерполяцию / экстраполяцию

    values = [1.2 2.13 3.45 4.59 4.79];
    xInterp = 0:0.1:6;
    valueInterp = interp1(1:length(values), values, xInterp ,'linear','extrap');
    

    Интерполяция предоставляет множество вариантов сглаживания,Например, попробуйте:

    valueInterp = interp1(1:length(values), values, xInterp ,'spline','extrap');
    
0 голосов
/ 01 марта 2012

Polyfit делает то, что вы хотите.Полином N-1 степени может в точности соответствовать N точкам, таким образом, когда он минимизирует сумму квадратов ошибок, он получает 0 (что вам нужно).через все ваши очки.

...