วันศุกร์ที่ 15 พฤษภาคม พ.ศ. 2563

บทที่ 1 บทนำ

บทที่ 1

บทนำไซแลบ


1.1 นำไซแลบ
            ด้วยแบบฝึกหัดเหล่านี้ตั้งใจเตรียมขึ้นเพื่อนำผู้ใช้เข้าสู่สิ่งแวดล้อมคอมพิวเตอร์ที่จะนำมาใช้  ตอนท้ายของการติวซ่อมเสริมนี้ ผู้ใช้ควรตรวจสอบ เมื่อทดลองปฏิบัติไปทั้งหมดแล้ว โดยตอนสุดท้ายของการซ่อมเสริมนี้ ก็จะตรวจสอบได้ว่าบัญชีการใช้คอมพิวเตอร์ (computer account) ทำงานได้ และผู้ใช้ได้รับการฝึกฝนการใช้เอดิเตอร์และไซแลบ  ในทางหนึ่งทางใดผู้ใช้ควรจะเพียรพยายามได้ผ่านชุดติวซ่อมเสริมนี้ก่อนที่จะถึงติวซ่อมเสริมต่อไป ตามที่จะต้องมีงานการเขียนโปรแกรมบางอย่าง ดังนั้นจงอย่าลังเลที่จะถามหาความช่วยเหลือ หากติดขัด ไม่เข้าใจ
            ในการเรียนรู้ตอนนี้ เกือบทั้งหมดจะได้ประสบการณ์เพิ่มบางอย่างกับแพคเกจซ์ของไซแลบ  โดยจะพิจารณานิพจน์ไซแลบที่ง่ายบางอย่าง และใช้ตัวอย่างเหล่านั้นในการพิจารณาปัญหาบางอย่างที่เกี่ยวข้องกับเลขคณิตของจำนวนฟล็อตติงพอยน์   
            ขณะที่ดำเนินการไป มีการถามคำถาม ผู้ใช้ควรจะหาได้ให้คำตอบคำถามเหล่านั้น ในสมุดปฏิบัติการของผู้ใช้ ทำเครื่องหมายสำหรับส่วนติวซ๋อมเสริมที่จะได้ประโยชน์บนฐานของงานที่นำเสนอไว้ในสมุดปฏิบัติการ

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

                1.2.1 การเข้าใช้ในระบบปฏิบัติการวินโดว์
            การใช้งานไซแลบได้อย่างดี ในระบบปฏิบัติการวินโดว์ สำหรับระบบปฏิบัติการนี้ ไซแลบได้ผนึกรวมเอาตัวเอดิเตอร์ให้มาด้วย   โดยสั่งให้ไซแลบจากเมนูโปรแกรมประยุกต์ที่เมนูเริ่มต้น (start menu) ซึ่งตอนติดตั้งไซแลบ จะมีไอคอนสำหรับโปรแกรมไซแลบ  เมื่อเริ่มต้นใช้งานก็เพียงแต่คลิกที่ไอคอนนี้ ทันทีที่ไซแลบกำลังทำงานอยู่ จะปรากฏหน้าต่างคำสั่งหรือคอนโซล  และ เริ่มใช้เอดิเตอร์ได้จากเมนูบาร์ของไซแลบ และจากนี้ก็พร้อมที่จะเริ่มเรียนรู้กับไซแลบ ไม่ว่าจากบรรทัดคำสั่งหรือจากเอดิเตอร์ของไซแลบ

