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

For Schleife - Tensor dritter Stufe Zwischenwerte speichern

 

Vertikarl
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.01.22
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2022, 21:38     Titel: For Schleife - Tensor dritter Stufe Zwischenwerte speichern
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine verschachtelte For-Schleife für eine Matrix (X,Y,M), dabei sind X und Y die ebenen Koordinaten und M die Zeit. Damit soll eine instationäre Wärmeübertragung nachgestellt werden.
Dies ist nur ein Beispielcode im kleinen Format. Für die spätere Anwendung wird dieser für die Zeitschrittweiten und Schrittweiten in beide Raumrichtungen auf größere Werte ausgebaut.

Dazu habe ich nun folgende Frage:
Wie kann ich mir beispielsweise die Temperaturmatrix in jedem 4. Zeitschritt in einer anderen Matrix abspeichern während dem Durchlaufen der for-Schleife?

Für die spätere Anwendung wird es wohl jeder 100-ste sein.

Vielen Dank im Vorraus!

Code:


%Beispiel-Code

Lx = 5; %Länge in x VORGABE [m]
Ly = Lx; %Länge in y VORGABE
Nx = 5; %Knotenanzahl
Ny = Nx; %Knotenanzahl

% Vektorlänge
x = linspace(0,Lx,Nx+1);    %
y = linspace(0,Ly,Ny+1);

%Vektorschrittweite
dx = x(2)-x(1);     %Schrittweite in x-y gleich groß [m]
dy = y(2)-y(1);

%Zeitschritte
dt = 0.1;           %Schrittweite der Zeit BEISPIEL [s]

%Zeitvektor
tmax = 1; %maximale Zeitdauer BEISPIEL [s]
t = 0:dt:tmax; %Zeitvektor

%Temperaturmatrix
T = zeros(length(x),length(y),length(t));  

%Anfangsrandbedingung
[X,Y,M]=size(T);  
T(1,:,:) = 300;               %Hier steht keine Smiley, sondern nur ein Doppelpunkt mit einer Klammer zu

%Vorfaktor 1
K1 = 1-(4*a*dt/(dx)^2); %Aus Formel

%Vorfaktor 2
K2 = a*dt/(dx)^2;     %Aus Formel

%Input Temperatur
Temp = ([300:1:311])';  %Vorgabe

for m = 1:length(t)-1  
for i = 2:length(x)-1   %Zeile
for j = 2:length(y)-1   %Spalte
    T(i,j,m+1)=K1*T(i,j,m)+K2*(T(i-1,j,m)+T(i+1,j,m)+T(i,j-1,m)+T(i,j+1,m))
   
    T(1,:,m+1)= Temp(m,1)    

end
end
end
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.427
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.01.2022, 12:22     Titel:
  Antworten mit Zitat      
Hallo,

ich verstehe die Frage nicht.
Was ist "die Temperaturmatrix"? T? Das sammelst du doch für jeden Zeitschritt?
Willst du das auf jeden 4. Zeitschritt reduzieren? Oder soll von vorneherein nur jeder 4. Zeitschritt abgespeichert werden?

Drei geschachtelte for-Schleifen sind hinsichtlich Laufzeit sehr ineffizient. Die zwei inneren Schleifen lassen sich vektorisieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Vertikarl
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.01.22
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2022, 21:56     Titel:
  Antworten mit Zitat      
Hallo Harald,

in der Temperaturmatrix ist die Temperatur für jeden Knoten eines FE-Gitters zum Zeitpunkt m hinterlegt. Damit versuche ich eine instationäre Temperaturverteilung in einem 2D Modell nachzubilden.

Ich habe mich wohl missverständlich ausgedrückt, ich meine die zweite Option.

Die Temperatur innerhalb der Matrix sammele ich zwar für jeden Zeitschritt, jedoch möchte lediglich jeden bspw. 4-ten Zeitschritt abspeichern.

Da die Zeitschritte für die spätere Anwendung durch ein formelles Stabilitätskriterium
extrem klein sind, ist es nicht sehr sinnvoll jeden Zeitschritt darzustellen. Ich habe vor diese Zwischenergebnisse im Nachhinein zu plotten, um die zeitliche Ausbreitung der Temperatur nachzustellen.

Wie würde eigentlich eine solche Vektorisierung aussehen?

Grüße,

Vertikarl
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Im Nachhinein reduzieren:
Code:
T2 = T(:, :, 1:4:end);


Wenn du in Speicherprobleme laufen solltest, solltest du aber von vorneherein nur jeden 4. bzw. 100. Zeitschritt abspeichern statt im Nachhinein zu reduzieren.

Zur Vektorisierung kannst du in diesem Fall i und j jeweils durch 2:end-1 ersetzen. i+1 und j+1 bzw. i-1 und j-1 verschieben sich entsprechend zu 3:end bzw. 1:end-2. Komplett:
Code:
T2(2:end-1,2:end-1,m+1)=K1*T2(2:end-1,2:end-1,m)+K2*(T2(1:end-2,2:end-1,m)+T2(3:end,2:end-1,m)+T2(2:end-1,1:end-2,m)+T2(2:end-1,3:end,m));


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Vertikarl
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.01.22
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2022, 22:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank, das hat bisher soweit alles gut funktioniert! (sowie im kleinen als auch im großen Modell)

Nun möchte ich noch nach jedem 100-sten Zeitschritt einen neuen Temperaturwert, welcher in einem Vektor (kleinerer Dimension als die Matrix) hinterlegt ist, auf die erste Zeile(erste Knotenschicht des FE-Gitters) aufprägen.

Wie könnte man so etwas umsetzen?

Viele Grüße,

Vertikarl
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.427
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.02.2022, 12:08     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Nun möchte ich noch nach jedem 100-sten Zeitschritt einen neuen Temperaturwert, welcher in einem Vektor (kleinerer Dimension als die Matrix) hinterlegt ist, auf die erste Zeile(erste Knotenschicht des FE-Gitters) aufprägen.

Für mich ist es schon mal schwierig zu verstehen, was du genau programmiertechnisch möchtest. Tendieren würde ich zu etwas wie:

Code:
if mod(m, 100) == 0
T(1, :, m) = ...
end


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.