Seite 1 von 1

hard spheres collisions

Verfasst: Sonntag 25. April 2010, 10:23
von mzh
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?

Verfasst: Sonntag 25. April 2010, 10:30
von veers

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

Verfasst: Sonntag 25. April 2010, 10:56
von mzh
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

Verfasst: Sonntag 25. April 2010, 12:01
von Dav1d
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

Verfasst: Sonntag 25. April 2010, 12:02
von veers
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

Verfasst: Sonntag 25. April 2010, 12:04
von Dav1d
Oh ja, das Random :D

Verfasst: Sonntag 25. April 2010, 12:05
von Dav1d
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]
>>>