วันอาทิตย์ที่ 2 ธันวาคม พ.ศ. 2561

การคำนวณค่าฟังก์ชันพหุนาม (การทำวิทยานิพนธ์ภาคปฏิบัติ ตอนที่ ๙๖) MO Memoir : Sunday 2 December 2561

"ผล simulation นั้นมันแต่งได้" ผมเคยเอ่ยข้อความนี้ไว้กับหลายคนที่มาปรึกษาผมเกี่ยวกับงาน simulation
 
ในเรื่อง "เมื่อ 1 ไม่เท่ากับ 0.1 x 10" นั้น ได้แสดงให้เห็นว่าเมื่อเราเปลี่ยนจากเลขฐาน 10 ไปเป็นเลขฐาน 2 เพื่อทำการคำนวณบนเครื่องดิจิตอลคอมพิวเตอร์นั้นมันก่อให้เกิดความคลาดเคลื่อนในการแปลงตัวเลขอย่างไร และในเรื่อง "จำนวนที่น้อยที่สุดที่เมื่อบวกกับ 1 แล้วได้ผลลัพธ์ที่ไม่ใช่ 1 นั้น" ก็ได้แสดงให้เห็นว่าสิ่งที่ในทางคณิตศาสตร์ถือว่าเท่าเทียมกันนั้น แต่พอมาคำนวณด้วยระบบเลขทศนิยมมันอาจมีปัญหาในบางช่วงของค่าตัวเลขได้ 
  
มาวันนี้จะขอยกตัวอย่างอีกตัวหนึ่งที่ในทางคณิตศาสตร์แล้วสมการมันต้องเท่าเทียมกัน (และไม่ควรให้ผลลัพธ์ออกมาแตกต่างกันด้วย) แต่พอคิดเป็นตัวเลขออกมาปรากฏว่ามันให้ผลที่แตกต่างกัน คือการคำนวณค่าฟังก์ชันพนุนามหรือ polynomial ประเด็นที่สำคัญคือปัญหานี้มันไม่ได้เกิดกับทุกช่วงค่าของสมการ แต่มันเกิดเฉพาะตรงบางตำแหน่งเท่านั้น ดังเช่นตัวอย่างที่นำมาแสดงในวันนี้ดัดแปลงมากจากหนังสือของ J.M.Ortega and W.G. Poole,Jr.,"An introduction to numerical methods for differential equations", Pitman Publishing Limited, London (1991)
 
กำหนดฟังก์ชันพหุนามที่เขียนในรูปคำสั่งยกกำลัง
 
f(x) = x6 - 6x5 + 15x4 - 20x3 + 15x2 - 6x + 1      (1)
สามารถเขียนใหม่ได้ในรูป 
 
f(x) = x(x(x(x(x(x - 6) + 15) - 20) + 15) - 6) + 1     (2)
 
ซึ่งในทางในทางทฤษฎีแล้วทั้งสองรูปแบบต้องให้ค่าของฟังก์ชันที่เท่ากัน และให้ค่าเป็นศูนย์ที่ x = 1 และให้ค่าเป็นบวกในบริเวณรอบข้าง
 
ในการคำนวณเราสามารถเขียนสมการที่ (1) ได้ในรูป
 
f(x) = x^6 + 6*x^5 + 15*x^4 - 20*x^3 + 15*x^2 - 6*x + 1 (ขอเรียกว่ารูปแบบยกกำลัง) 
  
หรือ f(x) = x*x*x*x*x*x + 6*x*x*x*x*x + 15*x*x*x*x - 20*x*x*x + 15*x*x - 6*x + 1 (ขอเรียกว่ารูปแบบผลคูณ)
 
ส่วนสมการที่ (2) สามารถเขียนคำสั่งเพื่อการคำนวณได้ในรูป
 
f(x) = x*(x*(x*(x*(x*(x - 6) + 15) - 20) + 15) - 6) + 1 (ขอเรียกว่ารูปแบบวงเล็บ) 
  
