2012-09-19 13 views
8

passt Ich habe eine Reihe von Punkten (x,y) und ich muss die Linie der besten Anpassung finden, die den Ursprung mit MATLAB passiert.Eine Linie, die durch den Ursprung (0,0) zu Daten

+1

verwenden Wie definieren Sie Ihr Kriterium für eine "beste Passform"? Kleinster quadratischer Fehler? –

+1

Ja, das stimmt - vielen Dank, dass Sie das als wichtig herausgestellt haben. –

Antwort

14

In Kürze: Ihre Funktion muss in Form von y=ax+0 sein, was polyfit nutzlos macht. Aber Sie können die Methode der kleinsten Quadrate verwendet werden:

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

Erläuterung:

Sie haben n Gleichungen und eine Variable a, die benötigt wird, gefunden werden:

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

Der Betreiber \ findet die Lösung der kleinsten Quadrate.

Alternativ können Sie die Lösung manuell finden:

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

oder in Pseudo-Code:

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

Dies ist nützlich, wenn Sie nicht Matlab verwenden - zum Beispiel in C-Code.


Beispiel und Code-Schnipsel:

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' Würde das auch funktionieren? –

+1

@dr_rk, Ja, aber es wird nicht empfohlen, weil es numerisch langsamer und weniger stabil ist –

2

, wenn Sie die "Curve Fitting Toolbox" haben Sie

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