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

Eingangsparameter Funktion werden nicht angenommen

 

jasicha
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 22.10.12
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 22.10.2012, 11:04     Titel: Eingangsparameter Funktion werden nicht angenommen
  Antworten mit Zitat      
Hallo,
ich bin neu hier im Forum und habe mal eine, wahrscheinlich für die meisten eine sehr einfache Frage. Ich bin ziemlicher Matlab neuling und versuche mich gerade an der optimierung eines aktiven Federungssystems bezüglich zweier konkurrierender Ziele.

Das SimulinkModell des Fahrwerkssystems inkl. Anregung steht.

Meine Frage ist:

Ich habe folgende Funktion
Code:
%% Optimization

function [energy,discomfort] = optimization(d_sky)
energy = 0;
discomfort = 0;
mdl = 'LinMod_R2008a';
    load_system(mdl)
   
    % Einstellungen der Simulation
    set_param(mdl, 'SimulationMode', 'normal')
    set_param(mdl, 'Solver', 'ode45')

    % Start und Stop an Simulation übergeben
    set_param(mdl, 'StartTime', '0.0')
    set_param(mdl, 'StopTime', 'timeint')

   % Simulation Starten
   sim(mdl);
end


wobei der ich erstmal die Parameter für d_sky [y,z,phi] beim aufrufen eingeben und sich die Werte für Energy und Discomfort entsprechend ändern sollen.

Ich rufe die Funktion folgendermaßen auf:

Code:

[energy, discomfort]=optimization([3000 3000 100])
 


allerdings ändert sich, egal was für Werte ich für d_sky angebe die Werte für die Energy und den Discomfort nicht. Außerdem stehen diese dann nicht in meinem Workspace und auch d_sky ändert sich nicht.

d_sky ist bereits im Vorraus definiert als
Code:
d_sky=([5000 5000 2000]);
und liegt im Workspace bereit.

Wie stell ich das denn am besten an??

Gruß und danke im Vorraus,
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.10.2012, 12:49     Titel:
  Antworten mit Zitat      
Hallo,

du musst sicherstellen, dass Simulink sich die Parameter aus dem richtigen Workspace holt:

Code:
sim(mdl, 'SrcWorkspace', 'current');

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 22.10.12
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 22.10.2012, 19:34     Titel:
  Antworten mit Zitat      
Hallo, danke für die schnelle Antwort.

Leider hat es nicht funktioniert da folgende Fehlermeldung auftritt. timeint ist dabei die im .m-file definierte Simulationslänge.

Warning: Variable 'timeint' exists in base workspace but not in the model's source workspace.
> In optimization at 18
Error using optimization (line 18 )
Error evaluating expression 'timeint' for 'StopTime' specified in the Configuration Parameters dialog for block diagram 'LinMod_R2008a': Undefined
function or variable 'timeint'.

Wenn ich 'current' durch 'base' ersetzte gibts keine Meldung, allerding ist das ergebnis leider unabhängig vom Eingang immer 0

was aber damit zusammenhängt das ich oben die beiden outputvariablen = 0 setzte
Code:
energy=0;
discomfort=0;
 


wo definiere ich denn diese Variablen so, dass sie mir nicht von Matlab als ungenutz angezeigt werden. Aber das das Ergebnis nicht immer 0 ist. Vorher ohne definition des genutzen Workspaces klappte das so?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du wirst dich entscheiden müssen, ob die Parameter aus dem Base Workspace (Default) oder dem Workspace der Funktion entnommen werden sollen. Beides gleichzeitig geht meines Wissens nicht.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 22.10.12
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 22.10.2012, 20:47     Titel:
  Antworten mit Zitat      
Hallo,
die FunKtion soll später in Bezug auf Energy und Discomfort optimiert werden indem die d_sky parameter verändert werden, sodass ich für verschiedene Anregungen unterschiedliche Paretofronten erhalte.

Die Funktion ist also meine Zielfunktion die anschließend durch ein geeignetes Optimierungsverfahren von Matlab immer wieder aufgerufen wird um das jeweilige Minimum zu finden.

Es soll also so sein, dass ich erstmal d_sky vorgebe und entsprechen die Energy und den Discomfort erhalte, wobei es aber im Moment noch hängt.

das Programm besteht aus dem Simulinkmodell und zwei .m-files

setup.m
Code:

%% Paremeter werden geladen

% Parameter für den Controller
run initFiles/init_Controller
% Lineares Modell des Feer-Neige-Prüfstands
load initFiles/Pruefstand_HW
% Anregungsprofil
load initFiles/track3

timeint = 3.5;