ผมทำการคำนวณค่า f(x) ทั้ง 3 รูปแบบด้วยโปรแกรม spread sheet ของ OpenOffice 4.1.5 บนเครื่องคอมพิวเตอร์ 32 บิท ในช่วง x จาก 0.996 ถึง 1.004 โดยใช้รูปแบบการกำหนดค่า x ที่แตกต่างกันดังนี้
แบบที่ ๑ ทำการป้อนค่า x ทีละค่าเข้าไปในคอลัมน์ด้านซ้ายโดยตรง ผลที่ได้แสดงไว้ในตารางที่ ๑ และรูปที่ ๑
 
แบบที่ ๒ ป้อนค่า x = 0.996 เข้าไปในเซลล์ช่องบนสุด จากนั้นกำหนดให้ค่า x ของเซลล์ช่องที่อยู่ถ้ดลงมามีค่าเท่ากับค่า x ของเซลล์ช่องที่อยู่ข้างบนบวกด้วย 0.0001 ผลที่ได้แสดงไว้ในตารางที่ ๒ และรูปที่ ๒ และ
 
แบบที่ ๓ กำหนดค่า 9960 ให้เป็นจำนวนเต็ม (integer) เข้าไปในเซลล์ช่องบนสุด จากนั้นกำหนดให้ของเซลล์ช่องที่อยู่ถ้ดลงมามีค่าเท่ากับค่าของเซลล์ช่องที่อยู่ข้างบนบวกด้วย 1 (ไล่ลงมาจนถง 10004) ซึ่งจะทำให้ทุกค่านั้นเป็นเลขจำนวนเต็ม จากนั้นจึงนำเลขจำนวนเต็มที่ได้นั้นมาแปลงเป็นค่า x ด้วยการหารด้วย 10000 ผลที่ได้แสดงไว้ในตารางที่ ๓ และรูปที่ ๓
 
ลองพิจารณาผลการคำนวณที่นำมาแสดงให้ดูเอาเองก่อนนะครับ แล้วก็อย่าพึ่งตกใจนะครับถ้าเห็นว่าผลการคำนวณมันออกมาไมเหมือนกัน
 
ตารางที่ ๑ ผลการคำนวณเมื่อค่า x ในคอลัมน์ด้านซ้ายได้มาจากการป้อนตัวเลขโดยตรง

x
f(x) ในรูปยกกำลัง
f(x) ในรูปวงเล็บ
f(x) ในรูปผลคูณ
0.996
6.217248937900880E-15
5.218048215738240E-15
0.000000000000000E+00
0.9961
7.993605777301130E-15
4.329869796038110E-15
4.440892098500630E-15
0.9962
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9963
0.000000000000000E+00
4.107825191113080E-15
5.329070518200750E-15
0.9964
3.552713678800500E-15
4.662936703425660E-15
0.000000000000000E+00
0.9965
0.000000000000000E+00
0.000000000000000E+00
7.993605777301130E-15
0.9966
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9967
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9968
3.552713678800500E-15
0.000000000000000E+00
3.552713678800500E-15
0.9969
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.997
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9971
0.000000000000000E+00
0.000000000000000E+00
4.440892098500630E-15
0.9972
0.000000000000000E+00
0.000000000000000E+00
5.329070518200750E-15
0.9973
0.000000000000000E+00
0.000000000000000E+00
5.329070518200750E-15
0.9974
0.000000000000000E+00
0.000000000000000E+00
-5.329070518200750E-15
0.9975
0.000000000000000E+00
0.000000000000000E+00
-6.217248937900880E-15
0.9976
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9977
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9978
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9979
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
0.998
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9981
0.000000000000000E+00
0.000000000000000E+00
-5.329070518200750E-15
0.9982
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9983
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9984
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9985
0.000000000000000E+00
0.000000000000000E+00
-4.440892098500630E-15
0.9986
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9987
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9988
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9989
0.000000000000000E+00
0.000000000000000E+00
-4.440892098500630E-15
0.999
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9991
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9992
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9993
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9994
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9995
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9996
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9997
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
0.9998
0.000000000000000E+00
0.000000000000000E+00
-4.440892098500630E-15
0.9999
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0001
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0002
0.000000000000000E+00
0.000000000000000E+00
4.440892098500630E-15
1.0003
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0004
-5.329070518200750E-15
0.000000000000000E+00
5.329070518200750E-15
1.0005
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0006
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0007
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0008
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0009
-5.329070518200750E-15
0.000000000000000E+00
0.000000000000000E+00
1.001
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0011
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0012
0.000000000000000E+00
0.000000000000000E+00
-5.329070518200750E-15
1.0013
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0014
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0015
5.329070518200750E-15
0.000000000000000E+00
0.000000000000000E+00
1.0016
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0017
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
1.0018
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0019
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.002
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0021
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0022
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0023
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0024
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.0025
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
1.0026
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0027
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0028
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0029
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.003
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0031
0.000000000000000E+00
0.000000000000000E+00
5.329070518200750E-15
1.0032
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0033
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0034
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0035
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0036
6.217248937900880E-15
0.000000000000000E+00
0.000000000000000E+00
1.0037
5.329070518200750E-15
0.000000000000000E+00
3.552713678800500E-15
1.0038
5.329070518200750E-15
4.329869796038110E-15
0.000000000000000E+00
1.0039
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.004
6.217248937900880E-15
5.329070518200750E-15
6.217248937900880E-15


