Array werte speichern und für berechnungen nutzen

Guten Abend liebes Forum =)

Ich habe vor kurzem damit angefangen eine Simulation zur wärmeausbreitung in einem Raum zu Programmieren.

Dazu habe ich ein 3D Array erstellt. An der Stelle zum zum Beispiel [3 , 3 , 3 ] befindet sich die Heizung bzw Die Temperatur von 55 grad.

Mit Hilfe der Formel bestimme ich nun die wärmeabgabe an die Felder links rechts oben und unten von dem feld [3,3,3]. Nun haben diese felder nach dem 1 durchlauf zum beispiel 2 grad schon.

Nun muss ich diese Werte aber irgendwie Abspeichern um die Werte im 2. durchlauf nutzen nutzen zu können. diese ganzen neuen werte muessen dann WIEDER gespeichert werden fuer alle nachfolgende berchnungen. Im endeffekt stecken sich somit irgendwann alle felder nacheinander mit der wärme an bis zum beispie zum zeitpunktl t = 100.

ich habe aber keine Ahnung wie ich das machen soll.

Vll kann mir einer schnell ein fallbeispiel geben worauf ich aufbauen kann. =)

liebe grüße
 
Spricht irgendwas dagegen die neuen Werte direkt an die Position des Arrays zu speichern?
also:
Java:
array[x][y][y] = calculateTemprature();
 
Spricht irgendwas dagegen die neuen Werte direkt an die Position des Arrays zu speichern? [...]

Wahrscheinlich, es ist anzunehmen das die Berechnung eine bestimmte Umgebung der Werte verwendet um einen neuen Temperaturwert zu errechnen, würde das in die Quelldaten geschrieben werden änderten sich dadurch ständig die Basiswerte.

[...]Nun muss ich diese Werte aber irgendwie Abspeichern um die Werte im 2. durchlauf nutzen nutzen zu können. [...]

Dann tu das doch, d.h. du arbeitest mit zwei 3D-Feldern A und B, dann schreibst die Berechnungen auf Basis von A in Feld B, bist du mit dem Durchgang fertig wird B die neue Basis und du überschreibst alle Werte in A mit den Werten aus dem nächten Durchgang. Z.B. das Game of Life funktioniert ähnlich.
 
Danke für eure antworten ich glaub nvidia du meinst das rictig wenn du sagst das die berechnung eine bestimmte umgebung der werte verwendet. ich berechne halt bestimmte felder im array. diese berechneten felder werden dann immer in den naechsten schleifendurchgängen benötigt fuer die weitere berechnungen neuer felder . Ich glaube ich versteh das noch nicht ganz !!! :-/

ich habe jetzt 2 arrays.

raumtemp[][][]; und
raumtempNeu[][][];

1 Durchlauf: werte für raumtempNeu werden berechnet.
ab 2 Durchlauf (if zeit > 0 ) raumtemp = raumtempNeu.

oder wie muss ich das machen ich bin verwirrt irgendwie :-/

Ich glaub den sinn verstehe ich ich habe ein array dann berechne ich neue werte. diese neuen werte muessen dann die neue basis werden mit denen im nächsten durchlauf gerechnet wird. dann ist der 3. schleifendurchgang dran da muss ja wieder das selbe passieren also wieder gewechselt werden und und und.

im moment sieht das bei mir so aus ..ich weiß das ist warscheinlich noch käse aber vll kann mir ja jemand von euch nochmal helfen =)


