เครื่องคำนวณการประมาณค่าแบบ Chebyshev
(stuffmatic.com)- Chebyshev approximation calculator เป็นเครื่องมือที่สร้าง โค้ดสำหรับประมาณค่าฟังก์ชันทางคณิตศาสตร์ บนเว็บ
- ผู้ใช้สามารถระบุ ฟังก์ชันและช่วง รวมถึงจำนวนพจน์ ที่ต้องการประมาณค่าได้ด้วย
f(x),x min,x max,Terms - มีขั้นตอนให้ตรวจสอบหรือปรับขอบเขตของช่วงและ ค่าค่าสัมประสิทธิ์ ผ่านตัวเลือก
Match x min x maxและพื้นที่ Coefficients - ในพื้นที่ Generated code ผลลัพธ์การคำนวณจะแสดงในรูปแบบโค้ด และในหน้าจอตัวอย่างมีค่าสัมประสิทธิ์ตั้งแต่
c0ถึงc10 - มีการเชื่อมโยงไปยัง GitHub repository ทำให้สามารถตรวจสอบโค้ดการทำงานของเครื่องมือเว็บนี้ได้โดยตรง
ตัวสร้างโค้ดการประมาณค่าแบบ Chebyshev
- Chebyshev approximation calculator สร้างโค้ดสำหรับประมาณค่า ฟังก์ชันทางคณิตศาสตร์ อย่างมีประสิทธิภาพ
- ป้อนเงื่อนไขการประมาณค่าในเว็บ UI
f(x): ฟังก์ชันที่ต้องการประมาณค่าx min: ค่าต่ำสุดของช่วงx max: ค่าสูงสุดของช่วงTerms: จำนวนพจน์ที่จะใช้Match x min x max: ตัวเลือกที่เกี่ยวข้องกับขอบเขตของช่วง
การตรวจสอบค่าสัมประสิทธิ์และโค้ดที่สร้างขึ้น
- หน้าจอแบ่งออกเป็นพื้นที่ Coefficients และพื้นที่ Generated code
- ค่าสัมประสิทธิ์ที่แสดงเป็นตัวอย่างสามารถตรวจสอบได้ตั้งแต่
c0ถึงc10c0 = 0.16793649417016518c1 = -0.12411164956092625c2 = -0.09756341588422193c3 = 0.1800765790518846c4 = -0.06972963647223016c5 = -0.09250127939333941c6 = 0.18076946080324185c7 = 0.15990613621816677c8 = -0.028659588693985123c9 = -0.09494966104347571c10 = -0.04980429834982578
- บนหน้าจอยังแสดงรายการค่าสัมประสิทธิ์ตั้งแต่
c11ถึงc39ด้วย
คลังโค้ด
- GitHub repository ที่เกี่ยวข้อง: stuffmatic/chebyshev-calculator
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เจ๋งดีครับ ราวปี 1974 ผมเคยเขียนฟังก์ชันคำนวณรากที่สองด้วย IBM 360 assembly แล้วได้รับค่าจ้าง
ตอนนั้นเป็นปีสุดท้ายของปริญญาตรี และถูกขอให้ทำให้มีประสิทธิภาพที่สุดเท่าที่จะทำได้ ผมสเกลอินพุตให้อยู่ระหว่าง 0 กับ 1 แล้วใช้ การประมาณแบบ Chebyshev สำหรับค่าประมาณเริ่มต้น จากนั้นใช้วิธีของ Newton แบบคลี่ลูปวนซ้ำ 2 หรือ 3 รอบเพื่อหาคำตอบ นั่นเป็นรายได้ครั้งแรกที่ได้จากการเขียนโค้ด
ทำได้ดีมากจริงๆ ผมทึ่งกับประสิทธิภาพของการประมาณแบบนี้ และเข้าใจมากขึ้นว่าทำไมการ implement ฟังก์ชันตรีโกณมิติหรือฟังก์ชันคณิตศาสตร์อื่นๆ บน คอมพิวเตอร์ 8 บิต ถึงทำกันแบบนั้น
มีเอกสารต้นฉบับดีๆ จาก BBC Research Department ปี 1969 ที่อธิบายว่าทำไมแนวทางนี้ถึงยอดเยี่ยม: https://downloads.bbc.co.uk/rd/pubs/reports/1969-10.pdf
ถ้าเคยเจอแค่ การประมาณแบบ Taylor ตอนแรกมันอาจดูเหมือนเวทมนตร์นิดๆ
เมื่อก่อนผมเคยได้ผลลัพธ์ดีๆ จาก Sollya: https://www.sollya.org/
แต่ถึงผลลัพธ์จะดี ตัวซอฟต์แวร์เองใช้ค่อนข้างยุ่งยาก
ถ้าประมาณ
Math.sin(x)/xหรือก็คือ ฟังก์ชัน sinc บนช่วง[-3,3]ด้วย 7 พจน์ ค่าสัมประสิทธิ์c0...c6ทั้งหมดจะกลายเป็นNaNนี่เป็นบั๊กไหม?วิธีแก้ชั่วคราวคือบังคับให้เป็น
1.0ไปเลยเมื่อxใกล้ 0if(Math.abs(x) > 1e-8 ){ Math.sin(x)/x } else { 1.0 }x_j = (xmin) + (xmax - xmin)/2(1 + cos(pi[0..j-1]/(j-1))เพื่อหาสัมประสิทธิ์ Chebyshev และถ้าหนึ่งในจุดนั้นเป็น 0 พอดี ก็จะคำนวณMath.sin(0)/0จนได้NaNวิธีเลี่ยงอีกแบบคือใช้ช่วงที่ไม่สมมาตรเล็กน้อย เช่น
[-3,+3.0000001]x=0และโค้ดประมาณค่าน่าจะสะดุดตรงนั้น โค้ดน่าเสียดายหน่อยนะพหุนาม Chebyshev ทรงพลังและอเนกประสงค์มากในการประมาณค่า จนคนคิดว่ามันดีเกินจริงเหมือนหลอกลวง แล้วกลับไม่ใช้มัน
วิธีแรกที่ควรลองควรเป็น Chebyshev ส่วน neural network ควรเป็นทางเลือกสุดท้าย
ยอดเยี่ยมเลย ช่วงหลังผมอยากทำอะไรแบบนี้พอดี แต่กลับพบว่ายากอย่างน่าประหลาดใจที่จะหาโค้ดสำหรับคำนวณการประมาณ
เลยบุ๊กมาร์กไว้ เผื่อครั้งหน้าต้องประมาณฟังก์ชันให้เร็ว
Chebyshev เหมือน มนตร์ดำ เลย ถึงจะเคยเห็นขั้นตอนการ derive ในคลาสระดับบัณฑิตศึกษาแล้วก็ยังรู้สึกแบบนั้น
ต้องพูดถึง Chebfun ของ Nick Trefethen และคณะด้วย เครื่องมือนี้ขยายแนวคิดนี้ออกไปแทบทุกทิศทางที่นึกออก
Chebfunsมองได้ว่าเป็นสิ่งคู่กันของฟังก์ชัน คล้ายกับที่ floating point number เป็นตัวแทนของจำนวนจริงทางคณิตศาสตร์ เป็นซอฟต์แวร์ที่น่าประทับใจจริงๆhttps://www.chebfun.org
ทำให้ทำอะไรได้หลากหลาย เช่น หาคำตอบของ differential-algebraic equations ที่ระดับ machine precision หรือหาค่าต่ำสุด/สูงสุดทั่วทั้งโดเมนของฟังก์ชันหนึ่งมิติ
เท่าที่รู้ตอนนี้เขาใช้อัลกอริทึมอื่นแล้ว แต่วิธีพื้นฐานที่ Chebfun เคยใช้ดูได้ในบทที่ 6 ของหนังสือ
Spectral Methods in Matlabของ Trefethen ส่วนวิธีสมัยใหม่ที่ใช้ ultraspherical functions อยู่ในบทความ SIAM Review ของ Olver และ Townsend เรื่องA Fast and Well-Conditioned Spectral Methodมีเรื่องสงสัย ไม่รู้ถามตรงนี้ได้ไหม เมื่อก่อนผมเคยดูวิดีโอที่บอกว่า Nintendo 64 ไม่มีความสามารถพอจะคำนวณ ฟังก์ชัน sine เลยใช้ lookup table ตั้งแต่ 0 ถึง 2π และยังมีเทคนิคฉลาดๆ เพื่อลดขนาดตารางด้วย
เป็นไปได้ไหมที่จะเทรน neural network แล้วเก็บ weights หรือสร้างฟังก์ชันแล้วเก็บ coefficients เพื่อคำนวณ sine/cosine?
ถ้ายังเหลือ CPU cycles นิดหน่อย อาจใช้ การประมาณแบบไฮบริด โดยเอาค่า lookup table แบบห่างๆ เป็นค่าประมาณเริ่มต้น แล้ววนซ้ำเทคนิค numerical approximation สักสองสามครั้ง หรือไม่ก็เก็บเฉพาะ coefficients ต้นๆ ไม่กี่ตัวของ polynomial approximation แบบในโพสต์ต้นทาง
neural network อาจมีประโยชน์เมื่อคุณมีตัวอย่างของฟังก์ชันบางอย่าง แต่ไม่รู้จะประมาณมันอย่างไร ทว่ากรณีนี้ไม่ใช่แบบนั้น
neural network เป็นทางออกที่ยอดเยี่ยมเมื่อต้องประเมินสิ่งที่วิเคราะห์ทางคณิตศาสตร์ได้ไม่ง่าย แต่เทคนิคที่รู้จักกันดีสำหรับคำนวณและประมาณฟังก์ชันตรีโกณมิติมีอยู่มากมายแล้ว
การเทรน neural network เพื่อคำนวณ sine ก็เหมือนเวอร์ชันคณิตศาสตร์ของการใช้ LLM เพื่อกลับสตริง ทำได้ก็จริง แต่เป็นไอเดียที่จะนึกถึงก็ต่อเมื่อไม่รู้ว่าปัญหานี้แก้ได้โดยตรงในสาระสำคัญมากกว่า
ก่อนใช้ เทคนิค AI/ML ควรตรวจดูเสมอว่านักคณิตศาสตร์มีวิธีแก้อยู่แล้วหรือไม่ ทุกวันนี้มีความเป็นไปได้สูงที่คนจำนวนมากกำลังทุ่มแรงกับการเอา AI/ML ไปแปะกับปัญหาที่นักพัฒนาแค่ไม่รู้ว่าแท้จริงแล้วมีวิธีแก้ที่เป็นที่รู้จัก มีประสิทธิภาพ และแม้แต่เหมาะที่สุดอยู่แล้ว
จุดแข็งหลักของ neural network จะเห็นชัดเมื่อมีอินพุตจำนวนมาก ไม่ใช่แค่ไม่กี่ตัว สำหรับกรณีง่ายๆ อย่าง
sin(x)ก็มีวิธีอื่นอย่างเครื่องมือที่โพสต์นี้พูดถึงเจ๋งมาก ผมเกิดอยากลองเล่นดูว่าทำฟังก์ชันที่ประมาณได้ไม่ดีขึ้นมาได้เร็วแค่ไหน
จนถึงตอนนี้
Math.cos(x * Math.exp(Math.cos(x * x)))ทำได้ดีที่สุด มีการ compose หลายชั้นจนเกิดการสั่นเร็วและความชันสูง ทำให้ Chebyshev ประมาณได้ยาก