2012-09-19 21 views

Odpowiedz

14

W krótkim: Twoja funkcja musi być w formie y=ax+0, co sprawia polyfit bezużyteczne. Ale można skorzystać z metody najmniejszych kwadratów:

a = x(:)\y(:); 

Objaśnienie:

Masz n równań i jedna zmienna a, co jest potrzebne, aby znaleźć:

a*x1 = y1; 
a*x2 = y2; 
... 
a*xn = yn; 

Operator \ znajduje rozwiązanie najmniejszych kwadratów.

Alternatywnie, można znaleźć rozwiązanie ręcznie:

a = (x'*x) \ (x'*y); 

lub w pseudokodzie:

 (x1*y1 + x2*y2 + ... xn*yn) 
a = ---------------------------- 
    (x1*x1 + x2*x2 + ... xn*xn) 

Jest to użyteczne, jeśli nie Matlab - na przykład w kodzie C.


Przykład i fragment kodu:

enter image description here

function FindLSSolution() 
    a = 2.5; 
    x = rand(100,1)*10; 
    y = a*x + randn(100,1); 
    figure;scatter(x,y); 

    A = x(:)\y(:); 
    hold on;plot(x, A*x,'g'); 
end 
+0

'a = pinv (x) * y' Czy to też się stanie? –

+1

@dr_rk, Tak, ale nie jest to zalecane, ponieważ jest wolniejsze i mniej stabilne numerycznie –

2

jeśli masz "dopasowanie krzywej Toolbox" można użyć

f = fit(x, y, 'a*x');