% Approximation der Leistung aus den Zylindergeschwindigkeiten
p_supp = 12000000;  %[Pa]
A1 = 0.000804;      %[m^2]
A2 = 0.000424;      %[m^2]    


init.controler.m
Code:

%% Filter Parameter
ly = 0.84; %geometric constant
t1PT1 = 0.001998;
kPT1 = 1;
f_HP = 0.2; %high-pass frequency
T_HP = 1/(2*pi*f_HP); %low-pass frequency
f_DT1 = 30; %frequency of real differentation
T_DT1 = 1/(2*pi*f_DT1); %time-constant of real differentiation

f_TP = 100;
T_TP = 1/(2*pi*f_TP);
num_TP = 1;
den_TP = [T_TP^2 1.41*T_TP 1];
tf1 = tf(num_TP, den_TP);
tf1 = tf([tf1,0,0,0; 0,tf1,0,0; 0,0,tf1,0; 0,0,0,tf1]);
tfss = ss(tf1);

num_TP = 1;
den_TP = [0.02 1];
tf1 = tf(num_TP, den_TP);
tf1 = tf([tf1,0,0; 0,tf1,0; 0,0,tf1]);
tfss2 = ss(tf1);

%% Inverse Kinematik
rechts = -1;
links = 1;

KCistL = [ 63232, 33526 ; 33526, 63438 ];
KCist_invL = KCistL^-1;
C_inv_L=zeros(3,3);
C_inv_L(2:3,2:3)=-1*KCist_invL;

KCistR = [ 63232, -33526 ; -33526, 63438 ];
KCist_invR = KCistR^-1;
C_inv_R=zeros(3,3);
C_inv_R(2:3,2:3)=-1*KCist_invR;

%% Controller Parameter
c_rel = [0 0 0];
d_rel = [0 0 0];
c_sky = [0 0 0];
d_sky = [5000 5000 200];
Ki    = [0 0 0];
 


und der oben beschriebenen function optimization.m
Code:

%% Optimization

function [energy, discomfort] = optimization(d_sky)
energy = 5;
discomfort = 0;
mdl = 'LinMod_R2008a';
    load_system(mdl)
   
    % Einstellungen der Simulation
    set_param(mdl, 'SimulationMode', 'normal')
    set_param(mdl, 'Solver', 'ode45')

    % Start und Stop an Simulation übergeben
    set_param(mdl, 'StartTime', '0.0')
    set_param(mdl, 'StopTime', 'timeint')

   % Simulation Starten
   sim(mdl, 'SrcWorkspace', 'base');
end
 


Wenn ich in init.controler.m die d_sky parameter verändere und die Simulation direkt starte ändern sich auch die werte und ich habe energy und discomfort im Workspace stehe.
Wenn ich die Funktion mit
Code:

[a,b]=optimization([5000 5000 200])
aufrufe kommt jetzt leider nur noch a=5 und b=0
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.10.2012, 21:30     Titel:
  Antworten mit Zitat      
Hallo,

du wirst wohl nicht darum herumkommen, dass du eben nur einen der Workspaces als SrcWorkspace angeben kannst. Wenn du da den Base Workspace nimmst, wird auch d_sky im Base Workspace gesucht und nicht wie von dir gewünscht im Funktionsworkspace.

Es wäre geschickter, wenn du eine Parameterstruktur statt viele einzelne Parameter hättest. Die könnte man nämlich auch schön mit übergeben. So wird das einfachste sein, in optimization.m die setup.m auszuführen und 'SrcWorkspace' auf 'Current' zu setzen. Das versucht man zwar aus Effizienzgründen meist zu vermeiden, es sollte aber keinen allzu großen Unterschied machen, da die Simulink-Simulation deutlich länger brauchen wird.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 22.10.12
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 23.10.2012, 12:05     Titel:
  Antworten mit Zitat      
Wenn ich doch in der Funktion die Setup.m aufrufe werden meine Variablen nachher bei der Optimierung bei jedem neuen Aufruf der Funktion alle neu geladen, wobei auch jedes mal die in init.controler.m gespeichten Anfangswerte für d_sky wieder geladen würden. Diese sollen aber durch das programm verändert werden bzw. erstmal beim start neu vergeben werden.

Es funktioniert leider so nicht wenn ich das so mache ist mein Workspacefenster leer und sowohl für energy als auch discomfort kommen die oben in der Funktion angegebenen werte raus.

Wenn ich die optimization.m folgendermaßen schreibe, d.h. sim(mdl) ohne weitere beschreibung lasse
Code:

%% Optimization
function [energy, discomfort] = optimization(d_sky)
energy = 0;
discomfort = 0;

mdl = 'LinMod_R2008a';
    load_system(mdl)
   
    % Einstellungen der Simulation
    set_param(mdl, 'SimulationMode', 'normal')
    set_param(mdl, 'Solver', 'ode45')

    % Start und Stop an Simulation übergeben
    set_param(mdl, 'StartTime', '0.0')
    set_param(mdl, 'StopTime', 'timeint')
   
   % Simulation Starten
   sim(mdl);
end
 

und mit
Code:
[a,b]=optimization
aufrufe bekomme ich die korrekten werte heraus.

Mein Simulimkmodell sieht folgendermaßen aus und die Fahrwerksparameter werden unter 'PARAMETER' (zweites Bild) übergeben





kann es sein, dass ich anstatt des Constat-Block zum Beispiel ein From Workspace (simin) Block brauche?
Private Nachricht senden Benutzer-Profile anzeigen
 
jasicha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 22.10.12
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 23.10.2012, 14:17     Titel:
  Antworten mit Zitat      
Ein Meilenstein Very Happy

Es läuft endlich so, dass man im Command Window die gewünschten d_sky-Parameter eingeben kann und die Funktion mit diesen Parametern das Simulink-Modell ausführt und mir die Daten für Energy und Discomfort in den Workspace schreibt.

Wen es interresiert:

Aufruf:
Code:

[energy, discomfort]=optimization([3000 3000 100])
 


optimization.m
Code:

function [energy, discomfort] = optimization(eingang)

energy = 0;
discomfort = 0;

global d_sky;
global y;
global z;
global phi;

d_sky = eingang;
y = d_sky(1,1);
z = d_sky(1,2);
phi = d_sky(1,3);


mdl = 'LinMod_R2008a';
    load_system(mdl)
   
    % Einstellungen der Simulation
    set_param(mdl, 'SimulationMode', 'normal')
    set_param(mdl, 'Solver', 'ode45')

    % Start und Stop an Simulation übergeben
    set_param(mdl, 'StartTime', '0.0')
    set_param(mdl, 'StopTime', 'timeint')
   
   % Simulation Starten
   sim(mdl);
end
 


auszug aus der init_Controller.m
Code:

%% Controller Parameter
c_rel = [0 0 0];
d_rel = [0 0 0];
c_sky = [0 0 0];
global d_sky; global y; global z; global phi;
d_sky = [y z phi];
Ki    = [0 0 0];
 


jetzt werde ich mich mal an die Optimierung mache und meine Fragen wieder hier stellen Smile

Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

globale Variablen sind eine Möglichkeit, Variablen in mehreren Workspaces zur Verfügung zu haben, aber eine eher unschöne. Die sauberste Möglichkeit ist wie gesagt, die unveränderlichen Parameter in einer Struktur zusammenzufassen.

Dann sähe es so aus:
Code:
function f = optimization(x, params)

und als Zielfunktion würde man folgendes nehmen:
Code:
params = ...; % Parameter-Struktur anlegen
objective = @(x) optimization(x, params)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 22.10.12
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 23.10.2012, 19:18     Titel:
  Antworten mit Zitat      
Hallo Harald,
wie lege ich denn eine Parameter-struktur genau an? von welcher Art ist diese?

ist denn nicht meine init.controller.m eine Parameterstruktur?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

suche bitte in der Dokumentation nach "structure array" und lies dir das durch. In 2012b findet man das unter "MATLAB" --> "Language Fundamentals" --> "Data Types".

Die Idee ist, deine vielen Parameter so in eine Parameter-Variable zusammenzufassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 24.10.2012, 13:28 Uhr von denny
Von Programmierung nach Simulink
 
jasicha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 22.10.12
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 13.11.2012, 16:20     Titel:
  Antworten mit Zitat      
Das Problem ist gelöst. Hier das Ergebnis des Simulationsaufrufes.

Code:
%% Optimization
function F = fun(d_sky)

    setup;
   
    % Einstellungen der Simulation
    simoptions = simset('DstWorkspace','current','SrcWorkspace','current');
 
   % Simulation Starten
   sim('LinMod',[0 timeint], simoptions);
   
   F(1)=energy.signals.values;
   F(2)=discomfort.signals.values;
   
end


Die Struktur und der Inhalt der anderen m-files hat sich ebenfalls etwas geändert. Falls interesse daran besteht kann ich diese auch noch posten.

Danke,
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2013, 10:32     Titel:
  Antworten mit Zitat      
Mich würde das interessieren Wink ...
 
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 - 2024 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.