รูปที่ ๑ กราฟของข้อมูลในตารางที่ ๑
ตารางที่ ๒ ผลการคำนวณเมื่อค่า x ในคอลัมน์ด้านซ้ายได้มาจากการบวกตัวเลขที่อยู่ในเซลล์ด้านบนด้วย 0.0001

x
f(x) ในรูปยกกำลัง
f(x) ในรูปวงเล็บ
f(x) ในรูปผลคูณ
0.996
6.217248937900880E-15
5.218048215738240E-15
0.000000000000000E+00
0.9961
7.105427357601000E-15
0.000000000000000E+00
3.552713678800500E-15
0.9962
0.000000000000000E+00
5.662137425588300E-15
0.000000000000000E+00
0.9963
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9964
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
0.9965
0.000000000000000E+00
0.000000000000000E+00
5.329070518200750E-15
0.9966
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9967
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9968
6.217248937900880E-15
0.000000000000000E+00
0.000000000000000E+00
0.9969
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.997
3.552713678800500E-15
0.000000000000000E+00
3.552713678800500E-15
0.9971
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9972
0.000000000000000E+00
0.000000000000000E+00
4.440892098500630E-15
0.9973
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9974
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9975
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9976
0.000000000000000E+00
0.000000000000000E+00
-4.440892098500630E-15
0.9977
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
0.9978
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9979
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.998
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9981
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9982
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9983
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9984
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9985
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9986
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9987
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9988
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9989
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.999
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9991
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9992
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9993
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9994
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9995
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9996
0.000000000000000E+00
0.000000000000000E+00
4.440892098500630E-15
0.9997
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9998
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9999
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1
0.000000000000000E+00
0.000000000000000E+00
-7.993605777301130E-15
1.0001
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0002
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0003
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0004
0.000000000000000E+00
0.000000000000000E+00
4.440892098500630E-15
1.0005
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0006
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0007
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0008
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0009
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.001
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0011
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.0012
0.000000000000000E+00
0.000000000000000E+00
4.440892098500630E-15
1.0013
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0014
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0015
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.0016
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0017
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0018
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0019
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.002
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
1.0021
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0022
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0023
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0024
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0025
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.0026
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0027
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.0028
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0029
0.000000000000000E+00
0.000000000000000E+00
5.329070518200750E-15
1.003
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0031
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0032
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0033
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0034
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0035
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0036
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0037
7.105427357601000E-15
0.000000000000000E+00
8.881784197001250E-15
1.0038
5.329070518200750E-15
4.329869796038110E-15
7.105427357601000E-15
1.0039
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.004
0.000000000000000E+00
5.329070518200750E-15
0.000000000000000E+00


