Operasi vektor di Python

23 Mar 2009 | Blog Fisika UM

Pada program phyton saya sebelumya keterangan pada perintah-perintahnya belum jelas. Nah di sini penjelasannya. Hal yang bisa ditangkap di sini adalah:

  1. Python mendukung penulisan variabel berbentuk vektor.
  2. Python mendukung operasi vektor (penormalan, besar vektor, penjumlahan, perkalian dot)

Kode:
from visual import * #agar dapat menggunakan obyek tiga dimensi
from random import uniform #agar dapat menggunakan random jenis uniform
from visual.graph import * #agar dapat membuat grafik/tabel

scene.x=800 #ukuran jendela

#buat tembok
thk = 0.1 #ketebalan
side = 7.0 #lebar
s2 = 2*side - thk
s3 = 2*side + thk
#wallR=tembok kanan; wallL=tembok kiri; ...dst
#box(...) artinya tembok yang kita buat berupa kotak dengan posisi (x,y,z), panjang length #...

wallR = box (pos=vector( side, 0, 0), length=thk, height=s2, width=s3, color = color.red)
wallL = box (pos=vector(-side, 0, 0), length=thk, height=s2, width=s3, color = color.red)
wallB = box (pos=vector(0, -side, 0), length=s3, height=thk, width=s3, color = color.blue)
wallT = box (pos=vector(0, side, 0), length=s3, height=thk, width=s3, color = color.blue)
wallBK = box(pos=vector(0, 0, -side), length=s2, height=s2, width=thk, color = (0.7,0.7,0.7))

##########################################
# Buat Bola
##########################################
no_particles=37 #jumlah bola yang akan dibuat
ball_radius=1. #radius bola
maxpos=side-.5*thk-ball_radius #posisi maksimum letak bola yang dibolehkan
maxv=7.0 #kecepatan maksimum bola

'''

Keterangan :

  • ball_list=[] adalah perintah membuat list (semacam array di delphi) bernama ball_list, berfungsi untuk menampung objek bernama ball yang terbuat dari object bernama sphere.
  • Perintah di bawah adalah untuk mengulang pembuatan bola sebanyak no_particles kali, ingat setelah perintah for, harus menjorok ke dalam, hal ini semacam begin di delphi.
'''
ball_list=[]
for i in arange(no_particles):
jari =ball_radius
ball=sphere(color=color.green,radius=jari)
ball.pos=maxpos*vector(uniform(-1,1),uniform(-1,1),uniform(-1,1))
ball.velocity=maxv*vector(uniform(-1,1),uniform(-1,1),uniform(-1,1))
ball_list.append(ball) #perintah ini memasukkan bola ke dalam ball_list

#perhatikan bahwa posisi dan kecepatan berupa vektor (x,y,z) dan (vx,vy,vz)
###########################################
# Setup Histogram Plot/buat grafik
###########################################
graphwindow=gdisplay(xtitle='v',ytitle='N',ymax=no_particles/2)
velocity_dist=ghistogram(bins=arange(0,2*maxv,maxv/5),accumulate=1,average=1)
expected_distribution=gcurve(color=color.green)
for vx in arange(0,2*maxv,maxv/20):
expected_distribution.plot(pos = (vx,.27*no_particles*exp(-vx**2/maxv**2*3/2)))

##########################################
# Time loop for moving Ball(s)
###########################################
timestep = 0.05
while (1==1):
rate(100) #artinya setiap detik jangan lakukan lebih dari 100 kali
######################################
# Loop over list of particles
# Move and check wall collisions
######################################
for ball in ball_list:
suhu=mag(ball.velocity)/maxv #suhu bola sebanding dengan kecepatannya
ball.color=(suhu/2,1-suhu/2,0) #warna bola sebanding dengan suhunya
ball.pos = ball.pos + ball.velocity*timestep #gerakkan bola sejauh dr
#check right wall collisions
if ball.x > maxpos:
#reflect velocity/ balik kecepatannya
ball.velocity.x = -ball.velocity.x
#reflect position/ pantulkan sedikit
ball.x=2*maxpos-ball.x
#left wall
if ball.x < -maxpos:
ball.velocity.x = -ball.velocity.x
ball.x=-2*maxpos-ball.x
# roof
if ball.y > maxpos:
ball.velocity.y = -ball.velocity.y
ball.y=2*maxpos-ball.y
#floor
if ball.y < -maxpos:
ball.velocity.y = -ball.velocity.y
ball.y=-2*maxpos-ball.y
#back wall
if ball.z > maxpos:
ball.velocity.z = -ball.velocity.z
ball.z=2*maxpos-ball.z
#front wall
if ball.z < -maxpos:
ball.velocity.z = -ball.velocity.z
ball.z=-2*maxpos-ball.z

######################################
# Ball Collision Detection
######################################
# hitung tumbukan setiap pasangan
for i in range(no_particles):
for j in range(i+1,no_particles):
distance=mag(ball_list[i].pos-ball_list[j].pos) #hitung besar vektor jarak keduanya
#check collision
if distance<(ball_list[i].radius+ball_list[j].radius):
#unit vector in collision direction/ tentukan vektor normal
direction=norm(ball_list[j].pos-ball_list[i].pos)
vi=dot(ball_list[i].velocity,direction)# arah vektor kecepatan permukaan kontak
vj=dot(ball_list[j].velocity,direction)
#impact velocity
exchange=vj-vi #kecepatan yang dipertukarkan
##exchange momentum/pertukaran momentum
ball_list[i].velocity=ball_list[i].velocity + exchange*direction
ball_list[j].velocity=ball_list[j].velocity - exchange*direction
##adjust position/pantulkan
overlap=ball_list[i].radius+ball_list[j].radius-distance
ball_list[i].pos=ball_list[i].pos - overlap*direction
ball_list[j].pos=ball_list[j].pos + overlap*direction

#######################################
# Plot the x velocity histogram
#######################################
v_list=[]
for ball in ball_list:
v_list.append(mag(ball.velocity))
velocity_dist.plot(data=v_list)

 

 

 

Berita terkait


Jurusan Fisika yang Semakin Cantik

Jurusan Fisika yang Semakin Cantik

Jurusan Fisika yang Semakin Cantik Bagi yang alumni jurusan Fisika FMIPA UM yang ada keperluan ke UM untuk legalisir ataupun yang lain, sempatkan untuk mampir ke Kampus tercinta kita.    

The 2nd Particle Physics School in South-East Asia

The 2nd Particle Physics School in South-East Asia

Preface The 2nd Particle Physics School in South-East Asia We are pleased to inform you that we have the 2nd Particle Physics School in South-East Asia with some emphasis on B physics from September 16th to 22nd, 2012 at Gadjah Mada University Club in Yogyakarta,...