เมฆกระป๋อง


ถ้าท่านได้รับข้อความเหล่านี้ทางอีเมล์แต่ไม่เห็นวิดีโอคลิป เข้ามาดูที่ https://witpoko.com/ นะครับ ภาพทั้งหมดอยู่ที่อัลบัมนี้ครับ

(คราวที่แล้วเรื่องความเฉื่อยครองโลกที่นี่ครับ)
 
วันนี้เป็นวันอังคารที่ผมมีโอกาสเข้าไปทำการทดลองวิทยาศาสตร์กับเด็กๆกลุ่มบ้านเรียนปฐมธรรมและเด็กๆอนุบาลบ้านพลอยภูมิอีกครั้งครับ คราวนี้ทำการทดลองตามคำเรียกร้องของน้องเมกก้าที่ถามไว้ก่อนปิดเรียนตอนปีใหม่ว่าเราสร้างเมฆได้ไหม ซึ่งผมก็ตอบว่ามีคนทำได้แล้วผมจะหาวิธีทำมาทำกัน
 
สำหรับเด็กประถมกลุ่มปฐมธรรม ผมเริ่มด้วยการถามว่าเมฆเกิดมาได้อย่างไร เด็กๆก็ตอบกันใหญ่ว่าต้องมีไอน้ำ ผมก็บอกว่าถูกแล้วต้องมีไอน้ำ แต่ปกติเราจะไม่เห็นไอน้ำ แล้วเราเห็นเมฆขาวๆได้อย่างไร เด็กๆบอกว่าเราก็เห็นไอน้ำขาวๆลอยออกมาจากน้ำร้อนๆหรือต้มน้ำนะ ผมบอกว่าสิ่งที่เราเห็นสีขาวๆนั้น เป็นหยดน้ำเล็กๆที่เกิดจากไอน้ำเย็นตัวลงแล้วควบแน่นเป็นหยดน้ำ เมฆก็เช่นกัน เกิดจากการที่ไอน้ำลอยขึ้นไปสูงๆแล้วควบแน่นเป็นหยดน้ำเล็กๆสะท้อนแสงสีขาวอยู่ในท้องฟ้านั่นเอง

Continue reading เมฆกระป๋อง

A Barnsley’s Fern In 7 Lines of Mathematica

I used to draw a Barnsley’s fern with a program written in Pascal when I was 19 years old. Yesterday someone asked about it in a forum I visited, so I drew another one using Mathematica. The code is much shorter this time. (I’m sure that many people can shorten it even more.)
Here’s the code to draw the fern with 10,000 points. You can copy and paste and run it in Mathematica:

          

ifsFern[p_] := Module[{i},
i = Random[Integer, 99];
If[i < 1, Return[{{0., 0.}, {0., .16}}.p ]];
If[i >= 1 && i < 86, Return[{{0.85, 0.04}, {-0.04, 0.85}}.p + {0., 1.6}]];
If[i >= 86 && i < 93, Return[{{0.20, -0.26}, {0.23, 0.22}}.p + {0., 1.6}]];
If[i >= 93, Return[{{-0.15, 0.28}, {0.26, 0.24}}.p + {0., 0.44}]]]


Graphics[{RGBColor[0, 0.5, 0], Point[NestList[ifsFern, {0, 0}, 10000]]}]


The result looks like this:

แก้สมการด้วยวิธีของนิวตัน

 
มีเด็กๆที่สนใจคณิตศาสตร์มาถามผมว่าสมการทั่วๆไปแก้ออกมาเป๊ะๆไม่ได้แล้วเราทำอย่างไร ผมก็บอกว่าสมการส่วนใหญ่เราต้องหาคำตอบด้วยการประมาณเอาครับ ซึ่งวิธีอันหนึ่งที่เราสามารถใช้ได้ง่ายๆก็คือวิธีของนิวตัน ข้างล่างนี้เป็นกระทู้ที่ผมเขียนไว้ที่ Mahidol Physics Educational Center ครับ:

******

สำหรับปัญหาที่เราแก้สมการโดยตรงไม่ได้ เราต้องแก้ด้วยวิธีประมาณด้วยตัวเลขครับ วิธีที่ใช้กันบ่อยๆวิธีหนึ่งก็คือวิธีการของนิวตัน (Newton’s method: http://en.wikipedia.org/wiki/Newton’s_method) ครับ

วิธีการของนิวตันบอกว่า ถ้าจะแก้สมการ f(x) = 0 ให้เราเดาค่า x มาสักค่า (เรียกมันว่า x0) ก็แล้วกัน แล้วค่า x อันต่อไป (เรียกมันว่า x1) ที่น่าจะทำให้ f(x) ใกล้ศูนย์มากขึ้น ควรจะคำนวณอย่างนี้ครับ:

x1 = x0 – f(x0)/f'(x0) โดยที่ f'(x) คือ derivative ของ f(x) ครับ

ถ้าค่า x1 ทำให้ f(x) ไม่ใกล้ 0 พอ เราก็หา x2, x3, x4, … ไปเรื่อยๆจนเราพอใจว่าค่า f(xn) ใกล้ 0 พอแล้ว โดยที่ xn หาได้จาก xn-1 ดังนี้ครับ:

xn = xn-1 – f(xn-1)/f'(xn-1)

ถ้าจะทำการคำนวณด้วยวิธีของนิวตันใน Mathematica สามารถทำอย่างนี้ครับ:

newtonSolve[f_, guess_, steps_] := NestList[ #1 – f[#1]/f'[#1] &, guess, steps]

f คือฟังค์ชั่นที่เราจะหา f(x) = 0
guess คือค่าที่เราเดาตอนแรกว่า f(guess) น่าจะไม่ห่างจาก 0 นัก
steps คือจำนวนครั้งที่เราจะทำการทำวิธีของนิวตันซำ้ๆกัน

ยกตัวอย่างเช่น เราจะหาค่ารูทที่สองของสอง เราก็เขียนสมการ f(x) = x^2 -2 = 0 ก่อน เพราะค่า x เท่ากับรูทที่สองของสองจะแก้สมการนั้นพอดี:

f[x_] := x^2 – 2

แล้วเราก็เรียก newtonSolve ด้วยฟังค์ชั่น f โดยเดาค่า guess = 1 และให้ทำซ้ำสักห้าครั้ง:

newtonSolve[f, 1, 5]

แล้วเราก็ได้ผลดังนี้: {1, 3/2, 17/12, 577/408, 665857/470832, 886731088897/627013566048}

Mathematica ทำการคำนวณให้เป็นค่าเศษส่วนไม่มีทศนิยม เพราะเราเดาด้วยค่า 1 ซึ่งเป็นจำนวนที่ไม่มีการประมาณเข้ามาเกี่ยวข้อง ถ้าเราต้องการคำตอบเป็นเลขทศนิยม เราก็ควรเดาด้วยค่า 1.0 ดังนี้:

newtonSolve[f, 1.0, 5]

แล้วเราก็จะได้ผลดังนี้: {1., 1.5, 1.41667, 1.41422, 1.41421, 1.41421} ซึ่งเราจะเห็นว่า 1.41421 นั้นเป็นค่าประมาณของรูทที่สองของสองได้ดีทีเดียว

นักศึกษาลองไปทดลองดูครับ

มีใครอยากลองอธิบายว่า newtonSolve[f_, guess_, steps_] := NestList[ #1 – f[#1]/f'[#1] &, guess, steps] ทำงานอย่างไรใน Mathematica ไหมครับ เป็นการฝึกความเข้าใจเรื่อง Pure function และ Functional programming ครับ

******

บันทึกกิจกรรมวิทยาศาสตร์สำหรับเด็กๆ อยากให้คุณพ่อคุณแม่คุณครูเอาไปประยุกต์เล่นกับเด็กๆเยอะๆครับ :-)