Ich muss einen einfachen Finite Differenzen Löser schreiben. Dazu habe ich ein Gitter angelegt und die inneren Knotenpunkte zusammen mit der entsprechenden zeilenweisen Nummerierung in ein Cell geschrieben. Nun möchte ich mittels einer entsprechenden if-Abfrage die direkten Nachbarn der einzelnen Punkte finden und den dazugehörigen Eintrag in der Matrix setzen. Mein Programm funktioniert auch soweit und die if-Abfrage ist meiner Meinung nach korrekt. Doch Matlab macht anscheinend willkürlich bei einigen Bedingungen das was es soll und bei anderen aber nicht. Ich habe unter den eigentlichen Code nochmal für mich nur die if-Abfrage anhand zweier Einträge aus dem Cell überprüft. Die eine Bedingung ist für Matlab erfüllt, die andere nicht, obwohl beide eindeutig erfüllt sein müßten.
Code:
clc;
clearall;
a=5;
b=5;
h=1/a;
[X,Y]=meshgrid(0+h:h:1-h,0+h:h:1-h);
f=2*pi^2*sin(pi*X)*sin(pi*Y);
k=0;
for i=1:a-1 for j=1:b-1
k=k+1;
C(k)={[k X(i,j) Y(i,j)]};
end end for n=1:(a-1)*(b-1) for m=1:(a-1)*(b-1) if(n==m)
A(n,m)=4;
elseif(C{n}(3)-h==C{m}(3) && C{n}(2)==C{m}(2))
A(n,m)=-10;
elseif(C{n}(2)-h==C{m}(2) && C{n}(3)==C{m}(3))
A(n,m)=-1;
elseif(C{n}(2)+h==C{m}(2) && C{n}(3)==C{m}(3))
A(n,m)=-10;
elseif(C{n}(3)+h==C{m}(3) && C{n}(2)==C{m}(2))
A(n,m)=-10;
else A(n,m)=0;
end end end
A
n=12
m=8
C{12}
C{8} if(C{n}(3)-h==C{m}(3))
n=100 end
C{14}
C{10}
n=14
m=10 if(C{n}(3)-h==C{m}(3))
n=50 end
Wie gesagt, die beiden letzten Anweisungen sind nur zum testen gewesen.
Wenn man es laufen lässt ist die erste nicht erfüllt, die zweite aber schon. Ich bin mit meinem Latein am Ende.
nur eine Anmerkung: das mit dem ungenaueren Rechnen ist keine Eigenheit von MATLAB, sondern tritt immer ein, wenn mit Gleitkommazahlen gerechnet wird.
Wenn man exakte Resultate möchte, sollte man eine symbolische Umgebung nutzen - innerhalb MATLAB gibt es dafür die Symbolic Math Toolbox.
Grüße,
Harald
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.