hard spheres collisions

Code-Stücke können hier veröffentlicht werden.
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen
Ich bin kürzlich darüber gestolpert: ich wollte das Model "perfectly elastic collison of hard-spheres (in 2D)" implementieren, think Billiardkugeln. Alle Partikel haben die gleiche Masse und so gilt dass der Impuls der Kugel A beim Zusammenstoss auf die Kugel B übergeht und Impuls von B auf A (vektoriell).

Code: Alles auswählen

                    #Exchange velocities
                    xvel[i] = xvel[j]
                    yvel[i] = yvel[j]
                    #Take over velocities 
                    xvel[j] = xvel[i]
                    yvel[j] = yvel[i]
Ich weiss, dass das oben nicht geht, weil {x,y}vel[j] im zweiten Block sich selbst zugewiesen wird, deshalb habe ich eine temporäre Variable eingebaut, die den {x,y}vel Wert zwischenspeichert.

Code: Alles auswählen

                    tempXi = xvel[i]
                    tempYi = yvel[i]
                    #Exchange velocities
                    xvel[i] = xvel[j]
                    yvel[i] = yvel[j]
                    #Take over velocities 
                    xvel[j] = tempXi
                    yvel[j] = tempYi
Gibt es eine elegante Art das zu machen? Wie?
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Code: Alles auswählen

In [1]: x = 10.5
In [2]: y = 3.8
In [3]: x = x+y
In [4]: y = x-y
In [5]: x = x - y
In [6]: x
Out[6]: 3.8000000000000007
In [7]: y
Out[7]: 10.5
:lol:
oder auf pythonisch

Code: Alles auswählen

x, y = y, x
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Danke, hoffe der bleibt mir diesmal

Kann man das irgendwie auch in dieser Situation verwenden.

Code: Alles auswählen

    xvel = [sign()*random()*stepsize for i in range(npart)]
    yvel = [sign()*random()*stepsize for i in range(npart)]
Also so was:

Code: Alles auswählen

xvel, yvel =  [sign()*random()*stepsize for i in range(npart)], [sign()*random()*stepsize for i in range(npart)]
Ich denke die erste Art ist schon bisschen übersichtlicher
[url=http://www.proandkon.com]proandkon.com[/url]
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Vllt so?:

Code: Alles auswählen

xvel, yvel =  [sign()*random()*stepsize for i in range(npart)]*2
bzw. bei mehreren Elementen in der Liste:

Code: Alles auswählen

xvel, yvel =  [[sign()*random()*stepsize for i in range(npart)]]*2
Zuletzt geändert von Dav1d am Sonntag 25. April 2010, 12:03, insgesamt 1-mal geändert.
the more they change the more they stay the same
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Dav1d hat geschrieben:Vllt so?:

Code: Alles auswählen

xvel, yvel =  [sign()*random()*stepsize for i in range(npart)]*2
Wenn random das tut was der Name erahnen lässt, ist das eine schlechte Idee. ;)

Ich würde da den ersten weg bevorzugen, oder das ganze sogar in eine Funktion auslagern.

Gruss,
Jonas
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Oh ja, das Random :D
the more they change the more they stay the same
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich hab da aber noch was :D

Code: Alles auswählen

xvel, yvel =  [[sign()*random()*stepsize for i in range(npart)] for i in range(2)]
//Edit: :oops: Doppelpost

Code: Alles auswählen

>>> x,y = [[random.random() for i in xrange(3)] for ii in xrange(2)]
>>> x
[0.013829144199656973, 0.99495282462977819, 0.54577478862807427]
>>> y
[0.72164533455161517, 0.92094333480339685, 0.23844128730119796]
>>> 
the more they change the more they stay the same
Antworten