Ho creato una piccola visualizzazione di particelle in python. Sono in grado di caclulare il movimento di particelle in uno spazio 2D senza gravità. Come ogni particella attira tutte le altre particelle in base alla massa e alla distanza delle particelle.Ottimizzazione del calcolo della gravitazione per particelle a gravità zero spazio 2d
Ho realizzato una visualizzazione in pygame e tutto funziona come da piano (con la calucazione), tuttavia ho bisogno di ottimizzare il calcolo in modo estrattivo. Oggi il sistema può calcolare circa 100-150 particelle in un framerate deacent. Ho messo tutto il calcolo in un thread separato che mi ha dato un po 'di più ma non quasi quello che voglio.
Ho guardato scipy e insensibile, ma dal momento che non sono uno scienziato o un matemogruppo mi sento solo confuso. Sembra che io sia sulla strada giusta ma non ho idea di come.
Ho bisogno di calcolare tutta l'attrazione su tutte le particelle che ho a un ciclo in un ciclo. E dal momento che ho bisogno di trovare se qualcuno si è scontrato, devo fare lo stesso tutto da capo.
Mi si spezza il cuore a scrivere quel tipo di codice ....
Numpy ha la capacità di calcolare array con array, ma non ho trovato alcuna cosa per calcolare tutti gli elementi in array con tutte le voci dallo stesso/altro array. Ce n'è uno? Se è così ho potuto creare e un paio di matrici e calcolare molto più veloce e ci deve essere una funzione per ottenere indice da a 2 array dove il loro valori partita (Collitiondetect IOW)
Qui è oggi calcolo di attrazione/collsion:
class Particle:
def __init__(self):
self.x = random.randint(10,790)
self.y = random.randint(10,590)
self.speedx = 0.0
self.speedy = 0.0
self.mass = 4
#Attraction
for p in Particles:
for p2 in Particles:
if p != p2:
xdiff = P.x - P2.x
ydiff = P.y - P2.y
dist = math.sqrt((xdiff**2)+(ydiff**2))
force = 0.125*(p.mass*p2.mass)/(dist**2)
acceleration = force/p.mass
xc = xdiff/dist
yc = ydiff/dist
P.speedx -= acceleration * xc
P.speedy -= acceleration * yc
for p in Particles:
p.x += p.speedx
p.y += p.speedy
#Collision
for P in Particles:
for P2 in Particles:
if p != P2:
Distance = math.sqrt( ((p.x-P2.x)**2) + ((p.y-P2.y)**2) )
if Distance < (p.radius+P2.radius):
p.speedx = ((p.mass*p.speedx)+(P2.mass*P2.speedx))/(p.mass+P2.mass)
p.speedy = ((p.mass*p.speedy)+(P2.mass*P2.speedy))/(p.mass+P2.mass)
p.x = ((p.mass*p.x)+(P2.mass*P2.x))/(p.mass+P2.mass)
p.y = ((p.mass*p.y)+(P2.mass*P2.y))/(p.mass+P2.mass)
p.mass += P2.mass
p.radius = math.sqrt(p.mass)
Particles.remove(P2)
Avete considerato [Psyco] (http://psyco.sourceforge.net/) o [modulo di scrittura C/C++] (http://docs.python.org/extending/extending.html)? – nagisa
Questo articolo esamina gli approcci comuni per l'ottimizzazione della simulazione gravitazionale, incluso Barnes-Hut. I professionisti generalmente lo fanno in 3D, ma credo che i casi 2D siano tutti analoghi. http://www.cs.hut.fi/~ctl/NBody.pdf –
se non sei felice con la matematica ("Io non sono uno scienziato o il matemogruppo mi sento solo confuso") allora penso che tu debba cercare una biblioteca che fa questo. vedi http://stackoverflow.com/questions/6381137/python-physics-library http://stackoverflow.com/questions/2298517/come-una-di-questo-quad-tree-libraries-any-good –