Ising-Modell Monte-Carlo-Simulationen in 4D und 5D

Ich werde das Ising-Modell in 4D und höher simulieren, um Spin-Spin-Korrelationen und kritische Exponenten zu berechnen, und frage mich, wie ich dies algorithmisch angehen soll.

Verwenden Sie beispielsweise in 1D ein Array, um Drehungen zu speichern. Verwenden Sie in 2D eine Matrix. Verwenden Sie in 3D eine 2D-Matrix oder ein Drei-Tupel. Eine Möglichkeit, wie ich darüber nachdenke, ist, dass Sie in jeder Dimension N zur 3. Dimension zurückverfolgen können, um die Begriffe der nächsten Nachbarn zu verstehen.

Zum Beispiel sind in 2D die Drehungen, die einer bestimmten Drehung in der Mitte am nächsten sind, nur 2 1D nächste Nachbarn. In 3D sind die Spins neben einem bestimmten Spin in der Mitte nur 2 nächste Nachbarn in 2D (dh die Ebenen senkrecht zueinander).

Kann ich es mir in 4D als die 2 nächsten Nachbarn in 3D vorstellen? Wie kann ich in ähnlicher Weise algorithmisch an 5D denken?

Oder sollte ich auf die Verwendung der Standard-Containerklassen verzichten und überall nur Tupel verwenden?

In 3D gibt es 3 senkrechte Ebenen von 2D nächsten Nachbarn. In 4d gäbe es 4 Würfel von 3d nächsten Nachbarn. Usw.
Um die Aussage von user37496 zu beweisen, sollten Sie drei Achsen aus Ihrem Satz von vier Achsen auswählen. Drei definiert ein Volumen, also die Anzahl von (N-1)-Hyperebenen, die senkrecht aufeinander stehen und durch einen Punkt gehen N wählen N 1 , das ist, N .

Antworten (1)

Der beste Weg, sie zu speichern, besteht möglicherweise darin, ein 1D-Array zu verwenden und eine separate Liste von Bindungen zu verwenden, die die Verbindungen zwischen den Standorten verfolgt. Bei diesem Ansatz müssen Sie lediglich das Bonds-Array ändern, um Ihren Code von 1D auf 2D auf 3D umzustellen.

Als Beispiel könnten Sie in 2D eine Liste der Spin-Werte haben, die spins[N]in 2D genannt werden, es gibt 2N 'Bindungen' (jede Stelle ist mit vier anderen verbunden, aber wir müssen durch 2 teilen, um ein Überzählen zu vermeiden). In diesem Segment des C++-Codes erstellen wir das Bonds-Array (vorausgesetzt, wir haben bereits ein leeres Array:bonds[2*N][2]

for (int i = 0; i < nsites; i++) {
        //calculate the x and y coordinates of site i
        int xi = i % lx; 
        int yi = i/lx;
        //x direction bonds are even numbered
        bonds[0][2*i] = i;
        bonds[1][2*i] = yi*lx + ((xi+1) %lx);
        //y direction bonds are odd numbered
        bonds[0][2*i+1] = i; // same
        bonds[1][2*i+1] = ((yi+1)%ly)*lx + xi; 
    }