Verfasst am: 26.08.2009, 00:29
Titel: Bitte um Hilfe bei Logikfehler
Hallo ich muss mal wieder nerven ^__^
Eure Hilfestellungen waren bis jetzt immer extrem gut und haben mir immer weiter geholfen (scheiss deutsch, ich weiss, aber ich bin auch schon Muede).
Nun habe ich wieder ein neues Problem, die for schleife an sich funktioniert - ich habs schon ausprobert.
Das Problem scheint sich auf die Beiden Gleichungen:
Matlab wirft mir immer die Fehlermeldung raus: Inner Matrix dimensions must agree...
Ich versteh das irgendwie nicht - in den Arrays stecken jeweils 22 Matrizen. Jede der Matrizen ist gleich gross, naehmlich 90x180, wo bitte kommt der Fehler her? Was habe ich falsch gemacht? Und wie kann man es richtig machen?
Koennte es vielleicht daran liegen wie ich die Arrays aufgebaut habe? Ganz unten poste ich noch schnell ein Beispiel wie ich das gemacht habe, dann koennt ihr Euch entweder ueber mich scheckig lachen, weil ich einen Anfaengerfehler gemacht habe, oder mit mir zusammen raetzeln was genau nicht stimmt... Ich hatte schon mehrere Probleme mit dieser Passage, alle hab ich loesen koennen, aber es scheint als wuerde hinter jeder Loesung ein neues Problem lauern...
Das ist der Code - veilleicht liegt es doch an der Schleife???
Code:
g(i,j)=0;
for l = 1:180
delta_theta(l) =theta(l)-theta(l+1);
for m=1:360
delta_phi(m) = phi(m)-phi(m+1);
for i=1:90 for j=1:180 for p=1:22
g(i,j) = G*(1./layer_depth{1,p})*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
for a=1:90 for b=1:180 for k=1:22
V=G*(1./(layer_depth{1,p}-layer_depth{1,k}))*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
end end end end end end end end
Ich kann mir nicht vorstellen, dass der Code das beabsichtigte tut, da die rechten Seiten in den Zuweisungen für g(i,j) und V(a,b) nicht von i, j bzw. a, b abhängen.
Zudem habe ich persönlich noch nie einen Fall gesehen, wo ein derartiges Ineinanderschachteln von 8 for-Schleifen notwendig oder sinnvoll war. Die innerste Schleife würde 180*360*90*180*22*90*180*22 = 8.231e+015 Mal durchlaufen. Dann mal viel Geduld
Das problem ist das ich das Gravitationspotential von 180*90*22 Bloecken ausrechen muss und jeder Block wird nun mal durch alle anderen auch beeinflusst - der Einfluss mag gering sein je weiter weg der Block ist, aber er ist immernoch da. Deswegen sehe ich keinen anderen Weg als die Schleifen so zu bauen.
Mir ist schon klar das Matlab vielleicht nicht die passende Sprache ist um dieses Problem umzusetzen, aber es ist nun mal die einzige mit der ich wenigstens ein bisschen Erfahrung habe - minimalst - und Programmieren ist ohnehin nicht so meine Staerke, aber ich glaube ich hab durch dieses Projekt schon eine ganze Menge gelernt und bin da auch sehr stolz drauf. Die Sache ist nur die, da ich eben schon so weit vortgeschritten bin und auch nicht mehr so viel Zeit habe muss ich es einfach irgendwie mit Matlab hinbekommen.
Koennte ich die Schleifen vielleicht mit der eval() Funktion umgehen und das alles damit etwas beschleunigen? Aber leider werde ich aus dem was auf dem helpdesk steht ueber die eval() funktion nicht wirklich schlau... Und koennte diese Funktion vielleicht mein Problem loesen?
hier 2 Punkte, die in Deinem Programm nicht richtig sein können:
1. Das Ergebnis sollte jeweils eine (90x180)-Matrix sein, richtig? In g(i,j) steht aber ein Skalar (Du initialisierst ja mit g(i,j)=0), und da gibt es sicher die Fehlermeldung "??? Subscripted assignment dimension mismatch." Probier's mal mit g{i,j} statt g(i,j).
2. Wie schon erwähnt, läuft p+1 bis 23, d.h. Du mußt entweder layer_depth bis 23 definieren oder diesen Fall anders behandeln.
Alles andere sollte stimmen - wenn auch nicht besonders effizient gelöst
das von mir beschriebene Problem der vielen Iterationen ist kein MATLAB-spezifisches, sondern ein konzeptionelles, das unabhängig von der Programmiersprache auftauchen wird.
Vielleicht können wir dir besser weiterhelfen, wenn du mal die Formeln zur Verfügung stellst, die du modellieren willst.
Danke fuer die Tipps ich hab jetzt die initialisierung statt von Matrizen in arrys umgebaut (also mit den geschrweiften Klammern) und mit zeros(90,180) statt mit 0. Leider schmeisst es noch den selben Fehler raus....
Die Formel die ich versuche umzusetzen ist:
g{i,j}=G*1/r*Summe ueber die Dichte in jedem Kugelschalensegment* Volumen Kugelschalensegment
V{a,b,p}=G*1/(distanz vom in g{i,j} beobachteten Segment zu allen anderen jeweils) * Summe ueber die jeweilige dichte des Kugelschalensegments dessen Distanz zur g{i,j} betrachtet wird * Volumen dieses Kugelschalensegments
und letztendlich sollte es dann so aussehen:
Potential{i,j} = g{i,j} + V{a,b,p} + Potential{i,j}
Vielen Dank fuer Eure Hilfe ^__^
Im Moment sieht es so aus:
Code:
potential{i,j}=zeros(90,180);
g{i,j}=zeros(90,180);
V{a,b,k}=zeros(90,180,22);
for l = 1:180
delta_theta(l) =theta(l)-theta(l+1);
for m=1:360
delta_phi(m) = phi(m)-phi(m+1);
for i=1:90 for j=1:180 for p=1:22
g{i,j} = G*(1./layer_depth{1,p})*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
for a=1:90 for b=1:180 for k=1:22
V{a,b,k}=G*(1./(layer_depth{1,p}-layer_depth{1,k}))*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
end
potential{i,j}=g{i,j}+V{a,b,k}+potential{i,j};
end end end end end end end
noch eine letzte Zwischenfrage, bevor wird völlig aneinander vorbeireden: Sind die Größen radi1, radi2 usw. Skalare oder (90x180)-Matrizen?
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.