www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Kurve in matlab linearisieren


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle

ich beschäftige mich gerade mit Matlab und habe folgendes Problem.

Ich möchte  gern wissen wie man in Matlab eine kurve linearisieren kann.

so soll es aussehen: f= offset + Ax + Bx^2

gibt es definierte Funktion in Matlab dafür ? wenn nein wie kann ich da 
vorgehen ?
dankbar für jede Hilfe.

Sebastian

Autor: name (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matlab ist für diese Art von Problem eher weniger geignet.
Viel besser für sowas ist Maple oder Mathematica.

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liegen einzelne Werte vor oder eine Funktion ?
Wahrscheinlich willst du interpolieren.
Siehe hier:
http://www.gomatlab.de/interpolieren-t190.html
Google ist dein Freund. (Matlab Interpolieren)

Autor: Niels (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>f= offset + Ax + Bx^2
dann ist es eigentlich keine Linearisierung. Ich Schlaumeier :-)

Es gibt in Matlab ein DataFit-tool. Du kann es z.B. bei den Plots 
(Figure-Fenster) über das Menü finden. Dort kannst du per Mausklick 
verschiedene Ausgleichskurven (z.B. die von dir gesuchte Parabel) 
berechnen lassen. Steht aber auch ausserhalb von Plots zur Verfügung.

Viele Grüße, Niels.

Autor: Anon Nymous (fuechslein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit "MATLAB quadratic regression" in Google findest du genau was du 
sucht. Dazu geb ich ganz gern noch den folgenden Link an:

http://www.mathworks.com/access/helpdesk/help/tool...

Falls deine Daten Aussreiser besitzt die du nicht von Hand entfernen 
willst.

Autor: Michael Lenz (hochbett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich möchte  gern wissen wie man in Matlab eine kurve linearisieren kann.
>
> so soll es aussehen: f= offset + Ax + Bx^2
>
> gibt es definierte Funktion in Matlab dafür ? wenn nein wie kann ich da
> vorgehen ?

Hallo Sebastian,

Du willst offenbar Deine Punkte an ein Polynom zweiten Grades anfitten. 
Dazu benötigst Du die Funktionen

polyfit und
polyval

In die Funktion
P = polyfit (X, Y, N)
gibst Du die X und Y-Werte Deiner Punkte sowie den Grad N des Polynoms 
an.
Du erhältst einen Vektor P mit den Koeffizienten des Polynoms.

Die Werte des Polynoms kannst Du über polyval(X,P) ausgeben.

%--------------- Beispiel --------------------------------------------
X = -5:0.1:5;
Y = 0.5*X.^2+rand(1,length(X));
P = polyfit(X,Y,2);

figure(1);
plot(X,Y,'b-*'); hold on;
plot(X,polyval(P,X),'r-*'); hold off;
legend('Messwerte','Fit');
fprintf('Die Funktion lautet %f*x^2+%f*x+%f.\n\n',P(3), P(2), P(1));
%---------------------------------------------------------------------

Wenn Du eine Approximation an eine beliebige Funktion vornehmen willst, 
nimmst Du

lsqcurvefit

Für lsqcurvefit ist es günstig, eine eigene Funktion zu definieren. Wie 
das genau geht, schaust Du am besten in der Hilfe nach.


Gruß,
  Michael

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls man mal keine Blackbox-Funktionen benutzen will und bei sich 
denkt:

'Mensch, könntest deine Kenntnisse der linearen Algebra auch mal wieder 
bißchen erweitern'

geht das auch so:

X = -5:0.1:5;
Y = 0.5*X.^2+rand(1,length(X));
P   = polyfit(X,Y,2);
M=[X.^2 ; X ; ones(1,length(X))];
PP= inv(M*M')*M*Y.';

Math rulez!
Cheers
Detlef

Autor: Anon Nymous (fuechslein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Recht haste, ;)

Lin. Algebra wird dir ne ausgleichsgerade mit ner L2-Error-Norm geben. 
Dabei wuerde ich aber noch ein Kommentar machen:

anstatt:
x = inv(A)*b;
solltest du:
x = A \ b;
schreiben. Ein Lin Gleichungssystem zu loesen ist naemlich numerisch 
nicht das gleiche wie die inverse zu Berechnen. Fuer kleine Matrizen 
macht das ueberhaupt keinen Unterschied aber fuer grosse (>1000 sag ich 
mal).

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle,

Michael danke für die Ausführliche Antwort. Die werde ich zuerst mal 
probieren  ich denke so wird funktionnieren.


Thanks an all.
Sebastian

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, ich sehe, dass Freunde der linearen Algebra mitlesen. Dann setze ich 
noch einen drauf:

Oben geposteter Code minimiert den quadratischen Abstand der y-Werte von 
der Ausgleichsgeraden, das ist die Gauss'sche Ausgleichsgerade.

Untenstehender Code minimiert die Summe der Lote der Punkte auf die 
Ausgleichsgerade, damit wird der Fit symmetrisch, d.h. wenn der Fit der 
x auf die y die Steigung a der Gerade ergibt, liefert der Fit der y auf 
die x die Steigung 1/a.

;-)))

Math rulez!
Cheers
Detlef

function [a,b]=dfit(x,y);
% fittet eine Gerade so in eine Punktmenge, daß
% die Summe der quadratischen Abstände der Punkte
% zur Geraden minimal wird
% Damit wird der fit der x auf die y symmetrisch zu dem
% der y auf die x

x=x(:).';y=y(:).';
N=length(x);
if(N ~= length(y))
   disp('Vektoren untersch. lang bei dfit.m');return;
end

x=[x;y];

%x=[[1;1+0][2;2+0][3;3+0]];
%x=[[1;2+4][2;4+4][3;6+4]];
%x=[x(2,:);x(1,:)];
%N=3;

mean_xx = mean(x(1,:).^2);
mean_yy = mean(x(2,:).^2);
mean_x  = mean(x(1,:)   );
mean_y  = mean(x(2,:)   );
mean_xy = mean(x(1,:).*x(2,:));
A=[[mean_xx-mean_x^2      mean_xy-mean_x*mean_y];...
   [mean_xy-mean_x*mean_y mean_yy-mean_y^2     ]];
[v,d]=eig(N*A)
[ev,ind]=min(diag(d));
e=v(:,ind);
r=(1/N)*sum(e'*x)
mean(x(1,:))*e(1)+mean(x(2,:))*e(2);
if(e(2)==0)
    disp('Senkrechte bei dfit.m');return;
end
a=-e(1)/e(2);
b=r/e(2);
return

Autor: Anon Nymous (fuechslein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Intressant, hab ich noch gar nie von gehoert. Aber haettest uns auch 
verraten koennen das das Total-Least-Squares genannt wird. Haett mir nen 
paar Minuten googeln erspart. :)

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anon Nymous schrieb:
> Intressant, hab ich noch gar nie von gehoert. Aber haettest uns auch
> verraten koennen das das Total-Least-Squares genannt wird. Haett mir nen
> paar Minuten googeln erspart. :)

Wußte ich nicht, dass das so heißt. Muß ich nochmal googeln. Hatte mal 
das Problem und hatte beim matheplanet angefragt, dann eine Woche 
gebraucht um das kryptische Mathematiker-Sprech in Matlab umzusetzen. 
Verstanden habe ich die Lösung nicht wirklich, klappt aber 
nichtsdestotrotz.

Naja, mit der Million vom Lotto nächste Woche dann mal zum kommenden 
Semester ins Mathe-Grundstudium einsteigen, seufz.

Cheers
Detlef

Autor: Michael Lenz (hochbett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Detlef,

kannst Du mir die Lösung mal erklären, wenn's nicht zu umfangreich ist.
Direkt einsichtig ist es mir nicht.

Gruß,
  Michael

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Lenz schrieb:

> kannst Du mir die Lösung mal erklären, wenn's nicht zu umfangreich ist.
> Direkt einsichtig ist es mir nicht.

Nein, das kann ich leider nicht, weil ich das nicht in Gänze verstehe. 
Der von mir gestartete thread auf www.matheplanet.com lautet 'lineare 
regression und darüberhinaus', darin Einzelheiten. Im Prinzip ist das 
der Ansatz der gesuchten Gerade in der Hesseschen Normalform, 
Minimierung der Abstände mit Lagrange-Ansatz, Lösung der entstehenden 
Eigenwertaufgabe (geht auch mit singular value decomposition, wie ich 
auch gerade im wikipedia Artikel zu 'Total Least Squares' gelesen habe).
Implementieren ging gerade noch so, die Hintergründe liegen leider weit 
jenseits meines Verständnisses.

Gute Nacht
Detlef

Autor: Anon Nymous (fuechslein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du fit in Lin.Alg. bist dann verstehst du das warsch.:

http://www.cns.nyu.edu/~eero/NOTES/leastSquares.pdf

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anon Nymous schrieb:
> Wenn du fit in Lin.Alg. bist dann verstehst du das warsch.:
>
> http://www.cns.nyu.edu/~eero/NOTES/leastSquares.pdf

Sieht gut aus. Sehr interessant auch das Verfahren zur optimalen 
Clusterseparierung. Solch ein Problem hatte ich auch schon paarmal, habe 
mich da immer so programmiertechnisch drumrumgewurstelt. Morgen mal 
genauer draufkucken.

Cheers
Detlef

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.