2016-12-20 2 views
2

Dies ist mein erstes Mal in diesem Web, also ich hoffe, ich werde es richtig machen.Python Parametrisierung

Ich mache eine Wärmediffusionssimulation für einen Zylinder. Da die Wärmequelle außerhalb des Zylinders liegt, hat diese keine Zylindersymmetrie. Daher entschied ich mich, ein X-Y-Gitter zu erstellen und es einem Cyilinder zu nähern. Manche Dinge wie folgt aus:

enter image description here

Dies ist meine erste und einfachste Versuch:

from numpy import empty,zeros,max 
import matplotlib.pyplot as plt 

# Constants 
M = 10  # Grid squares on a side 
V = 100.0   # Voltage at top wall 
target = 1e-4 # Target accuracy 

# Create arrays to hold potential values 
phi = zeros([M+1,M+1],float) 
phi[0,:] = V 
phi[M,:]=V 
phi[:,0]=V 
phi[:,M]=V 
phiprime = empty([M+1,M+1],float) 

# Main loop 

delta = 1.0 
while delta>target: 
    # Calculate new values of the potential 
    for i in range(M+1): 
     for j in range(M+1): 
     if i==0 or i==M or j==0 or j==M: 
      phiprime[i,j] = phi[i,j] 

     elif i==1 or i==M-1: 
      if j==1 or j==2 or j==M-2 or j==M-1: 
       phiprime[i,j]=V-V/2 
      else: 
       phiprime[i,j] = (phi[i+1,j] + phi[i-1,j] \ 
          + phi[i,j+1] + phi[i,j-1])/4 
     elif i==2 or i==M-2: 
      if j==1 or j==M-1: 
       phiprime[i,j]=V-V/2 
      else: 
       phiprime[i,j] = (phi[i+1,j] + phi[i-1,j] \ 
          + phi[i,j+1] + phi[i,j-1])/4 
     else: 
      phiprime[i,j] = (phi[i+1,j] + phi[i-1,j] \ 
          + phi[i,j+1] + phi[i,j-1])/4 

    delta = max(abs(phi - phiprime)) 

    phi, phiprime = phiprime, phi 

plt.imshow(phiprime) 
plt.gray() 
plt.show() 

Das war recht einfach, aber das ist keine gute Näherung für einen Zylinder, muss ich mach es größer. Wie Sie sehen können, kann ich bei diesem Versuch die "Positionen" von Hand codieren, aber wenn ich es 100x100 oder 1000x1000 mache, ist es unmöglich.

Meine Frage ist also: Gibt es eine gute Parametrisierung für dieses "eingerückte Quadrat" (die schwarzen)?

Dank

Antwort

Verwandte Themen