รูปที่ ๒ กราฟของข้อมูลในตารางที่ ๒

ตารางที่ ๓ ผลการคำนวณเมื่อค่า x ในคอลัมน์ด้านซ้ายได้มาจากการ 9960 ให้เป็นจำนวนเต็มก่อน จากนั้นจึงค่อยหารด้วย 10000 ส่วนค่า x ในช่องถัดลงมาก็ได้มาจากการนำค่า 9960 + 1 (คำนวณในรูปจำนวนเต็ม) แล้วจึงหารด้วย 10000 และทำอย่างนี้ลงมาเรื่อย ๆ

x
f(x) ในรูปยกกำลัง
f(x) ในรูปวงเล็บ
f(x) ในรูปผลคูณ
0.996
6.217248937900880E-15
5.218048215738240E-15
0.000000000000000E+00
0.9961
7.105427357601000E-15
0.000000000000000E+00
3.552713678800500E-15
0.9962
0.000000000000000E+00
5.662137425588300E-15
0.000000000000000E+00
0.9963
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9964
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
0.9965
0.000000000000000E+00
0.000000000000000E+00
7.993605777301130E-15
0.9966
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9967
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9968
3.552713678800500E-15
0.000000000000000E+00
3.552713678800500E-15
0.9969
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.997
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9971
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
0.9972
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9973
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9974
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9975
0.000000000000000E+00
0.000000000000000E+00
-6.217248937900880E-15
0.9976
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9977
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9978
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9979
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
0.998
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9981
0.000000000000000E+00
0.000000000000000E+00
-5.329070518200750E-15
0.9982
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9983
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9984
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9985
0.000000000000000E+00
0.000000000000000E+00
-4.440892098500630E-15
0.9986
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9987
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9988
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9989
0.000000000000000E+00
0.000000000000000E+00
-4.440892098500630E-15
0.999
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9991
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9992
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9993
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9994
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9995
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
0.9996
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
0.9997
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
0.9998
0.000000000000000E+00
0.000000000000000E+00
-4.440892098500630E-15
0.9999
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0001
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0002
0.000000000000000E+00
0.000000000000000E+00
4.440892098500630E-15
1.0003
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0004
-5.329070518200750E-15
0.000000000000000E+00
5.329070518200750E-15
1.0005
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0006
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0007
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0008
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0009
-5.329070518200750E-15
0.000000000000000E+00
0.000000000000000E+00
1.001
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0011
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0012
0.000000000000000E+00
0.000000000000000E+00
-5.329070518200750E-15
1.0013
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0014
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0015
5.329070518200750E-15
0.000000000000000E+00
0.000000000000000E+00
1.0016
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0017
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
1.0018
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0019
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.002
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0021
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0022
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0023
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0024
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.0025
0.000000000000000E+00
0.000000000000000E+00
6.217248937900880E-15
1.0026
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0027
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0028
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0029
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.003
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0031
0.000000000000000E+00
0.000000000000000E+00
5.329070518200750E-15
1.0032
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0033
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0034
0.000000000000000E+00
0.000000000000000E+00
0.000000000000000E+00
1.0035
0.000000000000000E+00
0.000000000000000E+00
3.552713678800500E-15
1.0036
6.217248937900880E-15
0.000000000000000E+00
0.000000000000000E+00
1.0037
5.329070518200750E-15
0.000000000000000E+00
3.552713678800500E-15
1.0038
5.329070518200750E-15
4.329869796038110E-15
0.000000000000000E+00
1.0039
3.552713678800500E-15
0.000000000000000E+00
0.000000000000000E+00
1.004
6.217248937900880E-15
5.329070518200750E-15
6.217248937900880E-15



