2015-11-08 4 views
0

Учитывая набор точек x и набор значений y, я пытаюсь вычислить многочлен, который наилучшим образом соответствует P(x) = y в наименьшем квадратичном смысле. Функция должна отображать матрицу Вандермонда, а выходной многочлен c должен быть нанесен как функция в виде p (x) = c0 * x^0 + c1 * x^1 + c2 * x^2 + ..... + сп-1^(п-1).Полиномиальная регрессия и построение графика в Matlab

Я хотел бы видеть точки (xi, yi) на том же участке, где функция построена.

Вот что я пытался до сих пор:

function c = interpolation(x, y) 
    n = length(x); 
    V = ones(n); 
    for j = n:-1:2 
     V(:,j-1) = x.*V(:,j); 
    end 
    c = V \ y; 
    disp(V) 
    for i = 0:n-1 
     fprintf('c%d= %.3f\n', i, c(i+1)); 
    end 

    x = linspace(-1,2,-100); 
    y = polyval(c,x); 

    x0 = x; 
    y0 = polyval(c,x0); 

    plot(x,y,'b-') 
    hold on; 
    plot(x0,y0,'ro') 
    hold off; 
+1

Это неясно. Что такое «настоящая кривая» здесь? –

+0

«реальная» кривая Я имею в виду кривую, которая действительно представляет этот полином: -2 * x^0 + 9 * x^1 + 9 * x^2 - 7 * x^3. Полином определяется коэффициентами c, являющимися выходом функции, которые вычисляются в строке 7. Участок, который мы видим, представляет собой просто график 5 точек, связанных прямыми. точки (xi, yi) - вход в начале (-1,5) (0, -2) (1,9) и (2, -4). Мы передали их как 2 вектора в начале x и y. – ZelelB

+2

Ну, вы только замышляете ввод. Поэтому не удивляйтесь, что вы видите только вход! –

ответ

1

Вы хотите взглянуть на polyval и linspace, если вы уже не знаете его. Также взгляните на polyfit, что делает интерполяцию для вас с заданной степенью. Вот ваш исправленный код:

function [p,V] = interpolation(x0,y0,N) 

    % format the inputs as columns 
    x0 = x0(:); 
    y0 = y0(:); 

    % Build up the vandermonde matrix 
    n = numel(x0); 
    disp('Vandermonde matrix:'); 
    V = fliplr(bsxfun(@power, x0, 0:(n-1))) 

    % compute the coefficients of the fitting polynomial 
    p = V \ y0; 

    % plot the polynomial using N values 
    x = linspace(min(x0), max(x0), N); 
    y = polyval(p,x); 

    plot(x,y,'b-'); hold on; 
    plot(x0',y0','ro'); hold off; 

end 

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

+0

это не сработало; Я получил пустой сюжет. Я отредактирую свой вопрос и добавлю свой код. Вы можете выполнить его и посмотреть. – ZelelB

+0

@KarimBelkhiria Вам действительно нужно работать над созданием вашего вопроса, в оригинальном посте даже не упоминается полиномиальная регрессия. – Sheljohn

+0

работает! большое спасибо – ZelelB

Смежные вопросы