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

Fehler in der Programmierung

 

Calle
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2011, 23:55     Titel: Fehler in der Programmierung
  Antworten mit Zitat      
Hi
ich soll automatisch die Parameter einer Sprungantwort ermitteln (Feder, Masse, Dämpfer). Dazu habe ich auf dem Realsystem eine Sprungantwort (sprungantwortreal) aufgenommen. Der erste teil des programms funktinoiert auch einwandfrei. Bei der Funktion allerdings funktioniert es nicht wirklich. Ich muss ja irgendwie das Simulationsmodell anpassen. aber wenn ich das lade, kommen folgende Fehlermeldungen:


??? Error using ==> objfun2 at 2
Error due to multiple causes.

Error in ==> fminsearch at 195
fv(:,1) = funfcn(x,varargin{:});

Error in ==> api2 at 28
p = fminsearch(@objfun,p0,[],u_id,y_id,t_id)

Caused by:
Error using ==> objfun at 2
Error evaluating parameter 'Gain' in 'Modell/Beschleunigung': Undefined function or method 'p' for input arguments of type 'double'.
Error using ==> objfun at 2
Error evaluating parameter 'Gain' in 'Modell/Dämpfungskraft': Undefined function or method 'p' for input arguments of type 'double'.
Error using ==> objfun at 2
Error evaluating parameter 'Gain' in 'Modell/Federkraft': Undefined function or method 'p' for input arguments of type 'double'.
Error using ==> objfun at 2
Error evaluating parameter 'Gain' in 'Modell/Reibkraft': Undefined function or method 'p' for input arguments of type 'double'.



Wenn ich anstelle der simulation eine übertragungsfunktion mache, funktioniert alles einwandfrei. Könnt ihr mir helfen? Wäre euch sehr dankbar.


Code:

figure(1)
load sprungantwortreal.mat                                                
time = sprungantwortreal.X.Data;                                            
var2 = sprungantwortreal.Y(2).Data;                                        
var3 = sprungantwortreal.Y(3).Data;                                        
u_id = var3;
y_id = var2;
y_id = y_id - y_id(1);
t_id = time;
t_id = t_id - t_id(1);
% --- Optimierung ---
p0 = [ 15 200  29000 ];                                                    
p = fminsearch(@objfun,p0,[],u_id,y_id,t_id)
 



Code:

