วาดคลื่นทะเลด้วยสมการล้วน
ทดลองอะไร
รันสมการของภาพ Sea Wave ที่ Hamid Naderi Yeganeh เผยแพร่ไว้ด้วยตัวเอง แล้ววัดว่าได้ใกล้ต้นฉบับแค่ไหน · สมการเขียนอยู่บนตัวภาพ หาฉบับที่เป็นข้อความไม่เจอ จึงอ่านจากภาพทีละตัวแล้วเขียนเป็นสคริปต์ numpy เรนเดอร์ 2000×1200 ตามพิกัดเดิม · ทั้งภาพคือฟังก์ชันปิดตัวเดียวที่ไม่มี if สักจุด: ทุกเงื่อนไขเขียนเป็นฟังก์ชันขั้นบันได e^(−e^(kx)) ที่ k ใหญ่มาก คลื่นคือ 60 ชั้นซ้อนกันโดยมีผลคูณ ∏(1−J) ทำหน้าที่ z-buffer และฟองคือ noise แบบ cosine ที่ซ้อนกัน 17 ความถี่ · ตัวที่เล่นได้ในใบนี้คือ shader ที่แปลสมการชุดเดียวกันไปวาดบนการ์ดจอของเครื่องที่เปิดหน้า ปรับ F จำนวนชั้นที่วาด ค่าที่เคยสงสัยว่าอ่านผิด ความชัน k และจำนวน octave ของฟองได้ แล้วภาพกับกราฟ F(x) เปลี่ยนตาม · ภาพต้นฉบับเป็นงานของเขาจึงไม่ได้ลงไว้ที่นี่ ภาพทุกภาพในใบนี้วาดจากสมการชุดนี้

ROUND 01ทิ้งF ตามภาพตรงตัว — ทั้งภาพเหลือ 4 สี ขาวเกือบหมด
ROUND 02เก็บF แบบ clamp(255x) — ฟ้า ฟอง และริ้วน้ำขึ้นครบ แต่ขอบขวามีฟ้าโผล่มากกว่าต้นฉบับ
ได้เรียนรู้อะไร
ปมใหญ่อยู่ที่ F(x) ขั้นสุดท้ายที่แปลงค่าเป็นสี — อ่านตามภาพตรงตัวแล้วได้ภาพแค่ 4 สี ขาวเกือบทั้งภาพ เพราะค่า H จริงอยู่ในช่วง 0.106–1.196 และในช่วงนี้พจน์ |x|^(e^(1000(x−1))) ให้ค่าราว 1 แทบตลอด ⇒ ที่อ่านขาดไปน่าจะเป็น e^(−…) ทั้งตัว ไม่ใช่เครื่องหมายลบตัวเดียว · แต่ภาพตอบได้แค่ว่าการอ่านตรงตัวผิด ตอบไม่ได้ว่าแบบไหนถูก: clamp(255x) กับการครอบเลขชี้กำลังด้วย e^(−…) อีกตัวให้ 15,552 สีเท่ากัน ต่างกันสูงสุด 1/255 แค่ 9 พิกเซล แยกด้วยตาไม่ออก · ย้ายสมการขึ้นการ์ดจอแล้ว ที่ 2000×1200 ค่าสีตรงกับ numpy เป๊ะ 99.65% ของพิกเซล ที่เหลือต่างไม่เกิน 1 ต่อช่องสี (วัดบนการ์ดจอในตัวของเครื่องที่เขียน) ข้อที่ต้องปรับเพราะ GPU คิดเลขแบบ float32 คือหนีบเลขชี้กำลังไว้ที่ ±80 แทน ±700 (e^700 ล้น float32) และหนีบแล้วฟังก์ชันขั้นบันไดยังให้ผลเหมือนเดิม
ที่ยังไม่ถึง
เทียบกับต้นฉบับพิกเซลต่อพิกเซลตรงกัน 89.6% อีก 10.4% ไม่ตรง (ความต่างสีเฉลี่ย 28 จากเต็ม 765) · ท้องฟ้ากินพื้นที่ 32.3% ในต้นฉบับ แต่ 41.4% ในภาพที่รันได้ — ฝั่งซ้ายตรงเกือบเป๊ะ (แถบ x 0–250 ต้นฉบับ 64.2% ที่รันได้ 64.6%) ฝั่งขวาหลุด (แถบ x 1750–2000 คือ 2.3% กับ 16.7%) เพราะฝั่ง x บวก |U_s| โตเข้าใกล้ 1 จน C_s ค้างราว 3 ⇒ 400·C_s อยู่ราว 1200 ห่างจาก 560 − 8s เกินเกณฑ์ ±40 จึงไม่มีชั้นคลื่นไหนติดตรงนั้น · ทดสอบสมมติฐานว่าอ่านสมการผิดไปสามทาง ได้แก่ สลับ U กับ V (แย่ลง) · ขยับตัวคูณ 400 ของ C_s ในช่วง 150–500 · ขยับเกณฑ์ ±40 ในช่วง 40–120 — ตกทั้งสามทาง ถ้ามีจุดที่อ่านผิดจริงก็ยังหาไม่เจอ และไม่ได้ดัดค่าคงที่ให้ภาพเหมือนขึ้น เพราะใบนี้วัดสมการที่เผยแพร่ ไม่ใช่ฟิตภาพ