Verfasst am: 30.01.2012, 21:36
Titel: symbolic Object und Simulink
Hallo Zusammen,
ich bin Matlab-neuling und arbeite damit für meine Studienarbeit also habt bitte etwas nachsehen mit mir wenn es um detaillierte Fragen geht. Für mein Bewegungsmodell arbeite ich mit Matlab u Simulink. Hierfür benutze ich für Berechnung symbolic Objects für einige Berechnungen.
Code:
%
syms x y z
syms x1 y1 z1
syms x_n_E1 y_n_E1 z_n_E1
syms x_r_0M y_r_0M z_r_0M
syms x_e_zR1 y_e_zR1 z_e_zR1
syms t
P = [x,y,z];
P1 = [x1,y1,z1];
n_E1=[x_n_E1,y_n_E1,z_n_E1];
r_0M=[x_r_0M,y_r_0M,z_r_0M];
e_zR1=[x_e_zR1,y_e_zR1,z_e_zR1];
Deffiniere ich diese beim jeden neuen Zeitschritt, funtkioniert es. Es ist aber sehr langsam. Um Zeit zu sparen will ich diese am Anfang also bei t=0 (wenn das Modell startet) deffinieren und deffiniere sie nicht bei jedem Durchlauf erneut. Danach rechne ich mit diesen folgendermaßen weiter: Innerhalb des Simulink-Modells greife ich mittels einer "Level-2 MATLAB S-Function" auf eine m-file zu wo folgende Berechnung gemacht werden:
allerdings läuft die Berechnung nur ein Zeitschritt durch und sagt beim nächsten Zeitschritt, dass planefunction nicht deffiniert ist.
Alternativ wollte ich das Deffinieren der symbolic Objects vor dem Starten im Callback erledigen. Allerdings weiß ich nicht, wie ich die symbolic objects als source aus dem Workspace in das Simulink bringen kann. Ein Constant-Block geht dafür nicht weil er nur numerische Variablem macht.
Ich wäre sehr glücklich wenn jemand von den vielen klugen Köpfen hier eine Idee hätte wie ich das lösen kann.
danke für deine Hilfe aber ich stehe da noch etwas auf dem Schlauch. Wenn ich deinen Ansatz benutze dann komme ich nicht ganz weiter. Wenn ich damit rechne, komme ich auf einen Punkt in Abhängigkeit von t. Aber der Schnittpunkt soll frei von Variablen sein wenn folgende Variablen bekannt sind: (Diese Variabelen Ändern sich im Verlauf der Dynamischen Simulation und werden im Vorfeld berechnet)
Ich habe für die Variablen mal Beispielwerte gepostet um das zu verdeutlichen. Nach deinen Ansatz ist der Schnittpunkt (In deinem Beipiel haben 2 Klammern gefehlt, die ich ergänzt habe)
Dann läuft er den ersten Zeitschritt korrekt durch und sagt mir beim nächsten Zeitschritt:
Undefined function or variable "Schnittpunkt_fct".
Er kennt also auf einmal die Schnittpunkt_fct nicht mehr, die ich am Anfang deffiniert habe.
Deswegen hatte ich mir schonmal überlegt, die Diffinition der Schnittpunkt_fct in der Callback auszuführen und sie dann ähnlich eines Constant-Blocks bei jedem Zeitschritt wieder in das Simulink zu bringen. Aber ich kenne keinen Source-Block, der eine 1x3sym vom Workspace ins Simulink bringen kann.
Meine zweite Idee war es die Schnittpunkt_fct einen Memory-Block zu übergeben, der sie dann bei jedem Zeitschritt wieder ausgibt. Allerdings nimmt der nur numerische oder logische Arrays.
Okey,
also ich benutze es ja dynamisch im Simulink also mit fortlaufenden Zeitschritten. Bei jedem Zeitschritt wird die Berechnung benötigt. Im genauen ist es ein Teil einer Berechnung zum Kontaktpunkt eines Reifens auf den Boden, der sich im Laufe der Fahrt ändert weil sich das Fahrzeug bewegt. Deswegen wird im Laufe der Simulation mehrfach auf die Berechnung zurückgegriffen.
Aus Rechentechnischen Gründen möchte ich es aber etwas schneller machen weil die Deklaration der symbolischen Objekte viel Rechenzeit in Anspruch nehmen.
Das es die Deklaration und nicht was anderes ist weiß ich aus dem Profiler von Matlab.
Daher würde ich gern die Deffinition der symbolischen oder analytischen Formel für den Schnittpunkt am Anfang, also bei t=0, erledigen. Bei fortlaufender Zeit (t) ändern sich dann die Werte, welche ich als Beispiel schon einmal gepostet hatte aber nicht die Formel an sich. Mit diesen neuen Werten und der vorgebenen analytischen Formel möchte einfach den neuen Schnittpunkt berechnen ohne neu deffinieren zu müssen.
Ich hoffe ich konnte mich so ausdrücken, dass es verständlich ist.
Da haben wir uns etwas mißverstanden. Warum du es machen willst ist mir klar. Mir ging es um die Umsetzung. Wo steht die Initiallisierung?
Unter edit mask -> Initialization
unter file->model properties ->callbacks
oder innerhalb der s-function in der Methode 'InitializeConditions'
oder ganz wo anders?
Warum bist du dir sicher das er beim ersten Zeitschritt noch alles richtig macht? Gegebenenfalls wäre der Quellcode und die Fehlermeldung interressant.
oh ok,
also es handelt sich nicht um ein S-fuction Block sondern um ein Level-2 MATLAB S-function Block. Dieser hilft mir eine m-file aus ein Simulink-Modell aufzurufen, in welche die Berechnungen stehen. Das klappt soweit auch ganz gut. Vielleicht fragst du jetzt warum ich das so löse und nicht innerhalb eines normalen Matlab-Blockes. Der Grund ist, dass einige Rechnungen wie interp2 und andere, die ich ausführe ein Matlab Block nicht mitmacht während es innerhelb einer m-file funktioniert.
Bisher steht die Deklaration am Anfang in dieser m-file innerhalb einer If Zeit==0 Anweisung. Sicherlich nicht elegant aber tut erstmal sein Zweck.
Alternativ hatte ich es auch mal über file->model properties ->callbacks probiert. Aber die deffiniert ja nun im Workspace und mir fehlt die Möglichkeit eine 1x3sym value aus dem Workspace wieder in das Simulink zu holen um damit weiter zu rechnen, bzw. sie in ein Import Port des Level-2 MATLAB S-function Block sie der Rechnung wieder zuzuführen.
Das es beim ersten Zeitschritt funktioniert weiß ich daher, dass ich mir einige Werte im Workspace anzeigen lasse bzw. einige Schritt mit disp-Anweisung versehen habe um zu schauen was er macht.
Beim zweiten Schritt kommen die Fehlermeldungen:
Error evaluating registered method 'Outputs' of MATLAB S-Function 'Kontaktpunkt' in 'Reifen_Boden_Simulation_Pacejka/Kontaktpunkt/Level-2 MATLAB S-Function1'. The following is the MATLAB call stack (file names and line numbers) that produced this error:
['C:\Dokumente und Einstellungen\Andreas\Desktop\Diplomarbeit\Matlab\Reifen_Boden_Simulation\Kontaktpunkt.m'] [279]
und
Undefined function or variable "Schnittpunkt_fct".
Dabei ist der parameter_1 der erste Parameter den du in das Feld s-function parameters einträgst.
In deinem Fall musst du also Schnittpunct_fct im workspace oder in edit mask-> Initilization berechnen und als Parameter übergeben.
Schau dir am besten mal ein paar demos an: http://www.mathworks.de/help/toolbo.....g/f7-67622.html#brgsb9k-1
vielen Dank für den Tip. Ungefähr so hatte ich mir das auch vorgestellt. Allerdings bekomme ich das immernoch nicht ganz hin. schreibe ich die deffinition in edit mask-> Initilization meckert er wegen dem dem syms. Anscheinend lässt er dort keine symbolischen Objekte zu. Deffiniere ich es im Callback und führe es über Parameter den S-function Block zu funktioniert das auch soweit.
Ich erhalte in der m-file die komplette symbolische Formel und kann sie unter schnittpunkt-fcn speichern. Allerdings erhalte ich wenn ich mit dieser weiterrechne mittels des subs-Befehls kein Ergebnis. Also wirklich kein Egebnis, leere Menge. Kein Fehler oder Abbruch ...einfach nix.
Ich habe mir den Parameter mal im Hauptfenster von Matlab angeschaut und der sagt mir, dass dieser nur eine 1x1sym ist wenn ich sie mittels Parameter übernehme. Eigentlich ist sie eine 1x3sym. Könnte es daran liegen? Muss ich also irgendwo noch die Dimension deklarieren und wenn wo?
Gruß
Andreas
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.