คอมพิวเตร์ทำงานด้วยระบบเลขฐาน 2 ในขณะที่ในชีวิตประจำวันของเรานั้น เราใช้ตัวเลขฐาน 10 ดังนั้นเวลาเราป้อนข้อมูลให้คอมพิวเตอร์ คอมพิวเตอร์ก็จะแปลงค่าตัวเลขในฐาน 10 ที่เราป้อนเข้าไปนั้นให้กลายเป็นตัวเลขในฐาน 2 แต่เนื่องจากว่าเนื่องจากเราไม่สามารถแปลงเลขจำนวนจริงฐาน 10 ให้กลายเป็นเลขจำนวนจริงฐาน 2 ที่มีค่าเท่ากันพอดีได้ทุกตัว มันทำได้เพียงแค่เก็บตัวเลขฐาน 2 ที่มีค่าใกล้เคียงเลขฐาน 10 ที่เราป้อนเข้าไปให้มากที่สุด ทำให้ตัวเลขฐาน 2 ที่อยู่ในเครื่องนั้นมีค่าแตกต่างไปจากตัวเลขฐาน 10 ที่เราต้องการให้มันเป็นอยู่เล็กน้อย ความคลาดเคลื่อนตรงนี้เรียกว่า round off error
และบางทีความคลาดเคลื่อนแบบนี้ก็สามารถทำให้ผลการคำนวณนั้นผิดเพี้ยนไปแบบคนละเรื่องเลย เช่นตัวอย่างอย่างที่นำมาเล่าให้ฟังในวันนี้ ที่ผิดพลาดแบบจากไม่ควรหาคำตอบได้กลายเป็นมีคำตอบเฉยเลย
Cramer's rule เป็นวิธีการหนึ่งที่ใช้สำหรับหาคำตอบของระบบสมการพีชคณิตเชิงเส้น ตัวอย่างเช่นถ้าเรามีระบบสมการ 3 สมการ 3 ตัวแปรที่สามารถเขียนในรูปแบบเมทริกซ์ A·x = bดังนี้
เราสามารถคำนวณค่า x แต่ละตัวได้จากการใช้ค่า determinant ของเมทริกซ์ดังนี้
คำตอบจะมีก็ต่อเมื่อค่า determinant ของเมทริกซ A นั้นไม่เป็นศูนย์ (เพราะมันเป็นตัวหาร)
ทีนี้ลองพิจารณาระบบ 3 สมการ 3 ตัวแปรต่อไปนี้
ซึ่งถ้าคำนวณค่า determinant ของเมทริกซ์ A จะพบว่ามีค่าเป็นศูนย์ ดังนั้นเมื่อพิจารณาจาก Cramer's rule แล้วระบบสมการนี้ไม่ควรจะหาคำตอบได้
แต่เมื่อนำไปทดลองคำนวณด้วยโปรแกรม GNU Octave (version 10.2.0) โดยเริ่มจากหาค่า determinant ก่อน
>> format long e
>> a1 = [3, 1, 4];
>> a2 = [4, 2, 2];
>> a3 = [-1, -1, 2];
>> A = [a1; a2; a3]
A =
3.000000000000000e+00 1.000000000000000e+00 4.000000000000000e+00
4.000000000000000e+00 2.000000000000000e+00 2.000000000000000e+00
-1.000000000000000e+00 -1.000000000000000e+00 2.000000000000000e+00
>> d = det(A)
d = 0
จะเห็นว่าค่า determinant ที่ได้นั้นมีค่าเป็นศูนย์ แต่เมื่อสั่งให้โปรแกรมทำการคำนวณหาค่าคำตอบกลับพบว่า
>> b = [1; 1; 1];
1.000000000000000e+00
1.000000000000000e+00
1.000000000000000e+00
>> x = A\b
warning: matrix singular to machine precision
x =
2.857142857142860e-02 (x1)
-4.761904761904767e-02 (x2)
3.238095238095241e-01 (x3)
กลับพบว่ามันให้คำตอบ (x1, x2 และ x3) ออกมาเป็นตัวเลขที่ดูดีเสียด้วย (คือไม่มากมหาศาลหรือเข้าใกล้ศูนย์มาก) แต่ถ้าทดลองนำคำตอบที่ได้ไปแทนค่าในโจทย์เริ่มต้น จะพบว่ามันไม่ใช่คำตอบที่ทำให้สมการเป็นจริง
หรือลองดูอีกตัวอย่างกับระบบสมการ
ซึ่งในตัวอย่างนี้ค่า determinant ของเมทริกซ์ A ก็มีค่าเป็นศูนย์เช่นกัน และเมื่อคำนวณด้วยโปรแกรม GNU Octave (version 10.2.0) ก็พบว่า
>> a1 = [7, 3, 2];
>> a2 = [1, 1, 1];
>> a3 = [5, 1, 0];
>> A = [a1; a2; a3]
A =
7 3 2
1 1 1
5 1 0
>> d = det(A)
d = -1.7764e-15
ผลการคำนวณให้ค่า determinant เข้าใกล้ศูนย์มาก (อันนี้เป็นผลจาก round off error) และเมื่อให้โปรแกรมคำนวณหาคำตอบของระบบสมการก็พบว่า
>> b = [1; 1; 1];
>> x = A\b
warning: matrix singular to machine precision, rcond = 6.83214e-18
x =
-1.1259e+15 (x1)
5.6295e+15 (x2)
-4.5036e+15 (x3)
โปรแกรมก็ยังสามารถส่งคำตอบออกมาเป็นตัวเลขที่ (อาจจะ) นำไปใช้คำนวณต่อในขั้นตอนการทำงานถัดไปได้
จากประสบการณ์ที่เคยเจอและได้ให้คำแนะนำกับนิสิตที่มาปรึกษา ผมจะบอกเขาเป็นประจำว่า ปัญหาโปรแกรมรันแล้วหยุดการทำงานก่อนจะทำงานจบนั้นมันแก้ไม่ยากเมื่อเทียบกันโปรแกรมทำงานจนครบกระบวนการแล้วพบว่าคำตอบที่ได้มานั้นผิด เพราะถ้าโปรแกรมหยุดการทำงานตรงบรรทัดไหน มันก็สามารถไล่ย้อนกลับไปได้ว่าค่าตัวเลขตัวไหนที่นำมาใช้ในบรรทัดนั้นมันไม่ถูกต้อง แล้วก็สืบย้อนขึ้นไปตามเส้นทางที่มาของตัวเลขตัวนั้น
แต่ถ้าเป็นแบบได้ตัวเลขสุดท้ายมาแล้วพบว่าคำตอบมันผิด (เช่นดุลมวลสารได้ แต่ค่าที่ได้บางค่ามันติดลบ หรือตัวเลขมีขนาดที่มาก (คูณ 10 ยกกำลังสูงมาก) หรือน้อย (คูณ 10 ยกกำลังติดลบมาก) ผิดปรกติมาก) อันนี้จะหาจุดผิดได้ยากกว่า ตัวอย่างหนึ่งที่เคยเจอก็คือเขาเลือกเทคนิคการคำนวณที่ผิด ดังนั้นถ้าไปตรวจหาว่าเขียนโปรแกรมบรรทัดไหนผิด หรือป้อนตัวเลขไหนผิด มันก็หาไม่เจอ เพราะตรงที่เขาหานั้นมันไม่มีที่ผิด แต่มันไปผิดตรงที่เทคนิคการประมาณค่าในช่วงที่เขาเลือกใช้นั้นมันไม่เหมาะสม พอให้เปลี่ยนเทคนิคการประมาณค่าในช่วงใหม่ ปัญหาก็หายไป
ไม่มีความคิดเห็น:
แสดงความคิดเห็น