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

LSQCURVEFIT Simulinkmodell Parameter bestimmen

 

student944
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2014, 16:40     Titel: LSQCURVEFIT Simulinkmodell Parameter bestimmen
  Antworten mit Zitat      
Hallo ich brauche dringend Hilfe beim Anpassen meiner simulierten Linie an meine Messwerte. Wäre super, wenn mir jemand hilft.
Ich sitze den ganzen Tag vor dem PC und versuche mich schlau über die lsqcurvefit Funktion zu machen. Mir qualmt der Kopf und ich finde einfach keine passende Beschreibung. Kennt jemand ein Link, wo dieses Thema mal ausführlich beschrieben wird? (Bitte nicht die Matlab Hilfe Funktion)

Meine Messwerte:
Code:

F=[]; %Kräfte werden auf x-Achse aufgetragen
v=[]; %Geschwindigkeiten auf der y-Achse
 


Mein Simulink-Modell:

Eingang: 6 unterschiedliche Geschwindigkeitsverläufe (sinusartig)

Ausgang: daraus resultieren 6 unterschiedliche Kraftverläufe, jedoch interessieren mich nur die Maximalwerte. Diese 6 Maximalwerte sollen an die Messwerte F=[] angepasst werden.

Parameter im Modell: sigma0,sigma1,sigma2,vs,Fs,Fc,a
(Für diese wollte ich Werte haben)

Mein Ansatz:
Code:

%lsqcurvefit

function F=myfun(xdata,sigma0,sigma1,sigma2,vs,Fs,Fc,a);
%Muss an diese Stelle die Funktion geschrieben werden? Oder weiß Matlab das automatisch aus dem Simulink-Modell?
ydata=[]; %Messdaten Kraft
xdata=[]; %Messdaten Geschwindigkeit
x0=[]; %Anfangswerte?? Für die Parameter???
[xdata,sigma0,sigma1,sigma2,vs,Fs,Fc,a]=lsqcurvefit(@myfun,x0,xdata,ydata);
 


Also ich weiß ich nicht wo ich da jetzt was machen soll?
Private Nachricht senden Benutzer-Profile anzeigen


student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2014, 13:58     Titel:
  Antworten mit Zitat      
Hallo, inzwischen bin ich etwas weiter.
Ich habe 6 Messdaten (xdata,ydata).
Über meine Simulation erhalten ich ebenfalls 6 Messdaten (x-Werte sind gleich xdata/ Y-Werte weichen ab und sollen angepasst werden)
Ich habe 7 Variablen in meinem Simulink Modell.
In meinem Matlab-Editor steht:

Code:

xdata=[v1,v2,v3,v4,v5,v6];
ydata=[F1,F2,F3,F4,F5,F6];

%Startwerte x0:
x0=[100000,200,1,200,4000,0.1,2];

[F_sim]=fun(x,xdata);

x=lsqcurvefit(@fun,x0,xdata,ydata);
 


Meine Funktion, welche die Simulation startet:
Code:

function [ F_sim ] = simfun_z(x,xdata)

%define parameters:
variable1=x(1);
variable2=x(2);
variable3=x(3);
variable4=x(4);
variable5=x(5);
variable6=x(6);
variable7=x(7);
 
sim ('Modell')
[F_sim]=[Fa,Fb,Fc,Fd,Fe,Ff];

end
 


Ich habe ein Problem mit der Parametrisierung. Meine Variablen stehen im Simulink Modell.

Fehlermeldung:
Undefined function 'x'
for input arguments of
type 'double'.

Error in
Modell
(line 76)
variable1=x(1);

Hat irgendjemand eine Idee? Bin schon ewig mit dem Thema curvefitting beschäftigt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.09.2014, 14:19     Titel:
  Antworten mit Zitat      
Hallo,

eigentlich musst du doch @simfun_z statt @fun verwenden?

Die gezeigten Befehle und die Fehlermeldung passen auf den ersten Blick nicht wirklich zusammen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2014, 15:13     Titel:
  Antworten mit Zitat      
ja stimmt.
jetzt kreidet er mir das auch nicht mehr an.
Ich erhalte jetzt für x aber meine Startwerte und keine angepassten Werte.
Code:

Warning: Trust-region-reflective algorithm
requires at least as many equations as
variables; using Levenberg-Marquardt
algorithm instead.
> In lsqncommon at 56
  In lsqcurvefit at 253
  In VDA_Kennung_curvefit at 65

Initial point is a local minimum.

Optimization completed because the size of the gradient at the initial point
is less than the default value of the function tolerance.

<stopping criteria details>
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.09.2014, 19:35     Titel:
  Antworten mit Zitat      
Hallo,

