Verfasst am: 22.10.2012, 11:04
Titel: Eingangsparameter Funktion werden nicht angenommen
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.
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.
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.
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
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?!
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.
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]
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
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.
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
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.
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.
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
Verschoben: 24.10.2012, 13:28 Uhr von denny Von Programmierung nach Simulink
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,
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.01.2013, 10:32
Titel:
Mich würde das interessieren ...
Einstellungen und Berechtigungen
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.