รูปที่ ๓ กราฟของข้อมูลในตารางที่ ๓
 
สมมุติว่าในการคำนวณนั้นเราเก็บตัวเลขในรูปแบบ 0.dddd...ddd x 10ab โดยมีจำนวนจุดทศนิยม (d) 16 ตำแหน่ง ถ้าเราเอาตัวเลขดังกล่าวสองจำนวนมาบวกเข้าด้วยกัน ผลลัพธ์ที่ได้ก็อาจยังเป็นเลขที่มีจุดทศนิยม 16 ตำแหน่งเช่นเดิม หรืออาจเป็นเลขที่มีจุดทศนิยม 17 ตำแหน่ง แต่ด้วยการที่เราเก็บจุดทศนิยมได้เพียงแค่ 16 ตำแหน่ง ดังนั้นในกรณีหลังนี้เราจำเป็นต้องมีการตัดจุดทศนิยมตำแหน่งสุดท้ายออกไป 1 ตำแหน่ง
 
แต่ถ้าเรานำเอาตัวเลขดังกล่าวสองจำนวนมาคูณกัน ผลลัพธ์ที่ได้จะเป็นเลขทศนิยม 32 ตำแหน่ง แต่ด้วยการที่เราเก็บจุดทศนิยมได้เพียงแค่ 16 ตำแหน่ง ดังนั้นในกรณีนี้เราจำเป็นต้องตัดจุดทศนิยม 16 ตำแหน่งท้ายออกไป ซึ่งถ้าเทียบกับการบวกแล้วจะเห็นได้ชัดว่าการคูณเพียงแค่ครั้งเดียวมีการปัดเศษ (ตัวที่ทำให้เกิดความคลาดเคลื่อนในการคำนวณ) มากกว่าการบวกมาก ดังนั้นถ้ามีการคูณมากครั้งเท่าใด ค่าสะสมของเศษที่ถูกปัดออกไปก็จะมีมากขึ้น โอกาสที่คำตอบที่ได้จะเพี้ยนออกไปจากคำตอบที่ถูกต้องก็จะมีมากขึ้นตามไปด้วย (อันนี้ยังไม่รวมถึงการที่การคูณใช้เวลาในการคำนวณที่นานกว่าการบวกด้วย) ด้วยเหตุนี้เวลาที่ทำการพิจารณาประสิทธิภาพของอัลกอริทึม เขาจึงมุ่งเน้นไปที่จำนวนครั้งที่ทำการคูณ เพราะมันส่งผลต่อเวลาที่ใช้ในการคำนวณและความคลาดเคลื่อนของผลการคำนวณที่ได้
 
ในตัวอย่างที่ยกมานี้บางคนอาจจะแย้งว่าความแตกต่างนั้นมีน้อยมาก เพียงแค่ที่ระดับ 10-15 ซึ่งไม่น่าที่จะส่งผลอะไรในการนำตัวเลขไปใช้งาน แต่ตัวอย่างที่ยกมานี้แสดงให้เห็นถึงความคลาดเคลื่อนที่เกิดขึ้นจากการคำนวณค่าฟังก์ชันเพียงแค่แค่ครั้งเดียวเท่านั้น แต่ในงาน simulation นั้นมีจำนวนครั้งการคำนวณที่สูงกว่ามาก หรือในการแก้ปัญหาระบบสมการพีชคณิตที่เมทริกซ์มีสภาวะเลว (ill-conditioned) นั้น ความคลาดเคลื่อนเพียงเล็กน้อยแค่นี้ที่เกิดขึ้นในการคำนวณแต่ละครั้ง สามารถส่งผลกระทบที่มีนัยสำคัญมากต่อตำตอบที่คำนวณได้
 
