Chcę dopasować wielomian do hałaśliwych danych, tak aby przybliżony wielomian był zawsze> = oryginalne dane. Na przykład:Dopasowywanie wielomianu do maksimum funkcji
x = linspace (-2, 6);
y = (x-2).^2 + 1 + 2 * randn (size (x));
function ret = delta (P, x, y)
yP = polyval (P, x);
d = yP - y;
d (d < 0) *= 1000;
ret = sumsq (d);
endfunction
P0 = polyfit (x, y, 2);
f = @(P) delta (P, x, y);
[P, FVAL] = sqp (P0, f)
xi = linspace (min(x), max(x), 100);
yi = polyval (P, xi);
plot(x, y, xi, yi);
grid on
Czy istnieje lepszy sposób/metoda, która również pracuje z wyższymi wielomianów porządku?
Sposób easies byłoby po prostu użyć polyfit a następnie obliczyć max(y-yi)
i dodać to jako przesunięcie, ale nie byłoby to optymalne ...
EDIT: Chcę używać GNU Octave, ale dodał „Matlab” jako tag, ponieważ język i funkcje są podobne.
EDIT: na podstawie odpowiedzi TVO i danych rzeczywistych:
x = [10 20 30 40 50 60 80 100];
y = [0.2372, 0.1312, 0.0936, 0.0805, 0.0614, 0.0512, 0.0554, 0.1407];
function ret = delta (P, x, y)
ret = sumsq (polyval (P, x) - y);
endfunction
f = @(P) delta (P, x, y);
h = @(P) polyval(P, x) - y;
P0 = polyfit (x, y, 3);
[P] = sqp (P0, f, [], h)
xi = linspace (min(x), max(x));
yi = polyval (P0, xi);
yio = polyval (P, xi);
plot(x, y, xi, yi, ";initial guess;", xi, yio, ";optimized;");
grid on
ale jak widać, zoptymalizowany i oceniane poli posiada punkty < punktowych orginal co jest niedozwolone.
Czy próbowałeś dopasować linię do wszystkich punktów danych, a następnie szukasz tych z najwyższym błędem? – Crowley
Domyślam się, czego szukasz: fmincon: zminimalizuj normę (np. 2-normę) jako FUN z ograniczeniem (liniowym) (sformułowanym jako macierz A wielkości wielomianu pożądanego * liczba punktów) i twoją obserwacją wartości jako B Z pomocy matlab: X = fmincon (FUN, X0, A, B) zaczyna się od X0 i znajduje minimum X w funkcji FUN, z zastrzeżeniem nierówności liniowych A * X <= B. ZABAWA akceptuje wejście X i zwraca wartość funkcji skalarnej F obliczoną na X. X0 może być skalar, wektor lub macierz. –
@AlexanderKemp: Wygląda obiecująco, ale chcę użyć GNU Octave i fmincon najwyraźniej nie jest jeszcze zaimplementowany. – Andy