2017-05-25 3 views
0

Le programme suivant sera utilisé pour la recherche en physique collégiale. Je travaille donc sur un projet de recherche qui consiste à créer des cellules unitaires de forme rectangulaire. Pour l'instant je travaille avec une grille cubique 3d. Mon but est de rendre plus adjacents les uns aux autres.Création d'une matrice de cubes

Voici mon code actuel (qui vous les gars DÉCÉDÉES): En ce moment, il ne fait qu'un cube, peut placer des points aléatoires sur les sommets de la grille cubique, et il peut calculer la distance entre les points. Comment pourrais-je obtenir matplotlib pour produire plus de ceux-ci? Aussi, je dois être capable de mettre des points sur les cubes multiples et je devrais être capable de calculer la distance d'un point dans le cube A à un point dans le cube B. Serais-je capable de produire plusieurs cubes dans le même matplotlib par juste faire une boucle while? Aussi, à quoi cela ressemblerait-il en utilisant des tableaux numpy? Je me sens comme si les tableaux chiffrés seraient faciles à créer, mais je ne peux pas tout à fait enrouler ma tête autour d'elle. Code I ont jusqu'à présent:

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
from itertools import product, combinations 
from matplotlib.patches import FancyArrowPatch 
from mpl_toolkits.mplot3d import proj3d 

parameter = np.arange(0,11,1) 
xx, yy, zz = np.meshgrid(parameter, parameter, parameter) 
valuesrange = np.zeros((11, 11, 11)) 
valuesrange2 = np.zeros((11, 11, 11)) 

count = 0 

while (count < 2): 
xint = np.random.randint(0,2) 
yint = np.random.randint(0,2) 
zint = np.random.randint(0,2) 

if xint > 0: 
    xint = np.random.randint(10,11, 22) 
else: 
    xint = np.random.randint(0,1, 22) 

if yint >0: 
    yint = np.random.randint(10,11, 22) 
else: 
    yint = np.random.randint(0,1, 22) 

if zint > 0: 
    zint = np.random.randint(10,11, 22) 
else: 
    zint = np.random.randint(0,1, 22) 
count = count + 1 
print(xint, yint, zint) 
xint2 = np.random.randint(0,2) 
yint2 = np.random.randint(0,2) 
zint2 = np.random.randint(0,2) 

if xint2 > 0: 
    xint2 = np.random.randint(10,11, 22) 
else: 
    xint2 = np.random.randint(0,1, 22) 

if yint2 >0: 
    yint2 = np.random.randint(10,11, 22) 
else: 
    yint2 = np.random.randint(0,1, 22) 

if zint2 > 0: 
    zint2 = np.random.randint(10,11, 22) 
else: 
    zint2 = np.random.randint(0,1, 22) 
print (count) 
print(xint2, yint2, zint2) 
distance = ((xint2-xint)**2 + (yint2 - yint)**2 + (zint2 - zint)**2)**.5 
print ('distance:') 
print (distance) 

#xint = np.random.randint(0, 11, 22) 
#yint = np.random.randint(0, 11, 22) 
#zint = np.random.randint(0, 11, 22) 
#distance formula = ((x2-x1)**2 + (y2 - y1)**2 + (z2 - z1)**2)**.5 
valuesrange[[xint, yint, zint]]= np.random.random(22) 
valuesrange[[xint, yint, zint]]= np.random.random(22) 
fig = plt.figure() 
ax = fig.add_subplot(111, projection = '3d') 
im = ax.scatter(xx, yy, zz, c = valuesrange, cmap=plt.cm.spectral_r, 
edgecolor = 'none', alpha = .7) 
ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('z') 

plt.colorbar(im) 
fig.show() 

#plt.show() 

Répondre

1

J'ai des problèmes graves à comprendre le but de la plupart du code. Ce que je peux vous dire, c'est que vous pouvez bien sûr mettre la création du cube dans une fonction et appeler cette fonction plusieurs fois, éventuellement avec des paramètres différents, pour obtenir plusieurs diagrammes de dispersion.

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 

def make_cube(ax, n=10, offset=[0,0,0]): 
    parameter = np.arange(0,n,1) 
    xx, yy, zz = np.meshgrid(parameter, parameter, parameter) 
    valuesrange = np.zeros((n,n,n)) 
    valuesrange = np.random.rand(n,n,n) 
    x = xx+offset[0]; y=yy+offset[1]; z=zz+offset[2] 
    sc = ax.scatter(x, y, z, c = valuesrange, cmap=plt.cm.spectral_r, vmin=0, vmax=1, 
        edgecolor = 'none', alpha = .7) 
    return sc 

fig = plt.figure() 
ax = fig.add_subplot(111, projection = '3d') 

ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('z') 

sc1 = make_cube(ax,n=6) 
sc2 = make_cube(ax,n=4, offset=[8,7,4]) 
# or use a loop: 
#for i in range(4): 
# sc1 = make_cube(ax,n=i) 

plt.colorbar(sc1) 
plt.show() 

enter image description here

+0

Désolé de ne pas être clair. Je pense que la partie que vous ne pouvez pas obtenir est les instructions if/else. Ces instructions produisent des points aléatoires sur les sommets du cube. Aussi, quelle est l'utilisation des deux différentes distributions de points dans votre grille cubique? Sont-ils censés représenter Unitcells? Merci. – Astupidhippo

+0

Je n'ai aucune idée de ce qu'ils représentent. Vous avez demandé une méthode pour créer plus d'un cube et cette réponse fournit une telle méthode. J'ai fait ces deux cubes différents, mais c'est juste pour montrer comment utiliser les paramètres, parce que je ne sais pas (et je n'ai pas besoin de savoir) le but de tout cela. – ImportanceOfBeingErnest

+0

OK. Je pense que je comprends maintenant (en particulier les paramètres). Merci pour l'aide. – Astupidhippo