และในปัญหาบางแบบเช่นการหาจุดที่กราฟตัดแกน x (root finding) หรือจุดต่ำสุดของฟังก์ชัน (optimisation) เวลาที่เจอกับฟังก์ชันแบบนี้ (กราฟค่อนข้างจะเรียบแบน) จะพบว่าค่าตำแหน่ง x ที่เป็นคำตอบนั้นมีได้หลายค่าและอยู่ในช่วงกว้าง โดยที่ค่า f(x) นั้นอยู่ในระดับเดียวกัน ทำให้เกิดปัญหาได้ว่าค่า x ที่ให้ค่า f(x) ต่ำสุดที่ได้มานั้นเป็นค่าที่ถูกต้องหรือไม่ หรือเป็นเพราะผลจากการปัดเศษ ซึ่งสำหรับคนที่เขียนอัลกอริทึมคำนวณเองสามารถทดสอบได้ด้วยการเปลี่ยนจุดเริ่มต้นการหาคำนวณให้แตกต่างออกไป แล้วดูว่าคำตอบที่คำนวณได้นั้นกลับมายังค่าเดิมหรือไม่ จะช่วยบ่งบอกถึงปัญหาดังกล่าวได้

ตารางที่ ๔ และรูปที่ ๔ เป็นการคำนวณค่าฟังก์ชันพหุนามที่เขียนในรูปคำสั่งยกกำลัง
f(x) = x6 - 6x5 + 15x4 - 20x3 + 15x2 - 6x     (3)
สมการที่ (3) ก็คือสมการที่ (1) ที่ถูกตัดพจน์ + 1 ตัวท้ายออกไป แล้วนำมาคำนวณใน 3 รูปแบบเช่นสมการที่ (1) ดังนี้ (ในที่นี้ค่า x ในคอลัมน์ด้านซ้ายได้มาจากการป้อนค่า x เข้าไปโดยตรง)
 
f(x) = x^6 + 6*x^5 + 15*x^4 - 20*x^3 + 15*x^2 - 6*x (รูปแบบยกกำลัง) 
  
f(x) = x*x*x*x*x*x + 6*x*x*x*x*x + 15*x*x*x*x - 20*x*x*x + 15*x*x - 6*x (รูปแบบผลคูณ)
 
และ f(x) = x*(x*(x*(x*(x*(x - 6) + 15) - 20) + 15) - 6) (รูปแบบวงเล็บ) 
  
ผลการคำนวณด้วยรูปแบบวงเล็บที่ค่า x = 0.998 พบว่าค่าตัวเลขออกมาเป็น "-10" แต่เมื่อนำข้อมูลไปเขียนกราฟกลับพบว่าค่า f(x) ที่ตำแหน่งดังกล่าวมีค่าเป็น "0" การตรวจสอบด้วยการเอาค่าในช่องดังกล่าวมาบวก 1 เข้าไปก็พบว่าได้ค่าออกมาเป็น "0" นั่นแสดงว่าตัวเลขที่แสดงออกมาหน้าจอและในหน่วยความจำนั้นเป็นคนละตัวกัน การทดสอบเพิ่มเติมด้วยการลดจำนวนจุดทศนิยมที่ให้แสดงผลพบว่าเมื่อลดจำนวนจุดทศนิยมลงถึงระดับหนึ่ง ตัวเลขที่แสดงจะกลับมาเป็น "-1" และเมื่อนำคำสั่งเดียวกันนี้ไปคำนวณด้วยโปรแกรม Excel ก็พบว่าค่าที่ได้คือ "-1" นั่นแสดงว่าความผิดปรกติตรงนี้เกิดขึ้นในส่วนของการแสดงผลของตัวโปรแกรม OpenOffice 4.1.5 ที่ใช้คำนวณ ก็เลยต้องของเอาเหตุการณ์นี้มาบันทึกเอาไว้ตรงนี้หน่อยเพื่อเป็นบทเรียนว่า อย่างพึงแต่อ่านค่าตัวเลขเพียงอย่างเดียว ให้พิจารณาดูด้วยว่าตัวเลขที่คำนวณได้นั้นมันผิดปรกติหรือไม่
 