1.3  การใช้ไซแลบคอนโซลและเอดิเตอร์
            จากคอนไซลไซแลบหรือหน้าต่างคำสั่งไซแลบสามารถจะสั่งให้ทำงานตามคำสั่ง โดยเฉพาะอย่างยิ่งคำสั่ง pwd จะบอกให้ทราบว่าไดเรคทอรีใดที่กำลังทำงานอยู่  เป็นที่ที่ไซแลบจะไปหาไฟล์ที่จะมาทำงาน สามารถที่จะเปลี่ยนไดเรคทอรีทำงานภายใต้เมนูไฟล์หรือจากบรรทัดคำสั่งโดยใช้คำสั่ง  chdir directory
            จากเท็กเอดิเตอร์ที่ใช้ ให้สร้างคำสั่งไซแลบบางอย่างเช่น
            A = [ 1 2 3 ; 4 5 6 ; 7 8 9]
            แล้วบันทึกไฟล์ (สมมุติ test-01.sce) ในไดเรคทอรีเดียวกับที่ไซแลบกำลังทำงานด้วย (ตามที่แสดงโดยคำสั่ง pwd)  จากนี้ทำให้สามารถสังให้ทำงานตามคำสั่งในไฟล์ผ่านทางเครื่องหมายเตรียมพร้อมในคอนไซลไซแลบ
            exec test-01.sce
            การใช้เอดิเตอร์ทำให้เปลี่ยนแปลงข้อมูลในไฟล์ และจำเป็นต้องบันทึกไฟล์ใหม่อีกครั้งเพื่อให้การเปลี่ยนแปลงส่งผล  (สามารถที่จะใช้ลูกศรชี้ขึ้นเพื่อเรียกคำสั่งที่ผ่านมาแก้ไข) ถ้าใช้เอดิเตอร์ที่ผนึกรวมอยู่ในไซแลบในระบบปฏิบัติการวินโดว์  การทำงานของเอดิเตอร์จะเรียกให้บันทึกไฟล์ที่กำลังทำงานโดยอัตโนมัติและสั่งให้ทำงานในไฟล์โดยอัตโนมัติ

1.4 คำสั่งพื้นฐาน
            จากนี้ให้ทดลองใช้งานไซแลบ โดยเคลื่นไปที่หน้าต่างไซแลบ และเลือกวินโดว์ (โดยการกดเม้าซ์ปุ่มซ้าย) จากนี้ควรจะสามารถพิมพ์คำสั่งเข้าไปในหน้าต่างไซแลบ ไซแลบออกแบบมาให้ทำงานกับข้อมูลแบบเว็คเตอร์และเมทริกซ์  ตอนแรกนี้ให้นำเข้าเว็คเตอร์ดังนี้
            x = [ 0 ; 2 ; 5]
            และนำเข้าเมทริกซ์        ผ่านทางการใช้คำสั่งดังนี้
            A = [ 1 3 4 ; -1 2 5 ; 4 -3 5 ]
            เซมิโคลอนอาจแทนด้วยการกด returns.  ในไซแลบนั้นตัวพิมพ์เล็กใหญ่ถือว่ามีความแตกต่างกัน ดังเช่น a  และ A จะแทนตัวแปรที่แตกต่างกัน  ฟังก์ชันที่ให้มาในไซแลบ เช่น rank หรือ eigenvalues
สกหรับเมทริกซ์ แสดงด้วยตัวพิมพ์เล็กดังเช่น rank(A) หรือ spec(A).  ถ้าไม่สามารถจำการใช้คำสั่งเฉพาะในไซแลบให้ทดลองใช้คำสั่งขอความช่วยเหลือ เช่น
           
help spec
            ไซแลบได้จัดหาการดำเนินการเว็คเตอร์และเมทริกซ์มากมาย ตัวอย่างเช่น สามารถที่จะคูณเมทริกซืและเว็คเตอร์  ให้ทดลองตัวอย่างคำสั่งง่ายๆคือ
A*x
A*A
ได้ผลดังนี้

-->A*x
  ans =
          26
          29
          19
