Nugroho's blog.: Physicist
Showing posts with label Physicist. Show all posts
Showing posts with label Physicist. Show all posts

Tuesday, May 24, 2016

Friday, March 4, 2016

Cluster Growth Simulation.

 Using Python with Numpy and Matplotlib
"""
Cluster
"""
import numpy as np #untuk operasi array
import matplotlib.pyplot as plt #untuk gambar grafik
import matplotlib.animation as animation #untuk menggerakkan grafik

fig, ax = plt.subplots()

plt.ylim(0,40)
plt.xlim(0,40)
#variabel
n = 39
x = 19
y = 19
a = np.zeros((n,n))
a0 = np.zeros((n,n))
a0[x,y] = 1
a[:,:]=a0[:,:]
#print a

#membuat garis/kurva dengan sumbu-x adalah x, sumbu-y adalah y
line, = ax.plot(x, y, 'o')

def animate(i):
global line
for i in np.arange(1,n-1):
for j in np.arange(1,n-1):
if a0[i,j]==1:
x = i + np.random.randint(-1,2)
y = j + np.random.randint(-1,2)
if a[x,y]!=1:
a[x,y] = 1
line, = ax.plot(x,y,'o')
a0[:,:] = a[:,:]
return line,

ani = animation.FuncAnimation(fig, animate, frames=2000, interval=100, blit=False)
ani.save('cluster.mp4',bitrate=1024)
#plt.show()








Thursday, November 21, 2013

Sumur tanpa Bayangan, Miring, Nol, dan Radioaktif


"Jadi cara menentukan keliling bumi dan sumur adalah dengan cara membandingkan bayangan yang jatuh di sumur kita di siang hari tepat jam duabelas dan sumur lain yang tidak punya bayangan di tempat lain.

"Jika kita tahu jarak kita ke tempat sumur tanpa bayangan tesebut maka kita bisa membuat perbandingan.





"Misal sudut bayangan yang jatuh di sumur kita adalah theta, maka perbandingannya adalah theta dengan 360 dan jarak ke tempat sumur tanpa bayangan dengan keliling bumi.

"Karena kita tahu nilai theta dan jarak ke sumur tanpa bayangan, maka keliling bumi dapat dihitung.

θ/360=jarakKeSumurTanpaBayangan/KelilingBumi

"Sehingga KelilingBumi=jarakKeSumurTanpaBayangan x 360/θ"

"Nol itu nilai apa pak?"

"Nol mana?"

"Di atas 360 itu"

"Oh itu bukan nol tapi theta"

"theta itu apa pak?"

"Theta itu sudut kemiringan sumur, baik saya ganti simbolnya menjadi alpha saja"

"Alpha itu zat radiokatif ya pak?"

"..." (hapus simbol alpha dan diganti dengan tulisan 'sudut')

(suasana di pelatihan guru pembimbing olympiade sains)


Friday, November 16, 2012

Bouncing Ball using Array in HTML5

I want to create bouncing ball program that's very easy on Flash, Python or Delphi yet very tricky on html5. The program consist of n ball with random velocity (each) moving in a 2d box (oh yeah, square then :) ) 

I am playing with array in html5 script which is helpful on this program. I don't declare the array using

aBola = new array()

that come  as standart on many language, but prefer

aBola = []

instead, just like list on python. In this program, array's just like container for ball.

In html5, moving an object is a bit tricky and, for some Pascal programmer like me, bringing an old memory of draw-clear-draw-clear... cycle; draw a ball, delete it, draw the same ball but slightly right, delet it, ... and so on. All that kind of tedious job, but it worth for the sake of fast execution and no-need-slow-loading-flash-player thing.




Here's the code under script tag. Keep in mind that many variable's name is in indonesian (ball -> bola, bounce->pantul, collision -> tumbukan )
 
//bola:ball
//pantul:bounce
var context;
var n=10;

// membuat bola
function bola(color, r,dx,dy){
this.canvas = canvas;
this.context = canvas.getContext('2d');
this.r = r;
this.x =Math.random()*400+30;
this.y = Math.random()*250+30;
this.dx = dx;
this.dy = dy;
this.color = color;
}

