WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Polynom für Datenfit

 

Markus90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2015, 15:25     Titel: Polynom für Datenfit
  Antworten mit Zitat      
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,Smile vollständig koordinativ beschrieben.)
Letztlich enthält die Matrix z (33x5) die Spannungen aus einer Berechnung.

Mein bisheriger datenfit sieht folgendermaßen aus:

Code:

[xData, yData, zData] = prepareSurfaceData( y, x, z );

% Set up fittype and options.
ft = fittype( 'poly24' );
opts = fitoptions( ft );

% Fit model to data.
[fitresult, gof] = fit( [xData, yData], zData, ft, opts );

% plot
subplot( 2, 2, 2 );
h = plot( fitresult, [xData, yData], zData );
axis([0 2.5 0 8 20 60]);
xlabel( 'Width [m]' );
ylabel( 'Height [m]' );
zlabel( 'Tension [N/mm2]' );
title('Tension from Fit');
grid on;
daspect([8 8 60]);
colorbar;
 


... 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.


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 10.12.2015, 15:34     Titel:
  Antworten mit Zitat      
Zitat:
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 Smile
bitte immer lauffähige beispiele posten die den fehler reproduzieren.... es ist viel einfacher wenn wir nicht alles erraten müssen
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2015, 17:10     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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')

 


... und hier heißts dann leider von Polyfitn: "Error using polyfitn (line 135) Only 1 dependent variable allowed at a time."

Und irgendwie versteh' ich das nun nicht so ganz...
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 10.12.2015, 17:35     Titel:
  Antworten mit Zitat      
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')
if exist('sympoly') == 2
  polyn2sympoly(p)
end
if exist('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

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2015, 13:43     Titel:
  Antworten mit Zitat      
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

[xData, yData, zData] = prepareSurfaceData( arr_y, ...
       arr_x, arr_td );
 
   % Set up fittype and options.
   ft = fittype( 'poly44' );
   opts = fitoptions( ft );
   
   % Fit model to data.
   [fitresult, gof] = fit( [xData, yData], zData, ft, opts );  

 subplot(2,2,4)

     % arr_tc bzw. arr_tl enthalten konstanten; dbl_cg ist eine Konstante
     [X, Y] = meshgrid(0:.1:2.5, 0:.1:8);
     Z = fitresult(X, Y)-( (arr_tc + 0 .*X + 0 .* Y) + arr_tl .* (dbl_cg - Y));
     surf(X, Y, Z);

     axis([0 2.5 0 8 -30 30]);
     xlabel( 'Breite [m]' );
     ylabel( 'Höhe [m]' );
     zlabel( 'Spannung' );
     grid on;
     daspect([8 8 60]);
     colorbar;
 


In ähnlicher Weise hätte ich dies nun gerne für polyfitn gemacht; mein Versuch in der entsprechenden Zeile sah so aus:

Code:

Z = polyvaln(p, [X(:), Y(:)])-( (arr_tc + 0*X(:) + 0*Y(:)) + ...
          arr_tl*(dbl_cg - Y(:)));
 


Leider klappt das nicht so ganz, da surf() nun meldet 'Z must be a matrix, not a scalar or vector' ... und nun bin ich (wieder) einmal ratlos.

Ich hoffe jemand kann ungefähr nachvollziehen was ich meine und mir weiterhelfen ...

Liebe Grüße
Markus
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 14.12.2015, 14:16     Titel:
  Antworten mit Zitat      
bitte poste den code der den fehler produziert.
Code:
Z = polyvaln(p, [X(:), Y(:)])-( (arr_tc + 0*X(:) + 0*Y(:)) + ...
          arr_tl*(dbl_cg - Y(:)));
 

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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2015, 15:57     Titel:
  Antworten mit Zitat      
Hoppala. ... also im gesamten sieht's 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)*100;

arr_tc = 0.201;
arr_tl = 0.110;

dbl_cg = 1.50;

poly22 = 'constant, x, y, x^2, x*y, y^2';

% Koordinaten der Datenpunkte (Temperaturen) holen
xpfit = arr_y;
ypfit = arr_x;

% Fitten mit Polyfit
p = polyfitn([xpfit(:), ypfit(:)], arr_td(:),poly22);

if exist('sympoly') == 2
   
    polyn2sympoly(p);
   
end

if exist('sym') == 2
   
    polyn2sym(p);
   
end


subplot(2,2,4)

[X, Y] = meshgrid(0:.1:2, 0:.1:3);
Z = polyvaln(p, [X(:), Y(:)])-( (arr_tc + 0*X(:) + 0*Y(:)) + arr_tl*(dbl_cg - Y(:)));  
surf(X, Y, Z);
 
xlabel( 'Breite [m]' );
ylabel( 'Höhe [m]' );
zlabel( 'Spannung' );
grid on;
     
colorbar;
 


... das sollte den besagten Fehler liefern.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 14.12.2015, 16:02     Titel:
  Antworten mit Zitat      
das reshape hab ich in meinem beispiel bewusst genutzt Smile es erfüllt durchaus einen zweck. wenn du das auch benutzt klappt es.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.12.2015, 16:05     Titel:
  Antworten mit Zitat      
Hallo,

du gibst ja in polyvaln Vektoren rein, also werden auch Vektoren herauskommen. Entweder du wandelst das selbst in eine Matrix um, oder siehe hier:
http://de.mathworks.com/help/matlab.....as-a-surface.html#f0-9140

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.