Monte Carlo PI Simulation #1

Posted: July 14, 2010 in Simulation
Tags: , , , , , , ,

ตามที่สัญญาเอาไว้่ ลองมาดู Simulation ของการหาค่า PI ด้วย วิธีการแบบ Monte Carlo โดยเป็น Visual Simulation กันครับ
(โปรแกรมที่ใช้ในการทำ Simulation นี้ ต้องเป็น Thaithon version 1.09 ขึ้นไป ดาวน์โหลดได้ ที่นี่ https://peacedev.wordpress.com/download/ เลยครับ)

#คำสั่งโปรแกรมภาษาไทยธอน

กล่องของฉัน = วัตถุสองมิติ.กล่องสองมิติ(1,1)
กล่องของฉัน.โหมดการวาด = GL_LINE_LOOP
กล่องของฉัน.ใช้พื้นผิว = เท็จ
วงกลมของฉัน = วัตถุสองมิติ.วงกลมสองมิติ(1)
รายการกระสุน = []

คลาส กระสุน:
	นิยาม __เริ่ม__(ตน,x,y,เข้าเป้า):
		ตน.x = x
		ตน.y = y
		ตน.เข้าเป้า = เข้าเป้า

	นิยาม วาด(ตน):
		glBegin(GL_POINTS)
		ถ้า ตน.เข้าเป้า:
			glColor3f(1.0,0.2,0.2)
		นอกจากนั้น:
			glColor3f(0.2,1.0,0.2)
		glVertex2f(self.x,self.y)
		glEnd()


คลาส หน้าต่าง(หน้าต่างกราฟฟิค):
	นิยาม เริ่มกราฟฟิค(ตน):
		ตน.เตรียมพื้นผิว(กล่องของฉัน)
		ตน.ตัวนับ = 0
		ตน.จำนวนเข้าเป้า = 0
	นิยาม วาดกราฟฟิค(ตน):
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
		glLoadIdentity()
		glTranslated(0.0, 0.0, -3.0)
		glRotatef(ตน.ตัวนับ,0.0,1.0,0.0)
		ตน.แสดงผลวัตถุ(กล่องของฉัน)
		ตน.แสดงผลวัตถุ(วงกลมของฉัน)
		x,y = ((สุ่ม()*2)-1,(สุ่ม()*2)-1)
		รัศมี = คณิต.ถอดราก(x**2 + y**2)
		ถ้า รัศมี  <= 1.0:
			เข้าเป้า = จริง
			ตน.จำนวนเข้าเป้า += 1.0
		นอกจากนั้น:
			เข้าเป้า = เท็จ
		กระสุนของฉัน = กระสุน(x,y,เข้าเป้า)
		รายการกระสุน.ต่อด้วย(กระสุนของฉัน)
		แต่ละ เม็ดกระสุน ใน รายการกระสุน:
			เม็ดกระสุน.วาด()
		ตน.ตัวนับ += 1
		ตน.เริ่มวาด()
		ตน.วาดอักษร("Monte Carlo Simulation on Thaithon" ,10,20,20,(120,250,200))
		ตน.วาดอักษร("จำนวนกระสุน : "  + ตัวหนังสือ(ตน.ตัวนับ),10,40,20,(100,200,250))
		ตน.วาดอักษร("ค่า pi ~ : "  + ตัวหนังสือ(4 * (ตน.จำนวนเข้าเป้า / ตน.ตัวนับ)),10,60,20,(100,200,250))
		ตน.จบการวาด()

หน้าต่างใหม่ = หน้าต่าง()
หน้าต่างใหม่.แสดง()

จะสังเกตุได้ว่าเมื่อจำนวนกระสุนเพิ่มมากขึ้น โปรแกรมของเราจะค่อย ๆ ช้าลง ๆ เรื่อย ๆ
เป็นเพราะ CPU จะทำการวาดกระสุนใหม่ ทุก ๆ เฟรม เกิดเป็นปัญหาคอขวดขึ้นมา
เดี๋ยวคราวหน้าจะเป็นการแก้ไขปัญหาให้โปรแกรมสามารถวิ่งได้เรื่อย ๆ โดยไม่สะดุดกันครับ

Share

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s