Verfasst am: 03.12.2011, 15:58
Titel: Frage zu polyfit!
Hi Leute!
Ich bin heute in meiner Übung auf den Befehl polyfit gestoßen. Dieser Befehl berechnet ja die Koeffizienten eines Interpolationspolynoms in Abhängigkeit von den Eingabedaten sprich den x- und y-Werten. Soweit so gut.
Ich gehe davon aus, dass die x- und y-Werte z.B. von einer physikalischen Messung kommen und deshalb nicht ganz vollständig sind. Ist dieser Gedanke soweit richtig?
Aber was macht da dann nun polyfit? a=polyfit(x,y,N) so sieht der Befehl ja in Matlab aus. Die Parameter x und y sind ja klar, aber was ich nocht so ganz verstanden habe ist der Parameter N. Der gibt laut Matlab den Polynomgrad an. Aber woher soll ich denn wissen welchem Polynomgrad denn die physikalische Messung enstpricht?
%original Funktion
x = -3:0.1:3;
y = 5*x.^3+2*x.^2+x+1;
%6 Punkte vom Funktionsgraph der origainl Funktion ausgesucht:
X = [0.720.490.21-0.46-1.1-1.24]';
Y = [4.562.541.340.48-4.33-6.63]';
%berechnet Koeffizienten des interpolations Polynoms
a = polyfit(X, Y, 5);
Ich hab hier mal ein kleines Programm geschrieben. Normalerweise müssten doch jetzt die roten Punkte zumindestens ein klein bisschen dem Graphen der original Funktion folgen, oder? Wenn ich mir das aber jetzt ausgeben lasse tun sie das so gar nicht...
Bei physikalischen Messungen sehe ich das Problem, dass die Werte Meßungenauigkeiten aufweisen oder anderweitig verrauscht sind.
Als Ingenieur (ich denke mal, du bist oder wirst einer, wenn du an physikalische Messungen denkst) liegt es an dir, das Modell - hier: den Grad des Polynoms - vorzuschlagen. Ein Polynom von Grad > 3 spiegelt in den wenigsten Fällen den physikalischen Zusammenhang wieder und sollte daher meines Erachtens nicht verwendet werden.
Überhaupt sind die wenigsten Zusammenhänge polynomial. Wenn sie das nicht sind, sollte man sich ein passendes lineares oder nichtlineares Modell überlegen und das anpassen (lineares Gleichungssystem aufstellen und mit \ lösen, bzw. nlinfit / lsqcurvefit).
Hi Bandchef,
Die Modellierung der physikalischen Daten hat das Ziel einen sichtbaren Zusammenhang/Verlauf durch eine mathematische Formel abzubilden. Die Funktion polifit() hat hierbei die Aufgabe die Parameter einer vorgegebenen Polynomgleichung genauest möglich zu schätzen (Least-Square-Schätzung).
Die Ausgabe von Polyfit sind die Parameter des (durch n) vorgegebenen Polynoms (Gleichung in doc polyfit).
Polyfit erklärt dir damit nicht die Welt, sondern schätzt lediglich diese Parameter p_i. Wie Harald bereits sagte, liegt es an dir, den Grad(Ordnung) des Polynoms zu bestimmen.
Plotte dir die Daten Y über X und betrachte den Verlauf. Kurven mit einem Maximum (z.B. Drehmomentenverläufe) lassen sich häufig durch ein Polynom 2.Grades abbilden, können aber auch durch ein Polynom 4.,6. oder 8. Grades abgebildbar sein. Jeder weitere Grad liefert deiner Funktion/Modellierung eine weitere Krümmung - wie sinnvoll welche Ordnung ist muss also abgewogen werden. In deinem Fall bietet sich eintweder eine Gerade(n=1) oder aber eine Polynom 3.Ornung (n=3) an.
Für hohe Ordnungen sind sinvolle Ergebnisse nur für größere/normalverteile Datenmengen zu erwarten - zudem ist zu bewerten ob die die Wendepunkte/Maxima keine Überschwinger (Überanpassung) im Modellverlauf verursachen. So führt in deinem Fall ein Polynom 5.Ordnung mit 6 Datenpunkten wohl zum perfect match, allerdings bei schlechter Abbildung der Bereiche rechts und links der einzelnen Punkte.
Falls es dir nur um die Vervollständigung/Darstellung der Daten geht, lässt sich ein geglätteter Verlauf mit interp1() erzeugen
Gruß,
Matt
Danke für eure bisher sehr erschöpfenden Antworten! Ich hab hier jetzt nochmal zwei Programme; eins hab ich selbst geschrieben, das andere war ein's von unserem Prof:
-> Man sollte die Funktion 1/(1+t^2) durch ein Polynom interpolieren.
Nun einige Fragen dazu:
In meinem Code lass ich mir die zu verwendenden x-Werte durch linspace() ausrechnen. Ich hab eine "fiktive" Anzahl von 1000 Punkten gewählt. Der Prof. berechnet da irgendwie sowas ähnliches wie linspace() nur bin ich noch nicht so ganz dahinter gestiegen was er da genau macht... Die Zeilen
machen das "Ähnliche" wie mein linspace(). Mit dem b-a im Zähler berechnet er sich quasi die gesamte Länge der x-Achse und teilt diese dann in M-1, also 9, Abschnitte auf. Warum macht er das so? Vielleicht weil er das so haben will? Danach berechnet er "tt" in dem er sich allen Zahlen von -4 bis +4 mit einem Intervall von 0.01 'mal' das berechnete h aus der vorhergehenden Zeile nimmt! Wozu dient das? Warum nimmt er nicht einfach eine Schrittweite von 0.01? Dann lässt er sich die "echte" Funktion plotten.
das ergibt quasi Zweierpotenzen von 2^1 bis 2^9 und berechnet sich dann wiederum die neuen x-Werte (t) in dem er das rechte Ende der x-Achse durch die neun Zweierpotenzen, also das w teilt. Warum macht er das? Wenn man nun die Zeile
ansieht, dann sieht man, dass es ja nur noch neun y-Werte der Funktion geben kann da ja nur neun t-Werte vorhanden sind!
-> Kommt es mir nur so vor, oder wollte er mit diesem Aufwand einfach nur 9 bekannte y-Werte der eigentlichen Funktion erzeugen? Wenn dem so ist, dann hätte er ja auch für neun willkürliche x-Werte die dazugehörenden y-Werte berechnen können und nicht unbedingt den Umweg über die neun Zweierpotenzen gehen müssen! =der verstehe ich hier einfach was falsch?
Die Zeilen danach sind soweit klar; da berechnet er dann ja nur noch das Polynom und gibt es aus.
Danke für eure Hilfe!
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.