|
|
Matrix ändern und für nächsten Zeitschritt bereitstellen |
|
Hiwi-Job |
Forum-Fortgeschrittener
|
|
Beiträge: 71
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: Hannover
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 07.11.2013, 14:05
Titel: Matrix ändern und für nächsten Zeitschritt bereitstellen
|
|
|
|
|
Hallo zusammen,
ich möchte in meinem Simulink-Modell in jedem Zeitschritt eine Matrix bearbeiten und für den nächsten Zeitschritt bereitstellen. Leider komme ich in diesem Zusammenhang nicht mit den "from workspace" und "to workspace" - Blöcken klar.
Oder gibt es eine Möglichkeit, so etwas direkt in Simulink zu realisieren (ohne den Umweg über den workspace von Matlab)?
Zur Verdeutlichung mal ein Beispiel:
Die Simulationszeit ist in Sekunden angegeben, in der Matrix ändert sich nur jede Stunde etwas. Die fixe Schrittweite beträgt 3600.
Ich habe dann folgende Matrix:
(Die Spalte 1 habe ich eingefügt, da -soweit ich das verstanden habe- der "from workspace"-Block diese benötigt. Für die Berechnungen ist die Spalte nicht relevant.)
Nun möchte ich die Matrix im ersten Zeitschritt in Simulink in einem MATLAB-Function-Block bearbeiten.
Zum Beispiel möchte ich an Stelle 1, 3 eine 2 schreiben, an die Stelle 2,3 eine 1 usw. usw.
Danach möchte ich die veränderte Matrix wieder speichern (für den nächsten Schritt bereithalten).
Im zweiten Schritt möchte ich die veränderte Matrix nun wieder im MATLAB-Function-Block bearbeiten. Dazu kann es nötig sein auch auf Werte von Zeile eins zugreifen zu müssen.
Verändert wird dann wieder die Stelle 2,3 und 3,3 und 4,3 usw. usw.
Danach wieder speichern usw. usw.
Ich würde mich sehr freuen, wenn mir jemand kurz erklären könnte wie ich grundsätzlich vorzugehen habe und wie ich auf einzelne Werte der Matrix innerhalb des MATLAB-Function-Blocks zugreifen kann.
Grüße,
Ingo
|
|
|
|
|
Bibonaut |
Forum-Fortgeschrittener
|
|
Beiträge: 60
|
|
|
|
Anmeldedatum: 06.06.13
|
|
|
|
Wohnort: Berlin
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 07.11.2013, 21:02
Titel:
|
|
Hallo,
spontan fällt mir eine vielleicht nicht ganz so saubere Lösung ein:
Wenn du die Anzahl deiner Interationsschritte kennst, könntest du eine Matrix mit zeros(n,m,anzahl_Iterationsschritte) initialisieren und die matrix (:,:,1) mit deinen Eingangswerten belegen.
In der Matlab-Function könntest du dann deine neuen Werte in (:,:,Iterationsschritt) schreiben und behältst gleichzeitig deine älteren Matrizen. Mit dem simout-Block erzeugst du so allerdings massig überflüssige Daten, da für jeden Zeitschritt die komplette 3 dimensionale Matrix gespeichert wird. Es sei denn, du kannst festlegen, dass dir nur die Matrix des letzten Iterationsschritts in den Workspace ausgegeben wird.
Das weiß ich aber gerade nicht
Vielleicht hilfts als Denkanstoß!
Viele Grüße
Alex
|
|
|
Hiwi-Job |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 71
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: Hannover
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 08.11.2013, 15:30
Titel:
|
|
Hallo Alex,
danke für die Idee. Ich befürchte nur, dass die sowieso schon sehr langsame Simulation dann vollends nicht mehr in einer vernünftigen Zeit zu berechnen ist. Die Matrix hat im ersten Teststadium schon knapp 10.000 Zeilen und es werde später noch mehr sein.
Hat noch jemand eine weitere Idee?
Grüße,
Ingo
|
|
|
Bibonaut |
Forum-Fortgeschrittener
|
|
Beiträge: 60
|
|
|
|
Anmeldedatum: 06.06.13
|
|
|
|
Wohnort: Berlin
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 10.11.2013, 17:41
Titel:
|
|
Hi,
bei so einer Größe muss es dann wohl doch etwas sauberer gelöst werden
Benötigst du immer nur die letzte? Wie wäre einer Rückkopplung und einem Memory-Block? Ich hab es noch nie ausprobiert, aber soll mal so als Idee in den Raum gestellt werden
Viele Grüße und Erfolg
Alex
|
|
|
Hiwi-Job |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 71
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: Hannover
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 12.11.2013, 08:48
Titel:
|
|
Bibonaut hat Folgendes geschrieben: |
[...]Benötigst du immer nur die letzte? [...] |
Hallo Alex,
was meinst du mit "nur die letzte"? Ich brauche immer nur eine Matrix, immer die, die im letzten Schritt geändert wurde. Allerdings brauche ich nicht immer nur die letzte Zeile der Matrix sondern im schlechtesten Fall (dessen Auftreten ich nicht beeinflussen kann) auch Werte aus einer der ersten Zeilen.
Eine Einschränkung kann ich machen, ob das hilft, kann ich aber nicht beurteilen: Bei jedem Durchlauf werden "nur" noch Daten von Zeilen nach/unter einer gewissen Zeile verändert. Sprich in Runde 50 werden "nur" noch die Zeilen 50 bis Ende verändert. Zugegriffen werden muss dabei allerdings auf die Zeilen 1 bis Ende.
Grüße,
Ingo
|
|
|
Bibonaut |
Forum-Fortgeschrittener
|
|
Beiträge: 60
|
|
|
|
Anmeldedatum: 06.06.13
|
|
|
|
Wohnort: Berlin
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 12.11.2013, 09:44
Titel:
|
|
Sorry, ich meinte die letzte Matrix... . Unklar formuliert.
Ich hab mal kurz ein kleines Beispiel gebastelt, um zu zeigen, wie ich mir das vorgestellt habe:
Du führst die berechnete Matrix um einen Zeitschritt verzögert zurück, sodass du sie im nächsten Zeitschritt verwenden kannst.
Setz in der Matlab-Fcn mal einen Breakpoint und schau dir die Variablen u1 und u2 an. In dem Beispiel wird auf die Eingangsmatrix (rand(5)) einfach in jedem Zeitschritt eine 1 addiert (Ausgang) und im nächsten Zeitschritt als u2 in der Funktion wieder zur Verfügung gestellt.
Viele Grüße
Alex
Beschreibung: |
|
Download |
Dateiname: |
test.slx |
Dateigröße: |
13.89 KB |
Heruntergeladen: |
562 mal |
|
|
|
Hiwi-Job |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 71
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: Hannover
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 12.11.2013, 17:21
Titel:
|
|
Hallo Alex,
kein Problem, hatte ich mir ja fast gedacht, dass wir das selbe meinen.
Entweder ich habe dich falsch verstanden, oder aber dein Beispiel tut bei mir nicht das was es soll.
Wenn ich das Beispiel laufen lasse, müsste ja nach 10 Zeitschritten in Zelle1,1 statt einer 0,96 eine 10,96 oder zumindest 9,96 stehen. Bei mir gibt er aber eine 1,96 aus. Sprich er addiert immer wieder zur Ausgangsmatrix eine 1 behält aber die veränderte Matrix nicht für den nächsten Schritt.
Grüße,
Ingo
p.s.: Mal ganz platt gefragt, ist es überhaupt sinnvoll für ein quasi-stationäres Modell so einen Aufwand zu betreiben oder wäre es dann sinnvoller direkt in Matlab zu programmieren/rechnen?
Beschreibung: |
|
Download |
Dateiname: |
test.slx |
Dateigröße: |
18.42 KB |
Heruntergeladen: |
519 mal |
|
|
|
Bibonaut |
Forum-Fortgeschrittener
|
|
Beiträge: 60
|
|
|
|
Anmeldedatum: 06.06.13
|
|
|
|
Wohnort: Berlin
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 12.11.2013, 19:22
Titel:
|
|
War nicht so ganz richtig, was ich da in den Anhang gepackt habe... Wenn du eine Matrix für t=0 als Anfangsbedingung hast, muss die auch in dem Memory-Block als Initial Condition stehen. Da hab ich vorhin nicht dran gedacht.
Was willst du denn genau machen? Hast du ein dynamisches System? Generell würde ich behaupten, kannst du alles auch mit Matlab machen.
Viele Grüße und im Anhang nochmal ....
Alex
Beschreibung: |
|
Download |
Dateiname: |
test.slx |
Dateigröße: |
17.25 KB |
Heruntergeladen: |
530 mal |
|
|
|
Hiwi-Job |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 71
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: Hannover
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 13.11.2013, 08:33
Titel:
|
|
Hallo Alex,
super, danke! So könnte es wohl tatsächlich funktionieren. Ich werde das gleich mal ausprobieren.
Danach entscheide ich dann, ob ich nur noch mit Matlab oder mit Matlab und Simulink arbeiten werde (für dieses System).
Grüße,
Ingo
|
|
|
Hiwi-Job |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 71
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: Hannover
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 13.11.2013, 09:43
Titel:
|
|
Und es funktioniert wirklich
Und so ganz langsam ist es auch nicht
Danke nochmal!
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|