was passiert, wenn du den Startwert ein wenig variierst? Dieselbe Meldung?
- Falls nein: dann hast du tatsächlich das Minimum als Startwert angegeben. Daran denken, dass lsqcurvefit nur lokale Minima findet.
- Falls ja: meine Vermutung wäre, dass das Simulink-Modell sich die Parameters aus dem falschen Workspace zieht. Diesen Workspace kann man über die Option 'SrcWorkspace' setzen.
Je nach Release geht das leicht unterschiedlich, z.B. so
Code:
sim ('Modell', 'SrcWorkspace', 'current')

Wenn das nicht klappt, bitte angeben, welches Release du verwendest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2014, 20:22     Titel:
  Antworten mit Zitat      
Anfangswerte ändern bringt leider nichts.

SimOptions stehen schon in der Funktion.
Code:

simOptions = simset('SrcWorkspace','current');
 


Release ist R2013b

die Function [F_sim] soll ja mit den Parametern das Ergebnis an ydata angleichen? aber aus irgend einem Grund tut es das nicht Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.09.2014, 20:53     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
SimOptions stehen schon in der Funktion.

Kann man leider nicht erahnen, wenn es nicht beschrieben wird.

Kannst du mal alle beteiligten Funktionen in der verwendeten Form sowie das Modell posten? Wenn ein Posten des gesamten Modells ein Probkem ist, kannst du die wesentlichen Bestandteile ja durch andere Blöcke ersetzen - die Problematik sollte halt erkennbar sein.

Was man noch versuchen könnte: da deine Startwerte in sehr unterschiedlichen Größenordnungen sind, erwartest du das wohl auch von der Lösung --> Option 'TypicalX' anpassen.
Simulationen sind grundsätzlich ja immer fehlerbehaftet. Bei der Schätzung von Gradienten kann es dann problematisch werden, wenn die Datenpunkte zu nah beieinander liegen --> Option 'DiffMinChange' setzen (z.B. auf 1e-3).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2014, 21:47     Titel:
  Antworten mit Zitat      
wie und wo setze ich denn die Optionen?

options.DiffMinChange = 1e-3; ??
options.TypicalX ??

Das Modell ist sehr umfangreich mit mehreren Subsystemen und daher etwas schwer hier darzustellen.
Ich würde zuerst gerne das mit den Optionen testen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.09.2014, 22:09     Titel:
  Antworten mit Zitat      
Hallo,

der letzte Eingabeparameter von lsqcurvefit ist options. Je nach Release kann man optimset oder optimoptions verwenden, um den passenden Input zu erzeugen, also:
Code:
options = optimset('TypicalX', <Vektor mit typischen x-Werten>, 'DiffMinChange', 1e-3);
... = lsqcurvefit(..., options);


... steht aber an sich auch in der Doku von lsqcurvefit.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2014, 12:25     Titel:
  Antworten mit Zitat      
also habe die Options gesetzt. Jedoch musste ich noch ein SolverName wählen. Welchen weiß ich nicht.

Code:

options = optimoptions('????','TypicalX',[100000,200,1,200,4000,0.1], 'DiffMinChange',1e-3);
 


Ergebnis ist immer noch das selbe.
Fehlermeldung:

Initial point is a local minimum.

Optimization completed because the size of the gradient at the initial point
is less than the default value of the function tolerance.

<stopping criteria details>

Außerdem habe ich meine Startwerte um 1 reduziert (der eine ist nun konstant). Habe jetzt "nur" noch 6 Startwerte.
Private Nachricht senden Benutzer-Profile anzeigen
 
student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2014, 13:40     Titel:
  Antworten mit Zitat      
Hat es eventuel etwas mit der TolFun Option zu tun?

Optimization completed: The final point is the initial point.
The first-order optimality measure, 0.000000e+00, is less than
options.TolFun = 1.000000e-04.

Optimization Metric Options
relative first-order optimality = 0.00e+00 TolFun = 1e-04 (selected)

Der Wert von the first-order optimality ist bei 0. Das ist doch falsch oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.09.2014, 20:50     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Jedoch musste ich noch ein SolverName wählen. Welchen weiß ich nicht.

Wie wäre es denn mit 'lsqcurvefit'? Das rufst du ja schließlich danach auf.

Zitat:
Hat es eventuel etwas mit der TolFun Option zu tun?

Du kannst ja versuchen, die Option herunterzusetzen (1e-12 oder so).

Zitat:
Der Wert von the first-order optimality ist bei 0. Das ist doch falsch oder?

Wie kommst du darauf?

Verwende doch mal den Debugger und schaue, ob bei verschiedenen x-Werten auch wirklich verschiedene Simulationswerte Fa bis Ff herauskommen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2014, 12:53     Titel:
  Antworten mit Zitat      
Das mit dem SolverName war tatsächlich dumm von mir. Bin aber relativ schnell selbst darauf gekommen.

Für verschiedene x-Werte kommen definitiv andere F-Werte heraus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.09.2014, 13:11     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Für verschiedene x-Werte kommen definitiv andere F-Werte heraus

Hast du das unabhängig von der Optimierung getestet oder wirklich mit dem Debugger im Kontext der Optimierung?

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.