Verfasst am: 10.12.2015, 15:25
Titel: Polynom für Datenfit
Hallo Leute,
aufgrund eines Lizenzproblems welches es mir manchmal erschwert bzw. unmöglich macht "fit( ... )" zum Datenfit einzusetzen bin ich gezwungen auf andere Funktionen/Skripte auszuweichen. Dabei wurde mir von einem Kollegen polyfitn empfohlen.
Prinzipiell funktioniert das Skript ziemlich gut, auch die Beispiele lassen sich gut nachvollziehen.
Allerdings komme ich in der Anwendung für mein Problem nicht weiter:
Ich habe Daten aus einer Spannungsberechnung (z) für einen Querschnitt (x, y) vorliegen. Die Querschnittskoordinaten sind dabei durch die Matritzen x (Höhe; 33x5) und y (Breite 33x5) vorgegeben. (In x enthält je eine Spalte die Höhenkoordinaten; in y je eine Zeile die Breitenkoordinaten. Der Querschnitt wäre auch durch den Spaltenvektor x(:,1) bzw. Zeilenvektor y(1, vollständig koordinativ beschrieben.)
Letztlich enthält die Matrix z (33x5) die Spannungen aus einer Berechnung.
... das funktioniert soweit ganz gut. Mein Problem ist nun, dass ich es nicht schaffe, denselben Fit mit polyfitn hinzubekommen, obwohl das meiner Meinung nach möglich sein müsste. Bei mir stürzt polyfitn leider mit der Fehlermeldung
Code:
Error using horzcat CAT arguments dimensions are not consistent.
ab. ... Und die ist anscheinend darauf zurückzuführen, dass meine Input-Daten aus Vektoren unterschiedlicher Länge stammen ...
... irgendwie bin ich nun ratlos an dieser Stelle angekommen. Vielleich kann mir ja jemand von euch weiterhelfen - ich wäre euch sehr dankbar dafür!
LG
Markus
P.S.: Ich habe dieselbe Frage direkt auf dem polyfitn-Link auch gestellt; allerdings keine Antwort dort noch erhalten bzw. weiß auch nicht wie realistisch es ist, dort eine zu erwarten. - Jedenfalls wollte ich hier nur auf dieses 'crossposting' verweisen.
Bei mir stürzt polyfitn leider mit der Fehlermeldung
das ist sehr komisch. polyfitn wird in deinem skript doch garnicht aufgerufen. es sollte also auch keine fehler verursachen. außer du hast den relevanten teil nicht gepostet und wir sollen raten was du falsch machst
bitte immer lauffähige beispiele posten die den fehler reproduzieren.... es ist viel einfacher wenn wir nicht alles erraten müssen
_________________
außer du hast den relevanten teil nicht gepostet und wir sollen raten was du falsch machst Smile
oh, nein. - Ich habe das Beispiel gepostet, das verdeutlichen soll, was ich mit polyfitn() vorhabe, d.h. dass ich es anstelle des fit() verwenden möchte.
Als kleines Beispiel meines 'Knotens' hier nun:
Code:
% Querschnitts-Koordinaten ueber die Hoehe
x = [0,0,0,0,0;1,1,1,1,1;2,2,2,2,2;3,3,3,3,3]
% Querschnitts-Koordinaten ueber die Breite
y = [0,0.5,1,1.5,2;0,0.5,1,1.5,2;0,0.5,1,1.5,2;0,0.5,1,1.5,2]
% 'Spannung' an je einem Punkt des Querschnitts
z=rand(4,5)*10
% ... und das sollte nun gefittet werden vom grad 2 über die Breite und grad 4 ueber die Hoehe
p = polyfitn([x, y],z,'x, y, x^2, x*y, y^2, x^2*y, x*y^2, y^3, x^2*y^2, x*y^3, y^4')
sihst du damit kann man doch schon mehr anfangen. x und y werden als vektoren erwartet. außerdem kommt er mit x^2*y nicht klar beim pharsen was er aber erkennt ist y*x^2 bzw x*x*y
wenn man das anpasst läuft auch das beispiel
Code:
% Querschnitts-Koordinaten ueber die Hoehe
x = [0,0,0,0,0;1,1,1,1,1;2,2,2,2,2;3,3,3,3,3]
% Querschnitts-Koordinaten ueber die Breite
y = [0,0.5,1,1.5,2;0,0.5,1,1.5,2;0,0.5,1,1.5,2;0,0.5,1,1.5,2]
% 'Spannung' an je einem Punkt des Querschnitts
z=rand(4,5)*10
% ... und das sollte nun gefittet werden vom grad 2 über die Breite und grad 4 ueber die Hoehe
p = polyfitn([x(:), y(:)],z(:),'x, y, x^2, x*y, y^2, y*x^2,x*y^2,x*x*y*y, x*y^3,y^4') ifexist('sympoly') == 2
polyn2sympoly(p) end ifexist('sym') == 2
polyn2sym(p) end [xg,yg]=meshgrid(0:0.1:3,0:0.1:2);
zg = polyvaln(p,[xg(:),yg(:)]);
surf(xg,yg,reshape(zg,size(xg)),'facecolor','green') hold on
surf(x,y,z,'facecolor','red') hold off
Vielen Dank für die Hilfe!
Soweit hat das alles nun super funktioniert; ich bin aus der Dokumentation der Funktion selbst leider nicht so besonders schlau geworden ...
Eine kleine Frage hätte ich noch bezüglich des Plottens des Datenfit-Resultats, welches ich in Abhängigkeit der Lage im Querschnitt modifiizieren muss.
Nun funktioniert das Prinzipiell so, dass ich z.B. zunächst das Fitting-Polynom an bestimmten Stellen auswerte und das Resultat in ein Array speichere und letztlich dieses dann plotte. Geht das aber auch 'direkt', d.h. über ein meshgrid?
Über 'fit(...)', welches mir das gefittete Polynom in die Variable 'fitresult' zurückgibt sah die 'Lösung' so aus:
Code:
% Querschnitts-Koordinaten ueber die Hoehe
arr_x = [0,0,0,0,0;1,1,1,1,1;2,2,2,2,2;3,3,3,3,3]
% Querschnitts-Koordinaten ueber die Breite
arr_y = [0,0.5,1,1.5,2;0,0.5,1,1.5,2;0,0.5,1,1.5,2;0,0.5,1,1.5,2]
% 'Spannung' an je einem Punkt des Querschnitts
arr_td=rand(4,5)*10
hier wird nirgends surf aufgerufen. das kann den fehler also nicht erzeugen.
arr_tc und arr_tl sind auch unbekannt. so kann dir nicht effektiv geholfen werden.
_________________
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.