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

symbolic Object und Simulink

 

andreas22285
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2012, 21:36     Titel: symbolic Object und Simulink
  Antworten mit Zitat      
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];

planefunction = dot(n_E1, P-P1);
linefunction = r_0M + t*(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:

Code:
%
                plane=subs(planefunction);
                line=subs(linefunction);

                newfunction = subs(plane, P, line);

                t0 = solve(newfunction);
                Schnittpunkt = subs(line, t, t0);
 


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.
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2012, 06:58     Titel:
  Antworten mit Zitat      
Hallo,

warum berechnest du den Schnittpunkt denn nicht analytisch:

Code:

Schnittpunkt =
 
[ x_r_0M+(conj(x_n_E1)*x_r_0M+conj(x_n_E1)*t*x_e_zR1+conj(y_n_E1)*y_r_0M+conj(y_n_E1)*t*y_e_zR1-conj(y_n_E1)*y1+conj(z_n_E1)*z_r_0M+conj(z_n_E1)*t*z_e_zR1-conj(z_n_E1)*z1)/conj(x_n_E1)*x_e_zR1,

 y_r_0M+conj(x_n_E1)*x_r_0M+conj(x_n_E1)*t*x_e_zR1+conj(y_n_E1)*y_r_0M+conj(y_n_E1)*t*y_e_zR1-conj(y_n_E1)*y1+conj(z_n_E1)*z_r_0M+conj(z_n_E1)*t*z_e_zR1-conj(z_n_E1)*z1)/conj(x_n_E1)*y_e_zR1,

z_r_0M+conj(x_n_E1)*x_r_0M+conj(x_n_E1)*t*x_e_zR1+conj(y_n_E1)*y_r_0M+conj(y_n_E1)*t*y_e_zR1-conj(y_n_E1)*y1+conj(z_n_E1)*z_r_0M+conj(z_n_E1)*t*z_e_zR1-conj(z_n_E1)*z1)/conj(x_n_E1)*z_e_zR1]
 


und verwendest die Lösung dann in Simulink? Oder du rechnest gleich numerisch?

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2012, 22:05     Titel:
  Antworten mit Zitat      
Hallo Thomas84,

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)

Code:
%
P1 = [0 14.5500 0.0712];
n_E1 = [-0-0030 -0.0021 1.2100];
r_0M = [0 15.0000 0.7000];
e_zR1 = [-0.0254 -0.0246 0.9994];
 


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)

Code:
%
Schnittpunkt =
[ x_r_0M+conj(x_n_E1)*x_r_0M+conj(x_n_E1)*t*x_e_zR1+conj(y_n_E1)*y_r_0M+conj(y_n_E1)*t*y_e_zR1-conj(y_n_E1)*y1+conj(z_n_E1)*z_r_0M+conj(z_n_E1)*t*z_e_zR1-conj(z_n_E1)*z1)/conj(x_n_E1)*x_e_zR1,

  y_r_0M+conj(x_n_E1)*x_r_0M+conj(x_n_E1)*t*x_e_zR1+conj(y_n_E1)*y_r_0M+conj(y_n_E1)*t*y_e_zR1-conj(y_n_E1)*y1+conj(z_n_E1)*z_r_0M+conj(z_n_E1)*t*z_e_zR1-conj(z_n_E1)*z1)/conj(x_n_E1)*y_e_zR1,

  z_r_0M+conj(x_n_E1)*x_r_0M+conj(x_n_E1)*t*x_e_zR1+conj(y_n_E1)*y_r_0M+conj(y_n_E1)*t*y_e_zR1-conj(y_n_E1)*y1+conj(z_n_E1)*z_r_0M+conj(z_n_E1)*t*z_e_zR1-conj(z_n_E1)*z1)/conj(x_n_E1)*z_e_zR1]
 



Schnittpunkt =

(12517917941*t)/7500000000000 + 869263912379981400827/1351079888211148800000000

(4041217603*t)/2500000000000 + 6755680069562890293208141/450359962737049600000000

911553466864632765827303/1351079888211148800000000 - (492535716151*t)/7500000000000


Mit meiner bisherigen Formel komme ich auf folgendes Ergebnis:

Schnittpunkt =

[ 96507681/9856628300, 147942892569/9856628300, 3102404519/9856628300]

Also wie mache ich weiter damit die Ergebnisse auch nach deiner Methode stimmen?


liebe Grüße
Andreas
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


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

% analytische Lösung

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];

planefunction = dot(n_E1, P-P1);
linefunction = r_0M + t*(e_zR1);

planefunction

linefunction

% plane=subs(planefunction);
% line=subs(linefunction);
% newfunction = subs(plane, P, line);

newfunction = subs(planefunction, P, linefunction);

newfunction

t0 = solve(newfunction,'t');

t0

Schnittpunkt = subs(linefunction, t, t0);

Schnittpunkt

% Werte einsetzen
x1 = 0;
y1 = 14.5500;
z1 = 0.0712;
x_n_E1 = -0-0030;
y_n_E1 =  -0.0021;
z_n_E1 = 1.2100;
x_r_0M = 0;
y_r_0M = 15.0000 ;
z_r_0M = 0.7000;
x_e_zR1 = -0.0254;
y_e_zR1 =-0.0246;
z_e_zR1 =0.9994;

Schnittpunkt = subs(Schnittpunkt);

Schnittpunkt

 


Bei dem solve Befehl hat noch das 't' gefehlt. Jetzt stimmen die Werte mit deinen überein.
Private Nachricht senden Benutzer-Profile anzeigen
 
andreas22285
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2012, 15:42     Titel:
  Antworten mit Zitat      
Hallo Thomas84,
vielen Dank für deine Mühe!

Die Ergebnisse stimmen jetzt aber das Problem bleibt das selbe.

Deffiniere ich
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_fct = [x,y,z];
P1_fct = [x1,y1,z1];
n_E1_fct=[x_n_E1,y_n_E1,z_n_E1];
r_0M_fct=[x_r_0M,y_r_0M,z_r_0M];
e_zR1_fct=[x_e_zR1,y_e_zR1,z_e_zR1];

planefunction = dot(n_E1_fct, P-P1_fct);
linefunction = r_0M_fct + t*(e_zR1_fct);

newfunction = subs(planefunction, P_fct, linefunction);

t0 = solve(newfunction,'t');

Schnittpunkt_fct = subs(linefunction, t, t0);
 


am Anfang des Durchlaufes und will im späteren Verlauf nur bei jedem Zeitschritt auf

Code:
%
Schnittpunkt = subs(Schnittpunkt_fct);
 


zugreifen.

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.

Hast du eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
andreas22285
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2012, 18:26     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 07:11     Titel:
  Antworten mit Zitat      
Ich weiss nicht genau was du mit Anfang des Durchlaufes meinst. Kannst du das noch genauer beschreiben?
Private Nachricht senden Benutzer-Profile anzeigen
 
andreas22285
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 12:01     Titel:
  Antworten mit Zitat      
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.


Gruß

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

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 12:51     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
andreas22285
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 14:27     Titel:
  Antworten mit Zitat      
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".
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2012, 06:50     Titel:
  Antworten mit Zitat      
Gut. Jetzt verstehe ich was falsch läuft. Parameter kann man wie folgt laden:

Code:

parameter_1 = block.DialogPrm(1).Data;
 


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

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2012, 22:35     Titel:
  Antworten mit Zitat      
Hallo Thomas,

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
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 - 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.