-->A*A
  ans =
      14     -3      39
     17     -14     31
     27      -9      26
            ไซแลบคำนวณทุกอย่างได้ผลเป็นความละเอียดสองเท่า แต่รูปแบบของเอาพุตที่แสดงใช้รูปแบบสั้น  รูปแบบสามารถเปลี่ยนไปเป็นเต็มความละเอียดได้โดยคำสั่งไซแลบดังนี้
            format(20,’e’)
            ให้ทดลองคำนวณดูผลเมื่อใช้รูแบบที่แตกต่างกัน รูปแบบสามารถเปลี่ยนกลับมาเหมือนเดิมได้โดยใช้รูปแบบดังนี้
            format(10,’v’)
            เมื่อมีเครื่องหมายเซมิโคลอนที่ตอนปลายบรรทัดคำสั่ง  ไซแลบจะไม่แสดงผลกำทำงานบรรทัดนั้นเหมือนตามปกติ  ซึ่งมีประโยชน์เมื่อทำงานกับเว็คเตอร์และเมทริกซ์ขนาดใหญ  ให้ทดลอง
            y = A*x ;
            สังเกตได้ว่าคำตอบจะไม่พิมพ์แสดงให้เห็น หากต้องการดูคำตอบก็เพียงแต่พิมพ์ตัวแปร y
            ให้ทดลองสร้างเว็คเตอร์ขนาดใหญ่  จะสร้างได้ง่ายโดยสร้างเวคเตอร์ที่มีองค์ประกอบที่มีการเพิ่มค่าขึ้นเป็นระบบ  ทดลองดังนี้
            w = 0:0.1:7
            จากคำสั่งข้างบนสร้างเว็คเตอร์เริ่มจากเลข 0 และเพิ่มขึ้นทีละ 0.1 จนถึงค่า 7
            สังเกตเห็นว่าเครื่องหมายเซมิโคลอนหากมีปิดท้ายก็จะช่วยให้เกิดประโยชน์  สามารถที่จะใช้ฟังก์ชันของเว็คเตอร์หรือเมทริกซ์ เช่นให้ทดลองดังนี้
            z = sin(w)
            จากนี้ มี 2 เว็คเตอร์คือ w และ z ที่มีขนาดเท่ากัน  สามารถที่จะพล็อตค่าของ w กับค่าของ z  ดังนี้
            plot2d(w,z)
            การพล็อตค่า w กับ z ควรจะแสดงให้เห็นและบันทึกกราฟไว้เป็นไฟล์  ใช้เมนู file-export toในหน้าต่างกราฟิกส์

            ภาพที่ 1. แสดงการพล็อตค่า w,z

1.5 พีชคณิตเชิงเส้น
            ไซแลบสามารถแก้ปัญหาสมการเมทริกซ์ โดยทดลองดังนี้
            y = A \ x
            เว็คเตอร์ y  ควรที่เป็นการแก้สมการเชิงเส้น x = A*y   ซึ่งคือการอินเวิร์ทเมทริกซ์สามารถคำนวณได้โดยคำสั่ง inv  ให้ใช้คำสั่ง inv ในการแก้สมการ  Ay = x.
            เปรียบเทียบผล A\x และ inv(A)*x. ปรากฏผลว่าได้ค่าเท่ากัน ทั้งนี้เพราะการสลับแถวกับคอลัมน์ไม่ทำให้ผลการคำนวณเปลี่ยนไป
-->y = A/x
y  =  
     -02375
     -0.8375
      0.6875
-->y  = inv(A)*x
  Y  =
      -0.2375
      -0.8375
       0.6875
            คำสั่งไซแลบ rand(n,m) สร้างเมทริกซ์แบบสุ่มขนาด n×m  เมื่อกำหนดค่าใหม่ให้ A เป็นเมทริกซ์สุ่มขนาด 5 × 5 และ x  เป็นเว็คเตอร์สุ่ม ขนาด 5 × 1 .
            คำสั่ง \ โดยที่วไปสามารถใช้ในการแก้ปัญหาระบบที่ over-determined (ระบบที่มีจำนวนสมการมากกว่าค่าตัวแปรที่ไม่ทราบค่า) การหาคำตอบลีสสแคว์ “least squares
