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

Neste for-loop

 

Detox
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 25.10.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 22.10.2016, 23:40     Titel: Neste for-loop
  Antworten mit Zitat      
Guten Abend,

ich versuche eine Matrix zu erzeugen indem ich in der ersten Spalte die Parameter hineinschreibe (in dem Fall Masse) und in die anderen Spalten die Y Werte zu den jeweils ausgewerteten Zeiten.
Code:

for row_index = 1:10
      for col_index = 1:length(time)
        Matrix(row_index,column_index) = [mass(row_index)];
      end
    end


Kennt jemanden einen eleganteren Weg bzw. wo mein Denkfehler genau ist?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.10.2016, 09:26     Titel:
  Antworten mit Zitat      
Hallo,

wo kommen diese besagten y-Werte denn her?
Auf der rechten Seite der Zuweisung ist keine Abhängigkeit von col_index, d.h. du würdest 10 mal dasselbe zuweisen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 25.10.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 23.10.2016, 10:27     Titel:
  Antworten mit Zitat      
Hi Harald,

die y-Werte sind aus der Lösung der ODE (ordinary diff. eq.) und diese möchte ich praktisch rechts neben die Masse listen. Dachte, dass das am Elegantesten mit der nested-loop funktioniert.

P.S: Der gepostete Code ist natürlich nicht vollständig. Wollte fragen, ob du irgendwo optimierungs-/verbesserungsbedarf siehst.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn mehrere Spaltenvektoren nebeneinander geschrieben werden sollen, dann reicht normalerweise auch eine for-Schleife über die Spalten, und oft reicht schon [ , ].

Die entscheidende Frage ist, wie deine Daten vorliegen bzw. erzeugt werden. Das geht aus dem Beitrag aber nun einmal nicht hervor.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.10.2016, 10:10     Titel: Re: Neste for-loop
  Antworten mit Zitat      
Hallo Detox,

Die Frage ist nicht klar. Was sind die "Y-Werte" im Code? Wie soll das Ergebnis aussehen?
Der Code ist verwirrend. "col_index" ist vermutlich das gleiche wie "column_index", aber was ist "time"?

ich versuche eine Matrix zu erzeugen indem ich in der ersten Spalte die Parameter hineinschreibe (in dem Fall Masse) und in die anderen Spalten die Y Werte zu den jeweils ausgewerteten Zeiten.
Code:
Matrix = zeros(10, 15);
for row_i= 1:10
  y = rand(1, 14);
  Matrix(row_i, 1) = mass(row_i);
  Matrix(row_i, 2:15) = y;
end

Vielleicht so.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Detox
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 25.10.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 24.10.2016, 16:02     Titel:
  Antworten mit Zitat      
Hi Jan und Harald,

danke für eure Hilfe und Sorry für meine verwirrte Schreibweise und den mageren Input Very Happy Very Happy

Hier mal meine Lösung. Die Y-Werte werden von dem ode45-Solver errechnet.

Code:
mm = 1;
    for jj = 1:10
        [time,eks]=ode45(@Exp_01,ts,y0,SolverOptionen,mass(mm));
        for row_index = 1:10
            Matrix(row_index,column_index) = mass(row_index);
        end
            for kk = 2:length(time)+1    
            Matrix(jj,kk) = eks(kk-1);
            end
            mm = mm + 1;
    end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

diese Idee setzt voraus, dass ode45 unabhängig von mass immer gleich viele Zeitschritte macht. Um das sicherzustellen, muss ts ein Vektor mit mehr als 2 Elementen sein. Ist das bei dir der Fall?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 25.10.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 26.10.2016, 21:16     Titel:
  Antworten mit Zitat      
Hi Harald und sorry für die späte Antwort.

Nun meine Initial Conditions sehen so aus:

Code:
% 2. Initial Conditions

y0 = [0.01; 0];
ts = [0, 10];


Kannst du erklären, warum es mehr als 2 Einträge sein müssen? Oder ist das trivial?

Danke schonmal für deine Bemühungen und Hilfe Cool
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Kannst du erklären, warum es mehr als 2 Einträge sein müssen? Oder ist das trivial?

Wenn ich jetzt sage, dass das trivial ist, dann hilft dir das nicht weiter, oder? :P
Also: Weil es laut Doku so sein muss, um die Lösung zu festen Stützstellen zu bekommen. Das ist wiederum nötig, wenn du die Lösungen in verschiedenen Spalten einer Matrix anordnen möchtest.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 25.10.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 27.10.2016, 21:24     Titel:
  Antworten mit Zitat      
Danke Harald.

Das verstehe ich aber trotzdem nicht ganz. Erzeugt er mir nicht für jedes FESTES t einen jeweiligen y-Wert, welcher dann in einer neuen Zeile zugewiesen wird? Sieht bei mir zumindest so aus. Die Doku sagt hinsichtlich den "mehr als zwei Einträgen" folgendes:

Evaluation points, returned as a column vector.

•If tspan contains two elements, [t0 tf], then t contains the internal evaluation points used to perform the integration.

•If tspan contains more than two elements, then t is the same as tspan.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.10.2016, 23:51     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Erzeugt er mir nicht für jedes FESTES t einen jeweiligen y-Wert, welcher dann in einer neuen Zeile zugewiesen wird?

Für jedes Element von t bzw. bei dir time, ja. Nur: wie wird denn time gewählt? Wenn tspan zwei Elemente hat, dann enthält time die internen Zeitschritte, und die sind je nach Dynamik der DGL unterschiedlich. Wenn tspan mehr als zwei Elemente hat, dann sollte time im Grunde tspan sein.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 25.10.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 28.10.2016, 09:10     Titel:
  Antworten mit Zitat      
Hi Harald,

heisst das dann,dass er die internen Zeitschritte variiert bei 2 Elementen ergo die Nachkommastellen je nach (wie du schon sagtest) Dynamik der DGL variieren!?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.10.2016, 10:13     Titel:
  Antworten mit Zitat      
Hallo,

kannst du ja mal ausprobieren:

Code:
[t, y] = ode45(@(t,x) -x, [0 10], 1);
whos t y
[t, y] = ode45(@(t,x) -2*x, [0 10], 1);
whos t y

[t, y] = ode45(@(t,x) -x, 0:0.1:10, 1);
whos t y
[t, y] = ode45(@(t,x) -2*x, 0:0.1:10, 1);
whos t y


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 25.10.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 28.10.2016, 10:28     Titel:
  Antworten mit Zitat      
Danke dir Harald,

hat auf jeden Fall sehr geholfen fürs Verständnis und dann noch mit solch einem einfachen Code als Demonstration Cool Besten Dank und dir noch ein schönes Wochenende Smile
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 - 2025 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.