[function J=objfun(p,um,ym,t)
sim('Modell');
S=[tout,xout,yout];
ysim=lsim(S,um,t);                                                          
ysim=ysim';                                                                
drawnow                                                                    
plot(t,ym,t,ysim)                                                          
J=sum((ym-ysim).^2);
 


Modell.mdl
 Beschreibung:
Simulin Modell des Feder-Masse-Dämpfer-Systems

Download
 Dateiname:  Modell.mdl
 Dateigröße:  28.38 KB
 Heruntergeladen:  442 mal
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2011, 06:58     Titel:
  Antworten mit Zitat      
Simulink schaut nur im base workspace ob es die Variablen gibt. p ist allerdings in diesem Fall nur lokal in der Funktion objfun definiert. Vor der Simulation musst du also p in den base workspace schreiben.

Code:

assignin('base','p',p);
 


viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Calle
Themenstarter

Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2011, 19:38     Titel:
  Antworten mit Zitat      
Hi Thomas
vielen dank für deine schnelle Antwort. da hast du natürlich recht, dass hatte ich total vergessen. Jodoch kommt jetzt eine noch merkwürdigere Fehlermeldung.

??? Error using ==> lsim at 89
Not enough input arguments.

Error in ==> objfun2 at 4
ysim=lsim(Modell,um,t);

Error in ==> fminsearch at 195
fv(:,1) = funfcn(x,varargin{:});

Error in ==> api2 at 28
p = fminsearch(@objfun2,p0,[],u_id,y_id,t_id)


Aber was will der denn noch haben?
In der Hilfe steht: LSIM(SYS,U,T)
hatte auch schon
Code:
ysim=lsim(Modell,um,t);

Dann brauche ich die zwei zeilen davor ja nicht mehr.
allerdings kommt da genau die selbe Fehlermeldung.

Calle
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 06:36     Titel:
  Antworten mit Zitat      
Code:

sim('Modell');
S=[tout,xout,yout];
ysim=lsim(S,um,t);
 


das hatte ich ja noch gar nicht so genau betrachtet. Was bezweckst du denn mit diesen Zeilen? Wo kommt denn tout,xout und yout her?
Für lsim sollte S eine Übertragungsfunktion sein und keine Matrix.
Private Nachricht senden Benutzer-Profile anzeigen
 
Calle
Themenstarter

Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 08:06     Titel:
  Antworten mit Zitat      
Hi
tout,xout,yout kommen aus der Simulation.
Aber wenn du sagst, dass S eine übertragungsfunktion sein muss, weiß ich ein bisschen mehr. Vielen dank schon mal dafür. Allerdings muss ich ein Simulink Modell vergleichen, kann ich dass überhaupt damit machen? oder muss ich da einen ganz anderen weg einschlagen?
Calle
Private Nachricht senden Benutzer-Profile anzeigen
 
Calle
Themenstarter

Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 20:47     Titel:
  Antworten mit Zitat      
ich habe auch mal versucht mit dem Befehl G=tf(Modell) die übertragungsfunktion des Modells zu bekommen, jedoch hat das nicht wirklich funktioniert.
>> G=tf(Modell)

Transfer function from input to output...
#1: 2
#2: 0
#3: 1
#4: 0
#5: 0
#6: 0
#7: 2


Code:
G=tf(Modell);
ysim=lsim(G,um,t);


??? Error using ==> minus
Matrix dimensions must agree.

Error in ==> objfun2 at 8
J=sum((ym-ysim).^2);
Error in ==> fminsearch at 195
fv(:,1) = funfcn(x,varargin{:});

Error in ==> api2 at 26
p = fminsearch(@objfun2,p0,[],u_id,y_id,t_id)



Wenn ich mir eine "Übertragungsfunktion" aussuchen würde (z.B. G(1,1)) (obwohl ich da nicht wirklich eine erkenne) gibt er mir nur die anfangsparameter aus.
Code:
G=tf(Modell);
ysim=lsim(G(1,1),um,t);


BIn ich denn auf den richtigen weg, oder ist das alles humbuck was ich hier mache.Wäre ech super wenn mir jemand weiterhelfen würde.
Calle
Private Nachricht senden Benutzer-Profile anzeigen
 
Calle
Themenstarter

Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2011, 20:25     Titel:
  Antworten mit Zitat      
hat keiner einen Tip für mich?
ich komme absolut nicht weiter.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2011, 06:58     Titel:
  Antworten mit Zitat      
Ich versteh noch nicht was du eigentlich machen willst.
Willst du die Parameter p an deine Messwerte anpassen?
Willst du dein Simulink Modell auf verschiedene Arten simulieren?
Private Nachricht senden Benutzer-Profile anzeigen
 
Calle
Themenstarter

Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2011, 07:52     Titel:
  Antworten mit Zitat      
Genau, meine werte p möchte ich gerne anpassen. da in diesem Vekter die Parameter [Masse Dämpferkonstante Federkonstante Reibwert] stehen, die ermittelt werden müssen.
Calle
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2011, 16:14     Titel:
  Antworten mit Zitat      
Aber wozu brauchst du dann noch das lsim Kommando wenn du das Modell vorher schon mit sim simuliert hast?
Private Nachricht senden Benutzer-Profile anzeigen
 
Calle
Themenstarter

Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2011, 23:17     Titel:
  Antworten mit Zitat      
Ich hatte ein beispielprogramm bekmmen, womit dass mit lsim gemacht wurde. Allerdings wurde es da auch mit einer Übertragungsfunktion gemacht. Ich hatte gedacht, dass ich das für ein Modell auch benutzen kann. Dem ist wohl nciht so. Habe ein paar neue gedanken, die aber noch fehlerhaft sind.

Code:
function J=objfun2(p,um,ym,t)
assignin('base','t',t);
assignin('base','p',p);
sim('Modell');
ysim=yout';
assignin('base','ym',ym);
assignin('base','ysim',ysim);
drawnow;
plot(t,ym,t,ysim);                                                      
J=sum((ym-ysim).^2);


Vectors must be the same lengths.

ym: <1x5001 double>
ysim: <1x114 double>

das ysim bekomme ich aus dem Simulink-Modell, kann man dort irgendwo einstellen, wie groß der Vektor sein soll? Man muss ja im Prinzip die Abtastfrequenz erhöhen, jedoch habe ich da nichts zu gefunden.

Aber schon einmal vielen dank für deine Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2011, 06:42     Titel:
  Antworten mit Zitat      
schau dir denn sim Befehl noch mal genauer an. Meiner Meinung nach sollte die Zielfunktion in etwa so aussehen:

Code:

function J=objfun2(p,ym,t)
assignin('base','p',p);
[t,x,ysim] = sim('Modell',t);
J=sum((ym-ysim).^2);
 


Der Aufruf von fminsearch scheint mir aber auch noch nicht richtig zu sein.

Code:

p = fminsearch(@(p) objfun(p,y_id,t_id),p0);
 


Außerdem hat p0 nur 3 Einträge obwohl das Modell 4 Parameter benötigt ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Calle
Themenstarter

Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 08.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2011, 20:02     Titel:
  Antworten mit Zitat      
Hi
der aufruf von fminsearch hat so funktioniert wie er war, aber so wie du das dahingeschrieben hast, funktioniert es auch. Das mit p0 hatte ich schon geändert. Alles funktioniert fast so wie es soll. Außer die Zeit hat nicht funktioniert, da in der Simulation nach 1s gestartet wurde und im realsystem bei ca 1.14s. Da habe ich für die Zeit einfach noch eine variable eingefügt.
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.