solution”.   ส่วนในระบบ  under-determined ก็สามารถที่จะรองรับได้.
            ให้ทดอลงแก้ปัญญาระบบ under-determined  (เมทริกซ์ที่มีแถวมากกว่าคอลัมน์)  ให้ทดลองระบบ over-determined(ที่มีจำนวนแถวมากกว่าจำนวนคอลัมน์ และให้อธิบายการทดลองดังกล่าว

1.6 เงื่อนไขและการทำงานซ้ำเป็นวง (Loops and Conditionals)
            ไซแลบจัดประโยคคำสั่งที่ควบคุมการทำงาน คื  for, while และ if สำหรับควบคุมทิศทางการทำงาน (control flow) ภายในโปรแกรมหนึ่งๆ พิจารณาตัวอย่างโปแกรมสำหรับการคำนวณ ex.

ans = 0; n = 1; term = 1;
while( ans + term ~= ans )
ans = ans + term;
term = term*x/n;
n = n + 1;
end
ans

จากนี้เครื่อหมาย ~=  หมายถึงไม่เท่ากับ “not equal to”.
            สามารถที่จะหลีกเลี่ยงการพิมพ์ซ้ำอีก โดยการบันทึกโปรแกรมให้เป็นไฟล์  โดยเปิดใช้เท็กซ์เอดิเตอร์  ให้พิมพ์โปรแกรมลงไปแล้วบันทึกเป็นไฟล์โดยเข้าใช้เมนูไฟล์ ในการทำงานโปรแกรมจะเรียกหาชื่อไฟ. ให้ใช้ชื่อบันทึกเป็น ex.sci, โดยที่sci คือนามสกุลแบบมาตรฐานสำหรับไฟล์ฟังก์ชันไซแลบ  ให้กลับไปที่หน้าต่างไซแลบ และทดสอบโปรแกรม ex. ให้พิมพ์ค่าของ x  และเลือกใช้คำสั่ง exec(’ex.sci’). สำหรับขณะใดๆ ให้ทดลองดังนี้
x = 1.0
exec(’ex.sci’)

            เพื่อให้ไซแลบรันโปรแกรมที่ x =  1.0.
การใช้โปรแกรมหาการประมาณการค่า e1, e10 และ e10.
การทำให้โปรแกรมเป็นฟังก์ชันหนึ่ง  ให้กลับไปที่หน้าต่างการแก้ไข และเปลี่ยนโปรแกรมเป็นดังนี้:

function x = ex(x)
// EX A simple function to calculate exp(x)
ans = 0; n = 1; term = 1; while( ans + term ~= ans )
ans = ans + term;
term = term*x/n;
n = n + 1;
end x = ans                              // end of ex
endfunction

            บรรทัดที่เริ่มต้นด้วย //เป็นเพียงข้อความอธิบายโปรแกรม   ให้บันทึกการเปลี่ยนแปลง จากนี้สามารถที่จะใช้  ex(x)  แต่จำเป็นต้องโหลดการเปลี่ยนแปลง โดยทดลองดังนี้

exec(’ex.sci’)
ex(1.0)
            อัลกอริธึมนี้ไม่มีประโยชน์สำหรับค่าของ x ที่เป็นลบขนาดใหญ่ หรือในอีกทางหนึ่งดังในเลคเชอร์  สามารถใช้อัลกอริธึมนี้เป็นรากฐานสำหรับอัลกอริธึมที่ซับซ้อนขึ้น  สิ่งแรกแม้ว่าจำต้องให้คุ้นเคยกับประโยคคำสั่ง if  ประโยคคำสั่ง if มีรูปแบบที่ง่าย  กล่วคือ

if expression then
    Scilab statements
else
    Scilab statements
End

            ให้ใช้ฟังก์ชัน ex และประโยคคำสั่ง if ไปสร้างฟังก์ชันใหม่ชื่อ nesex  ซึ่งทำการประมาณอย่างมีเหตุผลของค่า e^x  สำหรับ x ที่มีค่าเป็นบวกหรือเป็นลบ (ดังที่แสดงไว้ในเล็คเชอร์)  โดยสามารถใช้ไฟล์เดียวกันเพื่อกำหนดทั้งฟังก์ชัน ex และ newex  แต่ก็ต้องใช้คำสั่ง exec อีกครั้งเพื่อโหลดเข้ามาในฟังก์ชันใหม่คือ.

1.7 ความช่วยเหลือในไซแลบ (Help in Scilab)
            1.7.1 คำสั่งของความช่วยเหลือ
            คำสั่ง
 help  สามารถหาได้ง่ายกว่าสำหรับที่เป็นคำสั่งพิเศษของไซแลบ  หากว่าลืมรายละเอียดบางอย่าง ตัวอย่างเช่น ชื่อคำสั่ง help ให้ข้อสนเทศเกี่ยวกับชื่อคำสั่งของไซแลบนั้น กล่าวคือ
help sin             // ข้อสนเทศเกี่ยวกับ sin.
help +               // ให้การเชื่อมโยงความช่วยเหลือต่อชื่อตัวกระทำในชุดความช่วยเหลือของไซแลบ  // นี่เป็นข้อสนเทศที่พอเพียงเกี่ยวกับล็อกที่เก็บ
// เพื่อแสดงล็อก หมายถึงล็อกฐาน e .
            สังเกตเห็นว่าบ่อยครั้งที่ข้อสนเทศความช่วยเหลือได้จัดตัวอย่างหนึ่งแสดงถึงการใช้คำสั่งอย่างไร ในเรื่องนี้เป็นประโยชน์เป็นการเฉพาะเมื่อ การทดลองกับคำสั่งใหม่  สามารถการเคลื่อนย้ายและการวาง ( cutting and pasting) เพื่อการรันคำสั่งตัวอย่าง.
            ในไซแลบคำสั่ง apropos สามารถนำไปใช้ค้นหาสำหรับข้อสนเทศที่เกี่ยวข้องอยู่ในประเด็น.
apropos logarithm           //จัดรายการที่สัมพันธ์กับ logarithms
            1.7.2 หน้าต่างความช่วยเหลือ
            ยังคงเป็นไปได้ที่จะหาความช่วยเหลือโดยการคลิกที่เมนูความช่วยเหลือ (help menu) เหนือหน้าต่างคำสั่งวินโดว์  จากเมนูความช่วยเหลือ  ให้เลือกส่วนการสอบถามหาที่ต้องการ และรายการหัวข้อความช่วยเหลือแสดงให้เห็น  ความก้าวหน้าของวิธีการนี้ ทำให้เป็นไปได้ที่จะสืบค้นไปโดยรอบหัวข้อที่แตกต่างกัน และไม่มีอะไรต่อคำสั่งที่มีประโยชน์  ตัวอย่างเลช่นสำหรับหน้าต่างสอบถาม เมื่อคลิกบทr ’Linear Algebra’. แล้วค้นหาคำ ’linsolve’.  ทันทีที่พบให้คลิกที่คำว่า ’show’ เพื่อดูหน้าความช่วยเหลือที่อยู่ในประเด็น.
ข้อสังเกตที่การคลิกแบบดับเปิลไม่ทำงานในวินโดว์ไซแลบในไซแลบรุ่น 2.6  มีการทำงานผิดพลาดเล็กน้อยเมื่อเปลี่ยนบทเรียน และเลื่อนไปยังส่วนหัวข้อใหม่  การลือกหัวข้อในครั้งที่สองดูเหมือนจะทำงานได้  ดดยทั่วไปหน้าต่างความช่วยเหลือเป็นแนวทางที่ดีในการสำรวจคำสั่งของไซแลบ
            แบบฝึกหัดที่ 1.
            1. อินเวิร์สฟังก์ชันไซน์ เป็นฟังก์พื้นฐานของไซแลบหรือไม่ (อินเวิร์สไซน์รู้จักกันในรูปแบบ
 sin1, arcsin, หรือ asin.)
(a) หาค่า sin1(.5) ในไซแลบได้อย่างไร ? ให้ขอความช่วยเหลือ help .
(b) If x = .5, แล้ว sin(sin1(x)) x exactly zero in Scilab?
(c) If x = π/3, is sin1(sin(x)) x exactly zeros in Scilab? What about
x = 5π/11?
            2 ไซแลบมีฟังก์ชันสำหรับแปลงจำนวนเลขไปเป็นเลขฐาน 16 เช่น แปลงไปอยู่ในรูปได้หรือไม่ (แนะ: .ให้ใช้คำสั่ง เพื่อหาแนวทางในการแปลงตัวเลขทศนิยมไปเป็นตัวเลข(hexadecimal.)  ค่าตัวเลขs 61453 ในฐาน 16 มีค่าเท่าใด ? คอมพิวเตอร์เกือบทั้งหมดแทนจำนวนตัวเลขภายในด้วยตัวเลขhexadecimals.
            3. เมื่อมองหาข้อสนเทศเกี่ยวกับล็อกการิธึม  สังเกตได้ว่าการสืบค้นสำหรับ logarithms ล้มเหลว ขณะที่ค้นหา logarithm ประสบผลสำเร็จ  มี 8 เรื่องที่นำเข้ามรวมทั้งคำสั่ง  logm, สำหรับคำนวณหาค่า ล็อกของเมทริกซ์
            4. เพื่อที่จะแสดงการใช้เมนูไซแลบในคำสั่ง demos  ซึ่งจะนำเมนูการแสดงสาธิต และตัวอย่างเพื่อสำรวจดู.
(a) ให้ไปที่ graphics เพื่อดูภาพที่น่าสนใจ.
(b) การสาธิตเช่นเรื่องรถเทลเลอร์และการจอด ที่น่าสนใจ.

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

1.9 แบบฝึกหัด
แบบฝึกหัดที่ 2.
            จงเขียนโปรแกรมไซแลบเพื่อคำนวนหาค่ารากสมการควอดเดรติก และแสดงค่ารากของสมการ  
ax2 + bx + c = 0  โดยใช้สูตรดังนี้
            ควรจะทำงานได้ภายใต้คำสัง ในลักษณะ quadroots(1,3,2) สำหรับกรณี  x2 + 3x + 2 = 0.  โดยโปรแกรมดำเนินการให้ได้ค่ารากสมการในรูปเว็คเตอร์  ตัวอย่างเช่น รากที่1 และรากที่ 2 ในไฟล์ฟังก์ชัน และเริ่มนิยามฟังก์ชันด้วยบรรทัดดังนี้
function [root1, root2] = quadroots(a,b,c)
            การทำเช่นเก็บค่าไว้ใน 2 ตัวแปร เช่น r1 และ  r2 โดยให้ฟังก์ชันทำงานด้วยคำสั่ง
[r1 r2] = quadroots(1,3,2)
            โปรแกรมควรจะได้หลีกเลี่ยงการหารโดยศูนย์ , พิมพ์แสดงข้อความที่เหมาะสมในกรณีนี้  ให้แน่ใจการตัดสินใจของตัวเองถึงสิ่งที่จะต้องทำในกรณีของรากตัวเลขเชิงซ้อน, เนื่องจากไซแลบสามารถคำนวณและพิมพ์ผลค่าตัวเลขเชิงซ้อน  ทดสอบ quadroots ดังในตัวอย่างต่อไปนี้,  ตรวจสอบผลลัพธ์ในแต่ละกรณี ให้ความสนใจเป็นพิเศษกับตัวอย่างสุดท้าย.
1. x2 + 1 = 0
2. 0x2 + 2x + 1 = 0
3. x2 + 3x + 2 = 0
4. 4x2 + 24x + 36 = 0
5. 1018x2 x 1 = 0
6. 1018x2 x + 1 = 0 (รากสมการโดยประมาณ 1 + 1018 และ 10 18 1),
ข้อใดที่สามารถตรวจสอบด้วยมือ
            ตัวอย่างสุดท้ายข้างบนแสดงปัญหา catastrophic cancellation. ให้อธิบายว่าทำไมจึงให้ค่ารากหนึ่งไม่ละเอียด แต่ค่าอื่นไม่ใช่ และให้ออกแบบอัลกอริธึมที่ดีกว่าในการคำนวณรากทั้งสองอย่างละเอียดถูกต้อง
            สามารถที่จะใช้ความจริงที่ว่าราก  
x1 และ x2  ของ ax2+bx+c = 0 สอดคล้องตาม
x1x2 = c/a.
            จงเขียนและปรับเปลี่ยนโปรแกรมquadroots2  โดยใช้วิธีการที่ปรับปรุง, และทดสอบ ในกรณีเช่นเดียวกับข้างบนที่ผ่านมา   นับว่ามีประโยชน์มากในการเขียนโปรแกรมทดสอบซึ่งการทดสอบโปรแกรมหนึ่งๆ เทียบกับผลลัพธ์ที่ทราบแล้ว  ให้เขียนโปแปรมชื่อtestQuadroots ซึ่งใช้ฟังก์ชัน quadroots (quadroots and quadroots2)  และทดสอบว่าโปรแกรมตามตัวอย่างที่กำหนดข้างบน  เป็นที่รู้จักกันในนามการทดสอบหน่วย.

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

แสดงความคิดเห็น