bola.prototype.Create = function (){
this.context.beginPath();
this.context.fillStyle = this.color;
this.context.arc(this.x,this.y,this.r,0,Math.PI*2,false);
this.context.fill();
}
bola.prototype.Pantul = function (){
if (this.x >= (canvas.width - this.r) || this.x <= this.r) this.dx *= -1;
if (this.y >= (canvas.height - this.r) || this.y <= this.r) this.dy *= -1;
}
function init(){
canvas = document.getElementById("myCanvas")
context = canvas.getContext('2d');
// membuat array untuk bola
//create array for ball
aBola = [];
for (i=1;i<=n;i++){
//membuat bola sejumlah n dengan dx dan dy acak
//create n balls with random dx and dy
dx = Math.random()*10-5;
dy = Math.random()*10-5;
aBola.push(new bola('#007700', 17,dx,dy));
}
setInterval(draw,20);
}
function draw(){
context.clearRect(0,0, 500,350);
for (i in aBola) {
//menggerakkan bola
//moving balls
aBola[i].x += aBola[i].dx;
aBola[i].y += aBola[i].dy;
aBola[i].Pantul();
aBola[i].Create();
}
}

(to be continued)

Tuesday, November 13, 2012

2D/3D Ball Collision

I used on 1D collission problem where, in case of elastic collision, the ball is changing velocity each other. In 2D/3D case however, the collision is not always head-on collision (which is basically 1 dimension collision).

Head-on
The system above's easy too solve, as simple as interchanging velocity (in elastic case).




Not head-on

When two balls are in non-head-on collision we could always using transposed new coordinate where both of ball center are on the new x-axis like below



On the new coordinate, we can treat the velocities along x-axis as one dimensional collision case and let go on other component (y, z) intact.

Below's snippet from python code of balls collision detection; the whole code is code of moving many ball on a box.

###deteksi tumbukan antar bola
for i in arange(jumlah):
for j in arange(i+1,jumlah):
jarak=mag(lbola[i].pos-lbola[j].pos)
if jarak<(lbola[i].radius+lbola[j].radius):
arah=norm(lbola[j].pos-lbola[i].pos)
vi=dot(lbola[i].v,arah)
vj=dot(lbola[j].v,arah)
tukar=vj-vi
lbola[i].v=lbola[i].v+tukar*arah
lbola[j].v=lbola[j].v-tukar*arah
pantul=lbola[i].radius+lbola[j].radius-jarak
lbola[i].pos=lbola[i].pos-pantul*arah
lbola[j].pos=lbola[j].pos+pantul*arah

Wednesday, September 19, 2012

Simulate Circular Motion using Visual Python


This little code below show how to move an object in VPython. There’s two object in program, a box and a sphere. The latter object move in circular using simple sin and cos formula. 

I set the angular speed 10 and radius of the motion (not the sphere) is 10. I use label to show sphere’s x and y position. 

Here the result





Here the code

from visual import *

kotak = box(pos=vector(0, 0, 0), length=14, height=14, width=1, color = (0.7,0.7,0.7))

ball=sphere(color=color.green,radius=5)
ball.pos=vector(10,10,0)

timestep = 0.05
a=10
t = .0
omega= 10
px = label(pos=(0,-1,0), text='x = %1.5f' % pi)
py = label(pos=(0,+1,0), text='y = %1.5f' % pi)
while (1==1):
rate(100)
ball.pos.x = a*sin(omega*t)
ball.pos.y = a*cos(omega*t)
px.text = 'x = %1.5f' % ball.pos.x
py.text = 'y = %1.5f' % ball.pos.y
t=t+0.01

Friday, December 9, 2011

Input berupa Fungsi Fleksibel pada Python dengan Menggunakan Parser


Saat kita membuat sebuah aplikasi, sering kita memberi kesempatan pengguna untuk memberikan input. Misal pada program untuk menghitung akar persamaan kuadarat ax^2+bx+c, kita memberi input berupa nilai a, b dan c. Ini berarti program yang dibuat hanya dapat menyelesaikan persamaan kuadarat dengan model ax^2+bx+c. Bentuk penulisan seperti ini disebut hardcode. Bagaimana misal jika kita menginginkan akar 3x^3-3? Atau menemukan nilai y=sin(x)? Tentu saja kita harus membuat program yang baru.



