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

Auswerten einzelner Matrixzeilen

 

Redwall
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 22.08.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2021, 15:07     Titel: Auswerten einzelner Matrixzeilen
  Antworten mit Zitat      
Hallo,

(*glaube hier gehört der Beitrag eher hin?*)

ich bin dabei das Implizite Verfahren (finite-Differenzen-Methode) in Matlab zu implementieren und stoße beim Lösen des Gleichungssystems auf das Problem, dass Matlab mir einen Fehler wegen nicht übereinstimmender Dimensionen anzeigt.

Hier mein Code:

Code:


clc;
clear all;
close all;

T=6;
L=1;

ImpJJ=30; % Gitterzellen im Ortsintervall
ImpII=60; %Gitterzellen im Zeitintervall

Impdz=L/ImpJJ; %Aquidistante Gitterabstände in Ort und Zeit
Impdt=T/ImpII;

c=1;

ImpvI=Impdz/Impdt; %numerische Informationsgeschwindigkeit

%Initialisierung der Ergebnismatrix

nz = zeros(ImpII+1,ImpJJ+1);

%Definition der Startverteilung

x=[0:0.01:0.5];
syms n01(x);
n01(x)=sin(pi*x/L);

%Erste Zeile der Ergebnismatrix mit den Werten der Startverteilung füllen

for j=1:1:ImpJJ+1
    nz(1,j)=n01((j-1)*Impdz);
end

for i=1:1:ImpII+1
   nz(i,1)=0;       %Festlegen der Randbedingung am linken Rand des Orsgittes
   nz(i,ImpJJ+1)=0;    %Festlegen der Randbedingung am rechten Rand des Orsgittes
end    

%Initialisierung der Tridiagonalmatrizen

tdm1=zeros(ImpJJ-1,ImpJJ-1);

tdm2=zeros(ImpJJ-1,ImpJJ-1);

tdm3=zeros(ImpJJ-1,ImpJJ-1);

%Füllen der Haupt- und Nebendiagonalen der Tridiagonalmatrix 1

%1) Hauptdiagonale

for j=1:1:ImpJJ-1
    tdm1(j,j)=(1+(c^2)/(2*ImpvI^2));
end

%2) Obere Nebendiagonale

for j=1:1:ImpJJ-2
    tdm1(j,j+1)=-c^2/(4*ImpvI^2);
end

%2) Untere Nebendiagonale

for j=1:1:ImpJJ-2
    tdm1(j+1,j)=-c^2/(4*ImpvI^2);
end

%Füllen der Haupt- und Nebendiagonalen der Tridiagonalmatrix 2

%1) Hauptdiagonale

for j=1:1:ImpJJ-1
    tdm2(j,j)=2*(1-2*c^2)/(2*ImpvI^2);
end

%2) Obere Nebendiagonale

for j=1:1:ImpJJ-2
    tdm2(j,j+1)=c^2/(2*ImpvI^2);
end

%2) Untere Nebendiagonale

for j=1:1:ImpJJ-2
    tdm2(j+1,j)=c^2/(2*ImpvI^2);
end

%Füllen der Haupt- und Nebendiagonalen der Tridiagonalmatrix 3

%1) Hauptdiagonale

for j=1:1:ImpJJ-1
    tdm3(j,j)=(-1-c^2)/(2*ImpvI^2);
end

%2) Obere Nebendiagonale

for j=1:1:ImpJJ-2
    tdm3(j,j+1)=c^2/(4*ImpvI^2);
end

%2) Untere Nebendiagonale

for j=1:1:ImpJJ-2
    tdm3(j+1,j)=c^2/(4*ImpvI^2);
end

%Definiere Vektor zum Eintragen der Dichtewerte der Gegenwart

V1=zeros(1,ImpJJ-1);

V2=zeros(1,ImpJJ-1);

%Berechnung der zukünftigen Dichtewerte und Eintragen in die entsprechende
%Zeile der Ergebnismatrix

for j=2:1:ImpJJ
nz(2,2:ImpJJ)=linsolve(tdm1,(tdm2.*nz(1,2:ImpJJ)));
end

for i=2:1:ImpII
%Übertrag der alten Dichtewerte in den Gegenwartsvektor
    V1 =nz(i,2:ImpJJ);
    V2= nz(i-1,2:ImpJJ);
   
%Lösung des LGS und Eintrag in die entspr. Zeile des Ergebnisvektors
    nz(i+1,2:ImpJJ)=linsolve(tdm1,(tdm2.*(V1'))+(tdm3.*(V2')));

end

 


Bis zur Deklaration der Vektoren V1 und V2 läuft das Programm.
Den ersten Fehler bekomme ich, wenn ich:

Code:


Code:

%Berechnung der zukünftigen Dichtewerte und Eintragen in die entsprechende
%Zeile der Ergebnismatrix

for j=2:1:ImpJJ
nz(2,2:ImpJJ)=linsolve(tdm1,(tdm2.*nz(1,2:ImpJJ)));
end
 
 



auswerten will. Dabei möchte ich lediglich die zweite Zeile der Ergebnismatrix nz auswerten.
Die Fehlermeldung lautet dazu:
Zitat:

Unable to perform assignment because the size of the left side is 1-by-29 and the size of the right side is 29-by-29.


Im letzten Schritt:

Code:


for i=2:1:ImpII
%Übertrag der alten Dichtewerte in den Gegenwartsvektor
    V1 =nz(i,2:ImpJJ);
    V2= nz(i-1,2:ImpJJ);
   
%Lösung des LGS und Eintrag in die entspr. Zeile des Ergebnisvektors
    nz(i+1,2:ImpJJ)=linsolve(tdm1,(tdm2.*(V1'))+(tdm3.*(V2')));
end
 
 


sollen dann die übrigen Zeilen der Matrix nz bestimmt werden.

Würde mich freuen, wenn mir jemand weiterhelfen könnte.
Schonmal Danke im Vorraus Smile

Grüße,
Martin
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

Zitat:
(*glaube hier gehört der Beitrag eher hin?*)

Wenn keine Antwort kommt, ist das Problem meist weniger das passende Unterforum als die Formulierung der Frage.

Der Code ist recht länglich, aber was du eigentlich erreichen willst, weiß ich trotzdem nicht recht. Ich versuche es mal:

Code:
for j=2:1:ImpJJ
    tmp = linsolve(tdm1,(tdm2.*nz(1,2:ImpJJ)));
    nz(2,2:ImpJJ)= tmp(2,:);
end

?

Falls das nicht das gewünschte ist, müsste ich eben erst mal verstehen, was du mit der Zeile, die den Fehler wirft, beabsichtigst. Wie nun die beteiligten Variablen erstellt wurden, ist recht gleichgültig.

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
 
Redwall
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 22.08.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2021, 10:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

das hat mir schon weitergeholfen. Vielen Dank!

Grüße
Martin
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.