Code:
raumTemp[0][3][0]=100;
           
             while(zeit<5){
                 System.out.println("Temperatur Schritt " + zeit);
                 if(zeit>0){
                     raumTemp=raumTempneu;
                 }
               
               
               
             for(int posX = 0; posX < x; posX++) {
    
                 for(int posY = 0; posY < y; posY++) {
         
                     for(int posZ = 0; posZ < z; posZ++) {
                       
                         //System.out.print("Heizung: (" + raumTempneu[0][3][0]   + ")");
               
                         // Hier berechnung der ganzen felder
                       
                         //Ecken unten
                         if(posX ==0 && posY==0 && posZ==0){
                       
                             raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(3*raumTemp[posX][posY][posZ]-raumTemp[posX+1][posY][posZ]-raumTemp[posX][posY+1][posZ]-raumTemp[posX][posY][posZ+1]);
                             System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                           
                         }
                             else if(posX ==0 && posY==4 && posZ==0){
                                // System.out.print("HierHierHier(" + raumTempneu[0][3][0]   + ")");
                                 raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(3*raumTemp[posX][posY][posZ]-raumTemp[posX+1][posY][posZ]-raumTemp[posX][posY-1][posZ]-raumTemp[posX][posY][posZ+1]);
                                 System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                               
                             }
                       
                         else if(posX ==4 && posY==0 && posZ==0){
                               
                                 raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(3*raumTemp[posX][posY][posZ]-raumTemp[posX-1][posY][posZ]-raumTemp[posX][posY+1][posZ]-raumTemp[posX][posY][posZ+1]);
                                 System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                             }
                       
                         else if(posX ==4 && posY==4 && posZ==0){
                               
                                 raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(3*raumTemp[posX][posY][posZ]-raumTemp[posX-1][posY][posZ]-raumTemp[posX][posY-1][posZ]-raumTemp[posX][posY][posZ+1]);
                                 System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                             }
                       
                         //Ecken oben
                         else if(posX ==0 && posY==0 && posZ==2){
                       
                             raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(3*raumTemp[posX][posY][posZ]-raumTemp[posX+1][posY][posZ]-raumTemp[posX][posY+1][posZ]-raumTemp[posX][posY][posZ-1]);
                             System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                           
                         }
                             else if(posX ==0 && posY==4 && posZ==2){
                               
                                 raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(3*raumTemp[posX][posY][posZ]-raumTemp[posX+1][posY][posZ]-raumTemp[posX][posY-1][posZ]-raumTemp[posX][posY][posZ-1]);
                                 System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                             }

                       
                                                                .
                                                                .
                                                                .

                       
                         //Allgemein Decke
                         else if(posX > 0 && posX<4 && posY > 0 && posY < 4 && posZ==2){
                           
                             raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(5*raumTemp[posX][posY][posZ]-raumTemp[posX+1][posY][posZ]-raumTemp[posX-1][posY][posZ]-raumTemp[posX][posY+1][posZ]-raumTemp[posX][posY-1][posZ]-raumTemp[posX][posY][posZ-1]);
                              System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                         }
                       
                         //Allgemein Innen
                         else if(posX > 0 && posX<4 && posY >0 && posY < 4 && posZ>0 && posZ<2){
                           
                             raumTempneu[posX][posY][posZ] = raumTemp[posX][posY][posZ]-temperaturleitfähigkeit*(6*raumTemp[posX][posY][posZ]-raumTemp[posX+1][posY][posZ]-raumTemp[posX-1][posY][posZ]-raumTemp[posX][posY+1][posZ]-raumTemp[posX][posY-1][posZ]-raumTemp[posX][posY][posZ+1]-raumTemp[posX][posY][posZ-1]);
                              System.out.print("(" + raumTempneu[posX][posY][posZ]   + ")");
                            
                           
                         }
                       
                       
                       
                       
                         //System.out.print("(" + raumTemp[posX][posY][posZ]   + ")");
                     }
                      System.out.println(" ");
                 }
              
          
           
         }
             zeit++;
           
    }
           
    }
}

Also das array feld 0 3 0 hat den wert 100(heizungstemperatur). alle anderen sind 0. Nun werden von JEDEM feld immer die direkt angrenzenden felder berechnet rechts links oben und unten usw. ( die wärme breitet sich aus von feld zu feld)

da wo das feld ist mit dem wert 100 sind nun die angrenzenden felder berechnet worden und haben nun auch einen wert ueber 0.

im nächsten schleifendurchgang muessen diese werte halt MITGENOMMEN werden damit von den grade neu berechneten feldern AUCH die angrenzenden felder neu berechnet werden können usw usw . boah ich hoffe das ist irgendwie verständlich :-/

also kurz ausgedrückt

array mit werten

berechnung neuer werte

neue werte speichern und mit diesen weiter rechnen

diese neuen werte speichern und wieder mit weiter rechnen usw

könnt ihr mir helfen ? :-o
 
array mit werten

berechnung neuer werte

neue werte speichern und mit diesen weiter rechnen

diese neuen werte speichern und wieder mit weiter rechnen usw

Ich würde dafür ne Methode calculateTemp schreiben welche ein Array mit den Aktuellen werten bekommen. In dieser Methode legst du eine weiteres Array an in dem die Ergebnisse gspeichert werden. Das Array gibst du dann zurück um damit weiter rechnet zu können.
in etwa so

Java:
public int[][][] calcTemp(int[][][] raumtemp) {
  int[][][] ergebnis = new int[a][b][c] // kenn die genaue größe deines arrays nicht.
  for(int x = 0; x < raumtemp.length; x++) {
    for(int y = 0; y < raumtemp[x].length; y++)  {
      for(int z = 0; z < raumtemp[x][y].length; z++) {
         ergebnis[x][y][z] = calculateSomehow() // wie die genaue berechnung ist weißt du selber bessern ;_)
      }
    }
  }
  return ergebnis;
}

und der aufruf läuft dann so
Java:
int[][][] raumtemp = initRaumtemp(); // Initiale Werte festlegen
while(repeat) {
  raumtemp = calcTemp(raumtemp)
}
 

Neue Themen


Zurück
Oben