Pada python ada fungsi parser yang memungkinkan kita untuk memasukkan input berupa persamaan. Dengan demikian kita dapat membuat hanya satu program untuk misal menggambar grafik suatu fungsi dengan input berupa fungsi. Kita bebas memasukkan sebarang persamaan sebagai input.

Berikut adalah contoh program untuk menentukan nilai fungsi pada sebuah peubah. Dalam hal ini fungsi yang diinputkan adalah f=sin(x)*2x^2. Program mencari nilai fungsi tersebut pada x=10.

Nugrohos-MacBook-Pro:~ nugroho$ python
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from math import sin
>>> import parser
>>> f="sin(x)*2*x**2"
>>> print f
sin(x)*2*x**2
>>> y=parser.expr(f).compile()
>>> x=10
>>> print eval(y)
-108.804222178
>>>


Wednesday, November 11, 2009

Pemetaan Balik dari Bidang ke Kulit Bola

Pemetaan dari kulit bola ke bidang x-y mengikuti persamaan berikut.

From Aravir (am I Physicist?)


From Aravir (am I Physicist?)

(x,y) adalah koordinat titik di bidang x-y sedangkan (x′,y′,z′) adalah koordinat titik pada permukaan bola (S2). Persamaan di atas memetakan titik (x′, y′, z′) pada permukaan bola ke bidang x-y (R2) di titik (x, y) menggunakan proyeksi stereografis.
Jika kita ingin melakukan sebaliknya; memetakan sebuah titik di R2 ke S2, maka kita harus mendapatkan nilai x′ yang diungkapkan dalam x dan y, hal yang sama berlaku untuk y′ dan z′.
Karena kita sudah memiliki dua persamaan (1, 2) sedangkan kita men- cari 3 variabel yang belum diketahui, maka dibutuhkan satu persamaan lagi. Syukurlah, persamaaan tersebut ada dan muncul dalam bentuk persamaan untuk kulit bola, yaitu

From Aravir (am I Physicist?)


sehingga kita dapat mencari x′, y′ dan z′.
Persamaan 1 dan 2 dapat ditulis ulang sebagai

From Aravir (am I Physicist?)


z′ dapat dicari dengan memasukkan 4 dan 5 ke 3

From Aravir (am I Physicist?)

dengan memasukkan 17 ke 4 dan 5, maka didapatkan

From Aravir (am I Physicist?)


Persamaan 18, 19 dan 17 dapat digunakan untuk memetakan titik-titik diR2 ke S2.
Berikut adalah contoh-contoh kurva di R2 yang dipetakan ke S2.

Fungsi
From Aravir (am I Physicist?)

From Aravir (am I Physicist?)


From Aravir (am I Physicist?)


From Aravir (am I Physicist?)


From Aravir (am I Physicist?)


From Aravir (am I Physicist?)


Fungsi
From Aravir (am I Physicist?)


From Aravir (am I Physicist?)

From Aravir (am I Physicist?)

From Aravir (am I Physicist?)

From Aravir (am I Physicist?)
323f (5) amp (1) android (12) apple (7) arduino (18) art (1) assembler (21) astina (4) ATTiny (23) blackberry (4) camera (3) canon (2) cerita (2) computer (106) crazyness (11) debian (1) delphi (39) diary (286) flash (8) fortran (6) freebsd (6) google apps script (8) guitar (2) HTML5 (10) IFTTT (7) Instagram (7) internet (12) iOS (5) iPad (6) iPhone (5) java (1) javascript (1) keynote (2) LaTeX (6) lazarus (1) linux (29) lion (15) mac (28) macbook air (8) macbook pro (3) macOS (1) Math (3) mathematica (1) maverick (6) mazda (4) microcontroler (35) mountain lion (2) music (37) netbook (1) nugnux (6) os x (36) php (1) Physicist (29) Picture (3) programming (189) Python (109) S2 (13) software (7) Soliloquy (125) Ubuntu (5) unix (4) Video (8) wayang (3) yosemite (3)