Verfasst am: 03.11.2022, 11:06
Titel: 2D Wärmeleitungsgleichung in Matlab
Hallo,
ich versuche die 2D Wärmeleitungsgleichung mit Orts und Zeitabhängigen Randbedingungen mittels implizitem SOR Algorithmus zu lösen.
Die Umsetzung für konstante Werte an den Rändern ist simpel. Bei der Implementierung der Raum und Zeitabhängigkeit habe ich einige Probleme.
Der Code für die konstanten BC's ist folgender:
Code:
%********Transiente Wärmeleitungsgleichung implizite SOR Methode**********
clc clearall closeall
%Input Parameter
nx=100; % Anzahl der Knoten in x
ny=100; % Anzahl der Knoten in y
nt=50;
L=2; % Länge der Plate
H=0.75; % Höhe der Plate
x=linspace(0,L,nx);% Knotenvektor in x
y=linspace(0,H,ny);% Knotenvektor in y
dx=x(2)-x(1); % Abstand zwischen zwei Knoten in x
dy=y(2)-y(1); % Abstand zwischen zwei Knoten in x
ct=1;
gs=1;
for k=1:nt
Fehler=9e9;
time(k)=k*dt;
while(Fehler>Toleranz) for i=2:nx-1 for j=2:ny-1
T(i,j)=((Tini(i,j)*m1))+(m2*(T(i-1,j)+Talt(i+1,j)))+(m3*(T(i,j+1)+Talt(i,j-1)));
Tfinal(i,j)=((1-omega)*Talt(i,j))+(T(i,j)*omega);
end end
Fehler=max(max(abs(Talt-T)));
Talt=Tfinal;
gs=gs+1;
end
Tini=Tfinal;
% Ergebnissplot des Temperaturfeldes figure(1)
Ich versuche die Temperatur auf den Rändern zum einen als variable Werte in Abhängigkeit von der Position auf der jeweiligen Kante einzubinden (Links, Oben und Rechts). Unten soll ein Raum und Zeitabhängiger Wärmestrom angesetzt werden.
Die räumliche Variabilität wollte ich erstmal in Form von simplen linearen Funktionen einbinden.
Habe mir dazu folgenden Ansatz überlegt:
Code:
for k=1:nt
for i=1:nx
for j=1:ny
if j==1% Knoten der Kante unten
time=k*dt;
x=i*dx;
TB=ab*x+bb;
T(i,j)=TB;
elseif j==ny % Knoten der Kante oben
time=k*dt;
x=i*dx;
TT=at*x+bt
T(i,j)=TT;
else end end end for j=1:ny
for i=1:nx
if i==1% Knoten der Kante Links
time=k*dt;
y=j*dy;
TL=aL*y+bL;
T(i,j)=TL;
elseif i==nx % Knoten der Kante Rechts
time=k*dt;
y=j*dy;
TR=aR*y+bR;
T(i,j)=TR;
else end end end
T(1,1)=(TL+TT)/2;
T(nx,ny)=(TR+TB)/2; % Update der Temperatur
T(1,ny)=(TT+TR)/2;
T(nx,1)=(TL+TB)/2;
end
Ich habe es leider noch nicht geschafft meinen Ansatz um ein variablen Wärmestrom unten zu erweitern und in den funktionierenden Code für die konstanten Randbedingungen einzubinden.
Vieleicht hat ja jemand einen Hinweis bzgl. des Problems
reicht es nicht aus, die Variable time in der Berechnung von T in der gewünschten Form zu verwenden?
Generell würde ich zu Vektorisierung raten. Das macht den Code kompakter, lesbarer und beschleunigt in der Regel die Berechnungen. Für die Aktualisierung der Temperaturen in der while-Schleife kannst du
filter2
verwenden.
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 ;)
vielen Dank für deine Antwort.
Wenn ich die loops für die Randknoten in den Loop implementiere dann rechnet Matlab ohne einen Ende zu finden. Irgendwo habe ich einen Fehler eingebaut.
Die Schleifen laufen nicht wie geplant.
Code:
%********Transiente Wärmeleitungsgleichung implizite SOR Methode**********
clc clearall closeall
%Input Parameter
nx=100; % Anzahl der Knoten in x
ny=100; % Anzahl der Knoten in y
nt=50;
L=2; % Länge der Plate
H=0.75; % Höhe der Plate
x=linspace(0,L,nx);% Knotenvektor in x
y=linspace(0,H,ny);% Knotenvektor in y
dx=x(2)-x(1); % Abstand zwischen zwei Knoten in x
dy=y(2)-y(1); % Abstand zwischen zwei Knoten in x
ct=1;
gs=1;
for k=1:nt
Fehler=9e9;
time(k)=k*dt;
while(Fehler>Toleranz) for i=1:nx
for j=1:ny
if j==1
time=k*dt;
x=i*dx;
TB=aB*x+bB;
T(i,j)=TB;
elseif j==ny
time=k*dt;
x=i*dx;
TT=aT*x+bT;
T(i,j)=TT;
else end end end for j=1:ny
for i=1:nx
if i==1
time=k*dt;
y=j*dy;
TL=aL*y+bL;
T(i,j)=TL;
elseif i==nx
time=k*dt;
y=j*dy;
TR=aR*y+bR;
T(i,j)=TR;
else end end end
T(1,1)=(TL+TT)/2;
T(nx,ny)=(TR+TB)/2;
T(1,ny)=(TT+TR)/2;
T(nx,1)=(TL+TB)/2;
for i=2:nx-1 for j=2:ny-1
T(i,j)=((Tini(i,j)*m1))+(m2*(T(i-1,j)+Talt(i+1,j)))+(m3*(T(i,j+1)+Talt(i,j-1)));
Tfinal(i,j)=((1-omega)*Talt(i,j))+(T(i,j)*omega);
end end
Fehler=max(max(abs(Talt-T)));
Talt=Tfinal;
gs=gs+1;
end
Tini=Tfinal;
% Ergebnissplot des Temperaturfeldes figure(1)
die Initialisierung würde ich nicht in die while-Schleife packen.
Bei so länglichem Code kann ich dir nur empfehlen, das zu machen, was ich auch machen würde: debuggen und schauen, ob das Problem liegt. Und natürlich wie gesagt: vektorisieren. Dann ist das ganze lesbarer.
Das einzige, was mir auffällt: sollte
T(i,j)=((Tini(i,j)*m1)) ... nicht
T(i,j)=((Talt(i,j)*m1)) .. sein?
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 ;)
ich habe den Part mit der Erstellung der Temperaturwerte an den Rändern separat getestet.
Er enthält Randbedingungen die einen linear ansteigenden Verlauf aufweisen.
Der Code ist folgender:
Code:
% Randbedigungen an den Kanten des Rechtecks
nx=6; % Anzahl der Knoten in x
ny=6; % Anzahl der Knoten in y
nt=2;
dt=1e-3; % Zeitschrittweite
L=0.01; % Länge der Plate
H=0.01; % Höhe der Plate
x=linspace(0,L,nx);% Knotenvektor in x
y=linspace(0,H,ny);% Knotenvektor in y
dx=x(2)-x(1); % Abstand zwischen zwei Knoten in x
dy=y(2)-y(1); % Abstand zwischen zwei Knoten in x
% Initiale Temperatur
Tini=00;
T=Tini*ones(nx,ny);
T0=T;
TL=75; % Linke Seite
TR=115; % Rechte Seite
TT=100; % Oben
TB=100; % Unten
% Initialisierung an den Rändern for j=1:ny
if j==1 for i=2:nx-1
T(i,1)=TL;
end elseif j==ny
for i=2:nx-1
T(i,ny)=TR;
end else end end for i=1:nx
if i==1 for j=2:ny-1
T(1,j)=TT;
end elseif i==nx
for j=2:ny-1
T(nx,j)=TB;
end else end end
T1=T;
% Temperaturen an den Eckpunkten
T(1,1)=(TL+TT)/2; % Links oben
T(nx,ny)=(TR+TB)/2; % Rechts unten
T(1,ny)=(TT+TR)/2; % Rechts oben
T(nx,1)=(TL+TB)/2; % Links unten
aR=1e04;
bR=TR;
aL=2e4;
bL=TL;
aT=1e04;
bT=TT;
aB=1e04;
bB=TB;
% RB in Form von räumlichen Temperaturfunktionen an den Rändern % Links und Rechts for j=1:ny
if j==1 for i=2:nx-1
yy=i*dy;
TL=aL*yy+bL;
T(i,1)=TL;
end elseif j==ny
for i=2:nx-1
yy=i*dy;
TR=aR*yy+bR;
T(i,ny)=TR;
end else end end
T2=T;
% Oben und Unten for i=1:nx
if i==1 for j=2:ny-1
xx=j*dx;
TT=aT*xx+bT;
T(1,j)=TT;
end elseif i==ny
for j=2:ny-1
xx=j*dx;
TB=aB*xx+bB;
T(nx,j)=TB;
end else end end % Temperaturen an den Eckpunkten
T(1,1)=(TL+TT)/2; % Links oben
T(nx,ny)=(TR+TB)/2; % Rechts unten
T(1,ny)=(TT+TR)/2; % Rechts oben
T(nx,1)=(TL+TB)/2; % Links unten
Das funktioniert soweit ganz gut (Siehe Bild "Randbedigungen als f(x bzw. y)".
Wenn ich jetzt die Loops einbinde dann scheint etwas noch nicht zu funktionieren.
Ich habe die Methode abgeändert und das implizite Crank-Nicholson Verfahren verwendet.
for k=1:nt
Fehler=9e9;
time(k)=k*dt;
while(Fehler>Toleranz) % Temperaturen an den Randpunkten % RB in Form von räumlichen Temperaturfunktionen an den Rändern % Links und Rechts for j=1:ny
if j==1 for i=2:nx-1
yy=i*dy;
TL=aL*yy+bL;
T(i,1)=TL;
end elseif j==ny
for i=2:nx-1
yy=i*dy;
TR=aR*yy+bR;
T(i,ny)=TR;
end else end end % Oben und Unten for i=1:nx
if i==1 for j=2:ny-1
xx=j*dx;
TT=aT*xx+bT;
T(1,j)=TT;
end elseif i==ny
for j=2:ny-1
xx=j*dx;
TB=aB*xx+bB;
T(nx,j)=TB;
end else end end % Temperaturen an den Eckpunkten
T(1,1)=(TL+TT)/2; % Links oben
T(nx,ny)=(TR+TB)/2; % Rechts unten
T(1,ny)=(TT+TR)/2; % Rechts oben
T(nx,1)=(TL+TB)/2; % Links unten % Aktualisierung der Temperaturwerte
Talt=T;
Tprev = Talt;
% Temperaturen in den inneren Knoten for i=2:nx-1 for j=2:ny-1
V=(Tprev(i+1,j)+Tprev(i-1,j)+Tprev(i,j+1)+Tprev(i,j-1));
H=(Talt(i+1,j)+Talt(i-1,j)+Talt(i,j+1)+Talt(i,j-1));
T(i,j)=(Tprev(i,j)*m1)+(m3*H)+(m2*V);
end end
Fehler=max(max(abs(Talt-T)));
Talt=T;
cn=cn+1;
end
Tprev=T;
Fehler=9e9;
Rechenzeit=toc;
% Ergebnissplot des Temperaturfeldes figure(1)
ich kann mich bei meinen Empfehlungen nur wiederholen:
1. Debugggen um den Fehler zu finden
2. Vektorisieren. Code wird lesbarer, übersichtlicher, und vielleicht erledigt sich damit auch der Fehler.
3. Überlegen, ob die Randbedingungen wirklich in der while-Schleife gesetzt werden sollen.
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 ;)
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.