การคำนวณค่า Pi และปริมาตรของทรงกลมหลายมิติ โดยวิธีของ MonteCarlo โดยภาษา python
ในยุคที่คอมพิวเตอร์พลังแรงมากมาย เราสามาถใช้พลังการคำนวณนี้ ให้เป็นประโยชน์ ในชีวิตจริงได้หลากหลายมาก ๆ และ หนึ่งในเทคนิคที่ใช้กันบ่อยและสุดยอดคือ เทคนิค MonteCarlo method
เนื่องจากในเน็ตมีการอธิบายเทคนิคนี้ดีมาก เยอะแยะมาก ผมขอไม่เขียนใหม่ตรงนี้
ใครอยากเข้าใจวิธีการคำนวณแบบ MonteCarlo ลองได้ที่นี่ครับ https://en.wikipedia.org/wiki/Monte_Carlo_method
และต่อไปนี้คือ python code สำหรับการคำนวณค่า Pi โดยวิธี MonteCarlo
import random
def estimate_pi(n):
num_points_inside_circle = 0
num_points_total = n
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
if x**2 + y**2 <= 1:
num_points_inside_circle += 1
return 4 * num_points_inside_circle / num_points_total
n = 1000000 # number of points
pi_estimate = estimate_pi(n)
print("Estimated value of pi using Monte Carlo method:", pi_estimate)
Estimated value of pi using Monte Carlo method: 3.140848
ลองอีกแบบ โค๊ด คล้ายๆ กัน
import random
import math
def estimate_pi(n):
inside = 0
for i in range(n):
x = random.random()
y = random.random()
if math.sqrt(x**2 + y**2) <= 1:
inside += 1
pi = 4 * inside / n
return pi
print(estimate_pi(1000000))
3.14052
วิธีนี้หาค่า Pi แบบนี้ เล็งดี ๆ มองอีกมุมก็คือ การหาค่าพื้นที่ของวงกลมรัศมี 1 นั่นเอง
ในชีวิตประจำวัน เรารู้จัก วงกลม(สองมิติ) ทรงกลม(สามมิติ) และเรียนวิธีหาพื้นที่วงกลมและปริมาตรทรงกลม กันมาทุกคน คราวนี้ ว่าแต่ สำหรับรูปทรงกลมมากกว่าสามมิติ มนุษย์ธรรมดา คงนึกภาพไม่ออก แต่ในเชิงคณิตศาสตร์ สามารถคิดได้ และ มีสูตรทั่วไป สำหรับการหา ปริมาตร (volume) ซะด้วย ใครที่สนใจ ลอง ค้นในเว็บดูนะครับ และแนวคิดนี้จะเอาไปใช้ในการคำนวณในฟิสิกส์และคณิตศาสตร์ที่เกี่ยวข้องกับมิติที่มากๆ ฉะนั้น รู้ไว้ น่าจะสนุกและเผลอๆ เรียนไปเรียนมาอาจจะได้ใช้นะครับ https://en.wikipedia.org/wiki/Volume_of_an_n-ball https://ja.wikipedia.org/wiki/%E8%B6%85%E7%90%83%E3%81%AE%E4%BD%93%E7%A9%8D
จากลิงค์ เราจะรู้จักกับ สูตรสำหรับหาค่าปริมาตรของรูปทรงกลมหลายมิติ ได้ และ สามารถเขียนโปรแกรม python สำหรับหาค่าปริมาตรของรูปทรงกลม ที่มีรัศมี 1 จาก 0 จนถึง 20 มิติ ได้ดังนี้
ถ้าต้องการ สามารถ เปลี่ยนค่ามิติสูงสุดที่ต้องการหาได้ โดยการเปลี่ยนค่า dimension ในโปรแกรม และรัศมีเปลี่ยนได้โดยเปลี่ยนค่า radius
import math
def volume_of_sphere(n, radius):
gamma_value = math.gamma(n/2 + 1)
volume = math.pow(math.pi, n/2) / gamma_value * math.pow(radius, n)
return volume
dimension = 20
radius = 1
for i in range(dimension +1):
radius = 1
sphere_volume = volume_of_sphere(i, radius)
print("Volume of a", i, "dimensional sphere with radius", radius, "=", sphere_volume)
Volume of a 0 dimensional sphere with radius 1 = 1.0
Volume of a 1 dimensional sphere with radius 1 = 1.9999999999999998
Volume of a 2 dimensional sphere with radius 1 = 3.141592653589793
Volume of a 3 dimensional sphere with radius 1 = 4.1887902047863905
Volume of a 4 dimensional sphere with radius 1 = 4.934802200544679
Volume of a 5 dimensional sphere with radius 1 = 5.263789013914325
Volume of a 6 dimensional sphere with radius 1 = 5.167712780049969
Volume of a 7 dimensional sphere with radius 1 = 4.7247659703314016
Volume of a 8 dimensional sphere with radius 1 = 4.058712126416768
Volume of a 9 dimensional sphere with radius 1 = 3.2985089027387064
Volume of a 10 dimensional sphere with radius 1 = 2.550164039877345
Volume of a 11 dimensional sphere with radius 1 = 1.8841038793898994
Volume of a 12 dimensional sphere with radius 1 = 1.3352627688545893
Volume of a 13 dimensional sphere with radius 1 = 0.910628754783283
Volume of a 14 dimensional sphere with radius 1 = 0.5992645293207919
Volume of a 15 dimensional sphere with radius 1 = 0.38144328082330436
Volume of a 16 dimensional sphere with radius 1 = 0.23533063035889312
Volume of a 17 dimensional sphere with radius 1 = 0.14098110691713897
Volume of a 18 dimensional sphere with radius 1 = 0.08214588661112819
Volume of a 19 dimensional sphere with radius 1 = 0.046621601030088534
Volume of a 20 dimensional sphere with radius 1 = 0.02580689139001405
จะเห็นความแปลกๆ ก็คือ ปริมาตรของทรงกลมหลายมิติ ไม่ได้ใหญ่ขึ้นๆ ตามขนาดของมิติ แต่ใหญ่ที่สุดที่ 5 มิติ แล้วหลังจากนั้นลดลง จนในที่สุด มีขนาดเป็นศูนย์ มันช่างขัดความรู้สึกพอสมควร หาก ใครเข้าใจตรงนี้ได้ ช่วยขยายความต่อด้วยละกันนะครับ :-)
ทีนี้ หากเราไม่รู้จักสูตรที่ว่า แต่ ต้องหา ปริมาตรของ ทรงกลม ในหลายมิติ เราสามารถใช้ ความรู้จาก การหาในสองมิติ ข้างต้น ขยายแนวคิดให้เป็น การหาปริมาตรของ ทรงกลม ในหลายมิติได้ และเราสามารถเขียน python code ให้คำนวณ ปริมาตรของ ทรงกลม ในหลายมิติ โดยวิธีของ MonteCarlo ได้ดังนั้ครับ
import random
import math
def n_sphere_volume(n, samples):
count = 0
for i in range(samples):
point = []
for j in range(n):
point.append(random.uniform(-1, 1))
distance = math.sqrt(sum([x ** 2 for x in point]))
if distance <= 1:
count += 1
return 2 ** n * count / samples
dimension=20
radius = 1
for j in range(dimension+1):
print("Volume of a", j, "dimensional sphere with radius", radius, "= by MonteCarloMethod", n_sphere_volume(j,100000))
Volume of a 0 dimensional sphere with radius 1 = by MonteCarloMethod 1.0
Volume of a 1 dimensional sphere with radius 1 = by MonteCarloMethod 2.0
Volume of a 2 dimensional sphere with radius 1 = by MonteCarloMethod 3.13596
Volume of a 3 dimensional sphere with radius 1 = by MonteCarloMethod 4.19064
Volume of a 4 dimensional sphere with radius 1 = by MonteCarloMethod 4.96688
Volume of a 5 dimensional sphere with radius 1 = by MonteCarloMethod 5.27552
Volume of a 6 dimensional sphere with radius 1 = by MonteCarloMethod 5.20128
Volume of a 7 dimensional sphere with radius 1 = by MonteCarloMethod 4.66816
Volume of a 8 dimensional sphere with radius 1 = by MonteCarloMethod 3.96288
Volume of a 9 dimensional sphere with radius 1 = by MonteCarloMethod 3.5072
Volume of a 10 dimensional sphere with radius 1 = by MonteCarloMethod 2.47808
Volume of a 11 dimensional sphere with radius 1 = by MonteCarloMethod 1.69984
Volume of a 12 dimensional sphere with radius 1 = by MonteCarloMethod 1.06496
Volume of a 13 dimensional sphere with radius 1 = by MonteCarloMethod 0.65536
Volume of a 14 dimensional sphere with radius 1 = by MonteCarloMethod 0.16384
Volume of a 15 dimensional sphere with radius 1 = by MonteCarloMethod 0.32768
Volume of a 16 dimensional sphere with radius 1 = by MonteCarloMethod 0.0
Volume of a 17 dimensional sphere with radius 1 = by MonteCarloMethod 0.0
Volume of a 18 dimensional sphere with radius 1 = by MonteCarloMethod 0.0
Volume of a 19 dimensional sphere with radius 1 = by MonteCarloMethod 0.0
Volume of a 20 dimensional sphere with radius 1 = by MonteCarloMethod 0.0
จะเห็นว่า การคำนวณโดย MonterCarlo ซึ่งถือเป็นการคำนวณโดยสถิติ ความแม่นยำเป็นไปตามหลักสถิติ ค่าที่ได้ จะไม่เป๊ะๆ เหมือนกับการใช้สูตร
เอาสองวิธีมาใส่ในโค๊ดเดียวกัน จะได้เปรียบเทียบผลคำนวณได้ง่ายนิด
import math
import random
dimension=20
radius = 1
def volume_of_sphere(n, radius):
gamma_value = math.gamma(n/2 + 1)
volume = math.pow(math.pi, n/2) / gamma_value * math.pow(radius, n)
return volume
def n_sphere_volume(n, samples):
count = 0
for i in range(samples):
point = []
for j in range(n):
point.append(random.uniform(-1, 1))
distance = math.sqrt(sum([x ** 2 for x in point]))
if distance <= 1:
count += 1
return 2 ** n * count / samples
for j in range(dimension+1):
sphere_volume = volume_of_sphere(j, radius)
print("Volume of a", j, "dimensional sphere with radius", radius, " by formula = ", sphere_volume)
print("Volume of a", j, "dimensional sphere with radius", radius, " by MonteCarlo= ", n_sphere_volume(j,100000))
print()
Volume of a 0 dimensional sphere with radius 1 by formula = 1.0
Volume of a 0 dimensional sphere with radius 1 by MonteCarlo= 1.0
Volume of a 1 dimensional sphere with radius 1 by formula = 1.9999999999999998
Volume of a 1 dimensional sphere with radius 1 by MonteCarlo= 2.0
Volume of a 2 dimensional sphere with radius 1 by formula = 3.141592653589793
Volume of a 2 dimensional sphere with radius 1 by MonteCarlo= 3.1294
Volume of a 3 dimensional sphere with radius 1 by formula = 4.1887902047863905
Volume of a 3 dimensional sphere with radius 1 by MonteCarlo= 4.19296
Volume of a 4 dimensional sphere with radius 1 by formula = 4.934802200544679
Volume of a 4 dimensional sphere with radius 1 by MonteCarlo= 4.98832
Volume of a 5 dimensional sphere with radius 1 by formula = 5.263789013914325
Volume of a 5 dimensional sphere with radius 1 by MonteCarlo= 5.26496
Volume of a 6 dimensional sphere with radius 1 by formula = 5.167712780049969
Volume of a 6 dimensional sphere with radius 1 by MonteCarlo= 5.23968
Volume of a 7 dimensional sphere with radius 1 by formula = 4.7247659703314016
Volume of a 7 dimensional sphere with radius 1 by MonteCarlo= 4.6592
Volume of a 8 dimensional sphere with radius 1 by formula = 4.058712126416768
Volume of a 8 dimensional sphere with radius 1 by MonteCarlo= 4.16256
Volume of a 9 dimensional sphere with radius 1 by formula = 3.2985089027387064
Volume of a 9 dimensional sphere with radius 1 by MonteCarlo= 3.4304
Volume of a 10 dimensional sphere with radius 1 by formula = 2.550164039877345
Volume of a 10 dimensional sphere with radius 1 by MonteCarlo= 2.57024
Volume of a 11 dimensional sphere with radius 1 by formula = 1.8841038793898994
Volume of a 11 dimensional sphere with radius 1 by MonteCarlo= 1.45408
Volume of a 12 dimensional sphere with radius 1 by formula = 1.3352627688545893
Volume of a 12 dimensional sphere with radius 1 by MonteCarlo= 1.39264
Volume of a 13 dimensional sphere with radius 1 by formula = 0.910628754783283
Volume of a 13 dimensional sphere with radius 1 by MonteCarlo= 0.65536
Volume of a 14 dimensional sphere with radius 1 by formula = 0.5992645293207919
Volume of a 14 dimensional sphere with radius 1 by MonteCarlo= 0.65536
Volume of a 15 dimensional sphere with radius 1 by formula = 0.38144328082330436
Volume of a 15 dimensional sphere with radius 1 by MonteCarlo= 0.0
Volume of a 16 dimensional sphere with radius 1 by formula = 0.23533063035889312
Volume of a 16 dimensional sphere with radius 1 by MonteCarlo= 0.0
Volume of a 17 dimensional sphere with radius 1 by formula = 0.14098110691713897
Volume of a 17 dimensional sphere with radius 1 by MonteCarlo= 0.0
Volume of a 18 dimensional sphere with radius 1 by formula = 0.08214588661112819
Volume of a 18 dimensional sphere with radius 1 by MonteCarlo= 0.0
Volume of a 19 dimensional sphere with radius 1 by formula = 0.046621601030088534
Volume of a 19 dimensional sphere with radius 1 by MonteCarlo= 0.0
Volume of a 20 dimensional sphere with radius 1 by formula = 0.02580689139001405
Volume of a 20 dimensional sphere with radius 1 by MonteCarlo= 0.0