ตารางที่ ๔ คำตอบของฟังก์ชัน f(x) = x6 - 6x5 + 15x4 - 20x3 + 15x2 - 6x ที่คำนวณด้วยรูปแบบต่าง ๆ พึงสังเกตุค่า f(x) ในรูปวงเล็บที่ค่า x = 0.998

x
f(x) ในรูปยกกำลัง
f(x) ในรูปวงเล็บ
f(x) ในรูปผลคูณ
0.996
-9.999999999999940E-01
-9.999999999999950E-01
-9.999999999999990E-01
0.9961
-9.999999999999920E-01
-9.999999999999960E-01
-9.999999999999960E-01
0.9962
-1.000000000000000E+00
-9.999999999999980E-01
-9.999999999999990E-01
0.9963
-9.999999999999980E-01
-9.999999999999960E-01
-9.999999999999950E-01
0.9964
-9.999999999999960E-01
-9.999999999999950E-01
-1.000000000000000E+00
0.9965
-9.999999999999970E-01
-9.999999999999970E-01
-9.999999999999920E-01
0.9966
-1.000000000000000E+00
-9.999999999999990E-01
-9.999999999999990E-01
0.9967
-1.000000000000000E+00
-9.999999999999980E-01
-9.999999999999960E-01
0.9968
-9.999999999999960E-01
-9.999999999999980E-01
-9.999999999999960E-01
0.9969
-9.999999999999990E-01
-1.000000000000000E+00
-9.999999999999970E-01
0.997
-9.999999999999970E-01
-1.000000000000000E+00
-1.000000000000000E+00
0.9971
-9.999999999999970E-01
-1.000000000000000E+00
-9.999999999999960E-01
0.9972
-9.999999999999980E-01
-9.999999999999990E-01
-9.999999999999950E-01
0.9973
-9.999999999999980E-01
-1.000000000000000E+00
-9.999999999999950E-01
0.9974
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000010E+00
0.9975
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000010E+00
0.9976
-9.999999999999980E-01
-1.000000000000000E+00
-9.999999999999980E-01
0.9977
-1.000000000000000E+00
-9.999999999999990E-01
-9.999999999999980E-01
0.9978
-9.999999999999980E-01
-1.000000000000000E+00
-1.000000000000000E+00
0.9979
-1.000000000000000E+00
-9.999999999999990E-01
-9.999999999999940E-01
0.998
-9.999999999999980E-01
-1.000000000000000E+00
-9.999999999999980E-01
0.9981
-9.999999999999980E-01
-9.999999999999990E-01
-1.000000000000010E+00
0.9982
-9.999999999999980E-01
-1.000000000000000E+00
-9.999999999999980E-01
0.9983
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000000E+00
0.9984
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999970E-01
0.9985
-1.000000000000000E+00
-9.999999999999990E-01
-1.000000000000000E+00
0.9986
-9.999999999999980E-01
-1.000000000000000E+00
-1.000000000000000E+00
0.9987
-1.000000000000000E+00
-9.999999999999990E-01
-9.999999999999980E-01
0.9988
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999990E-01
0.9989
-1.000000000000000E+00
-9.999999999999970E-01
-1.000000000000000E+00
0.999
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999980E-01
0.9991
-9.999999999999980E-01
-1.000000000000000E+00
-1.000000000000000E+00
0.9992
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000000E+00
0.9993
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999960E-01
0.9994
-9.999999999999990E-01
-1.000000000000000E+00
-9.999999999999970E-01
0.9995
-9.999999999999980E-01
-9.999999999999980E-01
-9.999999999999960E-01
0.9996
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000000E+00
0.9997
-9.999999999999960E-01
-1.000000000000000E+00
-1.000000000000000E+00
0.9998
-1.000000000000000E+00
-10.000000000000000E+00
-1.000000000000000E+00
0.9999
-9.999999999999960E-01
-1.000000000000000E+00
-1.000000000000000E+00
1
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000000E+00
1.0001
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000000E+00
1.0002
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999960E-01
1.0003
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999960E-01
1.0004
-1.000000000000010E+00
-1.000000000000000E+00
-9.999999999999950E-01
1.0005
-9.999999999999980E-01
-9.999999999999990E-01
-1.000000000000000E+00
1.0006
-9.999999999999970E-01
-1.000000000000000E+00
-1.000000000000000E+00
1.0007
-1.000000000000000E+00
-9.999999999999990E-01
-1.000000000000000E+00
1.0008
-9.999999999999980E-01
-9.999999999999990E-01
-1.000000000000000E+00
1.0009
-1.000000000000010E+00
-1.000000000000000E+00
-9.999999999999980E-01
1.001
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999970E-01
1.0011
-1.000000000000000E+00
-9.999999999999990E-01
-1.000000000000000E+00
1.0012
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000010E+00
1.0013
-9.999999999999990E-01
-1.000000000000000E+00
-1.000000000000000E+00
1.0014
-9.999999999999980E-01
-9.999999999999980E-01
-1.000000000000000E+00
1.0015
-9.999999999999950E-01
-1.000000000000000E+00
-1.000000000000000E+00
1.0016
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000000E+00
1.0017
-9.999999999999990E-01
-1.000000000000000E+00
-9.999999999999940E-01
1.0018
-9.999999999999980E-01
-9.999999999999980E-01
-1.000000000000000E+00
1.0019
-9.999999999999960E-01
-1.000000000000000E+00
-1.000000000000000E+00
1.002
-9.999999999999980E-01
-1.000000000000000E+00
-1.000000000000000E+00
1.0021
-9.999999999999990E-01
-9.999999999999980E-01
-9.999999999999990E-01
1.0022
-1.000000000000000E+00
-9.999999999999990E-01
-9.999999999999960E-01
1.0023
-1.000000000000000E+00
-9.999999999999980E-01
-1.000000000000000E+00
1.0024
-9.999999999999960E-01
-9.999999999999990E-01
-1.000000000000000E+00
1.0025
-1.000000000000000E+00
-9.999999999999990E-01
-9.999999999999940E-01
1.0026
-1.000000000000000E+00
-9.999999999999990E-01
-9.999999999999980E-01
1.0027
-1.000000000000000E+00
-1.000000000000000E+00
-1.000000000000000E+00
1.0028
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999960E-01
1.0029
-1.000000000000000E+00
-9.999999999999980E-01
-1.000000000000000E+00
1.003
-1.000000000000000E+00
-9.999999999999980E-01
-1.000000000000000E+00
1.0031
-1.000000000000000E+00
-1.000000000000000E+00
-9.999999999999950E-01
1.0032
-9.999999999999990E-01
-1.000000000000000E+00
-9.999999999999990E-01
1.0033
-1.000000000000000E+00
-9.999999999999970E-01
-9.999999999999980E-01
1.0034
-9.999999999999980E-01
-9.999999999999980E-01
-1.000000000000000E+00
1.0035
-1.000000000000000E+00
-9.999999999999980E-01
-9.999999999999960E-01
1.0036
-9.999999999999940E-01
-9.999999999999980E-01
-1.000000000000000E+00
1.0037
-9.999999999999950E-01
-9.999999999999980E-01
-9.999999999999960E-01
1.0038
-9.999999999999950E-01
-9.999999999999960E-01
-9.999999999999980E-01
1.0039
-9.999999999999960E-01
-9.999999999999980E-01
-9.999999999999980E-01
1.004
-9.999999999999940E-01
-9.999999999999950E-01
-9.999999999999940E-01



รูปที่ ๔ กราฟของข้อมูลในตารางที่ ๔ จะเห็นว่าค่า f(x) ที่เครื่องนำมาเขียนกราฟกับค่าที่ปรากฏในตารางนั้นมีความแตกต่างกันอยู่

ไม่มีความคิดเห็น: