2017-04-10 2 views
0

Ich konnte ein MATLAB-Programm schreiben, das eine 1D-Laplace-Relaxation zwischen zwei Metallplatten aufträgt, um mithilfe der Jacobi-Methode ein Gleichgewichtspotential zu finden.3D-Laplace-Relaxation in MATLAB

ich werde ehrlich sein, ich bin nicht ganz sicher, dass ich verstehe, was ich tat, aber hier ist der relevante Teil des Codes:

N=100; 
V = zeros(N,N); 
V(1,:)=-1; 
V(N,:)=1; 

for n=1:400 
    for i=2:99 
     for j=2:99 
      V(i,j)=(V(i-1,j)+V(i+1,j)+V(i,j+1)+V(i,j-1))*0.25; 
     end 
    end 
end 

und das ist, wie es aussieht:

enter image description here

Ich frage mich, ob es möglich ist, etwas ähnliches mit der gleichen Methode, aber in 3D zu tun. Ich möchte etwas ähnliches in 3D visualisieren, eine 3D-Potential-Box.

Ich habe versucht, eine ähnliche Gleichung, die ich gefunden "Computational Physics NJ Giordano & H. Nakanishi, Eq (5,8)..":

V(i,j,k) = [V(i+1,j,k) + V(i-1,j,k) + V(i,j+1,k) + V(i,j-1,k) + V(i,j,k+1) + V(i,j,k-1)] * (1/6); 

und hier ist der neue Code, die ich versucht haben, an der Arbeit:

N=10; % Used smaller number to reduce processing time. 
V = zeros(N,N,N); 
V(:,:,1)=-1; %i am using planes instead of axis as "Insulators" 
V(:,:,N)=1; 

for n=1:100 
    for i=2:99 
     for j=2:99 
      for k=2:99 
       V(i,j,k)=(V(i+1,j,k)+V(i-1,j,k)+V(i,j+1,k)+V(i,j-1,k)+V(i,j,k+1)+V(i,j,k-1))*(1/6); 
      end 
     end 
    end 
end 

und ich bin ein Index exceeds matrix dimensions. in der Linie bekommen, wo V(i,j,k) ist.

Also noch einmal, ich versuche etwas zu bekommen, das ist die 3D-Version der 2D-Grafik oben verlinkt. * Außerdem würde ich es sehr schätzen, wenn jemand etwas erklären könnte (nicht der MATLAB-Teil, sondern der Mathe-Teil), was genau mache ich hier mit dieser Gleichung, und wofür könnte das verwendet werden?

Ich schätze die Hilfe sehr.

Edit: Ich habe vergessen zu fragen: Wie würden Sie diese 3D-Array grafisch darstellen?

Antwort

0

Sie haben N definiert, verwenden es aber nicht während des Prozesses. Da Sie Werte wie i-1 und j-1 haben, müssen Sie von 2 starten. Und für Sie haben Werte wie i+1 und j+1 müssen Sie durch N-1 beenden. So ein Arbeits Code wird wie folgt aussehen:

N=10; % Used smaller number to reduce processing time. 
V = zeros(N,N,N); 
V(:,:,1)=-1; %i am using planes instead of axis as "Insulators" 
V(:,:,N)=1; 

for n=1:1 
    for i=2:N-1 
     for j=2:N-1 
      for k=2:N-1 
       V(i,j,k)=(V(i+1,j,k)+V(i-1,j,k)+V(i,j+1,k)+V(i,j-1,k)+V(i,j,k+1)+V(i,j,k-1))*(1/6); 
      end 
     end 
    end 
end 

Auch die ersten for-loop scheint nichts in diesem Stück Code zu tun, die Sie zur Verfügung gestellt haben.