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

บทที่ 3 การพล็อตกราฟจากข้อมูลและฟังก์ชัน


บทที่ 3
การพล็อตกราฟข้อมูลและฟังก์ชัน


3.1 ส่วนนำ
            เอกสารสำหรับเสริมการเรียนรู้ไซแลบออกแบบให้ผู้ใช้คุ้นเคยกับการพล็อตกราฟข้อมูลและฟังก์ชันในไซแลบ.

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

xk   .5   .7   .9    1.3   1.7   1.8
yk   .1   .2  .75   1.5   2.1   2.4

            กำทำงานกับข้อมูลในไซแลบ โดยกำหนดเป็น 2 เว็คเตอร์คอลัมน์ x และ y

x = [.5  .7 .9   1.3   1.7   1.8 ]’
y = [.1  .2 .75 1.5   2.1   2.4 ]’

(เรื่องของเว็คเตอร์อภิปรายกันในรายละเอียดในบทเรียนต่อไป แต่สามารถที่จะนำมาใช้ในการวาดหรือพล็อตกราฟปราศจากรู้ถึงรายละเอียดทั้งหมด) เพื่อที่จะสร้างกราฟ y ต่อค่า x ให้ใช้คำสั่ง plot ดังนี้
plot2d(x,y, style=-1)
            กราฟควรจะปรากฏขึ้นมาให้เห็น (ถ้าไม่มีอาจจะซ่อนหลังวินโดว์อื่น  ให้คลิกที่ไอคอน ภาพที่ 1 บนทาสบาร์ของวินโดว์เพื่อนำกราฟออกมาแสดงด้านหน้า)
กราฟนี้แสดงจุดพล็อตด้วย ‘+’.  รูปแบบอื่นๆ ของจุดสามารถเปลี่ยนได้โดยเปลี่ยน style=-1ในคำสั่ง และใช้ help plot2d เพื่อหารายละเอียดในการใช้คำสั่ง
            ภาพที่ 1 แสดงการพล็อตจุดในกราฟ
แบบฝึกหัดที่ 7.การทดลองด้วยค่ารูปแบบที่แตกต่าง ค่าลบจะให้ตัวแสดงจุดกราฟ ค่าเป็นบวกและสีเส้นกราฟ  ตามที่ได้ทดลองเองนั้นควรที่จะได้ลบการพล็อตที่ผ่านมา โดยใช้คำสั่งคือ
  xbasc()
เริ่มด้วยค่า
x โดยทั่วไปเกี่ยวข้องกับคำสั่งทางกราฟิกส์ (นี่มาจากระบบ X วินโดว์ที่ใช้ในระบบเครื่องคอมพิวเตอร์แบบยูนิกส์) ดังนั้น xbasc(), คือคำสั่งกราฟิกส์ซึ่งล้างหน้าต่างกราฟิกส์ จากกราฟที่ล้างไปนั้น ข้อมูลเป็นเชิงเส้นโดยประมาณ ที่ซึ่งเรื่องนี้ไม่ชัดเจนเพียงแต่มาจากจำนวนตัวเลข  กราฟที่ดีแสดงได้รวดเร็วถึงสิ่งที่กำลังดำเนินการ  เมื่อได้มองภาพกราฟแล้ว เพียงแต่คลิกส่วนที่สามารถจะมองเห็นได้ของหน้าต่างคำสั่ง คำสั่งเพิ่มเติมสามารถที่จะพิมพ์เข้าไปได้
            แบบฝึกหัดที่ 8.
1. ให้พล็อตกราฟตามข้อมูลข้างบนโดยให้แสดงจุดพล็อตกราฟเป็นวงกลม
2. ให้พล็อตกราฟข้อมูลที่ผ่านมาด้วยจุดที่เชื่อมต่อด้วยเส้น (ให้ดู help plot2d เพิ่มเติม)
3. จงหาว่าจะเพิ่มชื่อกราฟลงในกราฟที่พล็อตได้อย่างไร(แนะ: ให้ใช้คำสั่ง apropos title.)
การพล็อตข้อมูลเป็นจุด
            ผู้ใช้มักจะใช้คำสั่งที่เรียบง่ายที่สุดในการพล็อตข้อมูล และพิมพ์โดยอัตโนมัติเพียงแต่ดังนี้
plot2d( x, y )                                         // คำสั่งพล็อตที่ง่ายที่สุด
            คำสั่งที่ง่ายนี้ไม่ได้แสดงข้อมูลได้ดีมากนัก ยากที่จะเห็นว่ามีจุดที่พล็อตมากอย่างไรที่มีอยู่ในชุดข้อมูลเริ่มแรก  จะดีกว่าในการพล็อตเพียงแต่เป็นจุด  ตามที่เส้นระหว่างจุดไม่ได้มีนัยสำคัญ เพียงแต่ช่วยให้เราติดตามชุดของการวัด ถ้ามีชุดข้อมูลจำนวนมากในกราฟหนึ่ง  หากยังยืนกรานที่จะต่อจุดด้วยเส้น เป็นเรื่องที่สำคัญที่ควรจะได้ทำเครื่องหมายแต่ละจุดไว้

            คำสั่งพล็อตกราฟอย่างง่าย
            3.2.1 การเพิ่มเส้นในกราฟ
            จากกราฟที่ได้เป็นที่ชัดเจนว่าจุดที่วางตัวอยู่ในเส้นตรง บางครั้งจุดไม่ได้อยู่ในเส้นเพราะค่าผิดพลาดจากการทดลอง เนื้อวิชาสถิติจะแสดงวิธีการคำนวณเส้นตรงที่เหมาะสมทึ่สุดสำหรับชุดข้อมูลนั้นๆ แต่แม้ว่าไม่มีสถิติเส้นระหว่างจุด(.5, 0) และ (2, 3) ก็เป็นตัวแทนที่ดีสำหรับการลากเส้นให้เหมาะสมที่สุดกับข้อมูล  ทดลองเพิ่มเส้นให้กับการพล็อตและดูดีขึ้นจากการประมาณค่าข้อมูล  การทำเช่นนี้ก็โดยเรียกให้ไซแลบพล็อตจุด (.5, 0) and (2, 2.7) เชื่อมต่อกันด้วยเส้นหนึ่ง

x = [.5 .7 .9 1.3 1.7 1.8 ]’;
y = [.1 .2 .75 1.5 2.1 2.4 ]’;
plot2d(x,y,style=-1)
x_vals = [ .5 2]’; // The X-coords of the endpoints.
y_vals = [ 0 2.7 ]’; // The Y-coordinates
plot2d(x_vals,y_vals)
legends([’Line of Best Fit’;’Data’],[1,-1],5)
xtitle( ’Data Analysis’)

หมายเหตุถึงค่า x_vals มีพิกัด x   ค่า y_vals มีพิกัด y และจุดสองจุดที่เชื่อมต่อกันด้วยเส้นเพราะว่าไม่ได้บ่งชี้ถึง style (ค่าปริยายของ Style คือเป็นเส้นตรงหนึ่ง)
เส้นตรงที่เหมาะสมที่สุดสามารถพบได้โดยใช้ฟังก์ชันdatafit (จะกล่าวถึงส่วนนี้อีกเมื่อกลับมาเรื่องนี้ภายหลังอีกที)
            3.2.2 ข้อแนะนำเพื่อกราฟที่ดี
            มีหลายทางเลือกที่จะทำให้ได้กราฟที่ดี จากมุมมองทางวิทยาศาสตร์ในการทดสอบง่ายๆเพื่อดูว่าสามารถจะให้ครอบคลุมข้อมูลได้ง่ายจากกราฟ  กราฟหนึ่งนั้นคิดเพิ่มเติบบางสิ่งบางอย่าง โดยไม่เอาข้อสนเทศออกไป ตัวอย่างเช่น ถ้าข้อมูลที่ใช้ที่ทำงานจาก 1 ถึง 1.5 นั้นถือว่าไม่เป็นการดีถ้าวางแกนอ้างอิงจากค่า 0 to 10,  ทำเช่นนี้จะไม่สามารถเห็นความแตกต่างระหว่างค่าได้ จึงให้ข้อเสนอแนะเล็กน้อยเพิ่มเติมอีกสองประการดังในแบบฝึกหัด
แล้วแบบฝึกหัดที่ 9.  ให้เปลี่ยนคำสั่งการพล็อตที่แล้วเพื่อให้แสดงข้อมูลได้ชัดเจนยิ่งขึ้น โดยการพล็อตจุดข้อมูลเป็นวงกลมเล็กๆเชื่มต่อด้วยเส้นประ ให้ใช้ help plot2d เพื่อดูอาร์กิวเมนต์ที่เป็นไปได้ ให้เลือกมาตราส่วนที่เหมาะสม
            ในตัวอย่างในตอนนี้ ทำให้ง่ายต่อการเห็นถึงความสัมพันธ์ระหว่าง x และ y   ในสถานะการณ์ที่ซับซ้อนขึ้น อาจจำเป็นต้องใช้มาตราส่วนที่แตกต่างออกไปเพื่อแสดงข้อมูลได้ชัดเจนยิ่งขึ้น ให้พิจารณาผลของโมเดลต่อไปนี้

n     3      5         9        17                33                65
sn  .257  .0646   .0151   3.96×103   9.78×104    2.45×104 .

            การพล็อต n กับ sn โดยตรงไม่ได้แสดงรูปแบบที่ชัดเจน (สังเกตุ dots, ‘...’,
ในตัวอย่างต่อไปหมายถึงบรรทัดปัจจุบันต่อเนื่องกับบรรทัดถัดไป ไม่ต้องพิมพ์จุดเหล่านี้หากต้องการคำสั่งทั้งหมดอยู่ในบรรทัดเดียวกัน

n = [ 3 5 9 17 33 65 ]’;
s = [ 2.57e-1 6.46e-2 1.51e-2 ...
3.96e-3 9.78e-4 2.45e-4 ]’ ;
xbasc() // clear the previous plot
plot2d( n, s, style=-1 ) // This is a poor plot!!
            ในความเป็นจริงนั้นยากมากที่จะอ่านค่า sn กลับออกมาจากกราฟ  อย่างไรก็ตามการพล็อตค่า log(n) กับ log(sn) จะดูได้ชัดเจนกว่า เพื่อสร้างการพล็อตในมาตราส่วนแบบล็อก สามารถใช้คำสั่งแบบใดแบบหนึ่งดังนี้.

xbasc(); plot2d( log10(n), log10(s), style=-1)
xbasc(); plot2d( n, s, style=-1 , logflag = ’ll’)

           
            การพล็อตเหล่านี้บอกให้ทราบว่ามีความสัมพันธ์เชิงเส้นระหว่างค่าล็อกของสองปริมาณดังกล่าว.
            แบบฝึกหัดที่ 10.
1. ให้ใช้คำสั่ง help plot2d หาคำสั่งซึ่งจะใช้กับมาตราส่วนแบบล็อกเท่านั้นสำหรับข้อมูล sn  จะดีหรือแย่ลงกว่าการพล็อตแบบ log-log ?
2. ให้เพิ่มชื่อกราฟกับการพล็อตล่าสุดและใส่ข้อมูลกำกับแกน X และ Y .

3.3 การสร้างกราฟ Graphs
            พิจารณาปัญหาการสร้างกราฟจากฟังก์ชัน  ตัวอย่างเช่นมีฟังก์ชันดังนี้
f(x) = x|x|/(1 + x2)
อยู่ในช่วง [5, 5].
           
3.3.1 การพล็อตกราฟฟังก์ชัน
            ไซแลบได้ให้วีธีการที่ง่ายสำหรับกำหนดฟังก์ชัน สำหรับฟังก์ชันอย่างง่าย การนิยามฟังก์ชันสามารถเขียนได้ที่เครื่องหมายเตรียมพร้อมหรือออนไลน์  ตัวอย่างเช่นเพื่อกำหนดฟังก์ชันทำได้คือ จากที่มีฟังก์ชัน
f(x) = x|x|/(1 + x2) สามารถที่จะเขียนได้ดังนี้
function [y]=f(x)
y = x*abs(x)/(1+x^2);
endfunction
            นี่คือการกำหนดฟังก์ชันของไซแลบด้วยชื่อ f.  จากนั้นสามารถที่จะหาค่าฟังก์ชัน เช่น
f(3)
            เพื่อสร้างการพล็อตของฟังก์ชันนี้  สามารถใช้คำสั่ง fplot2d  การพล็อตกราฟฟังก์ชันในทันทีเพื่อพล็อตฟังก์ชัน f ในช่วง [0, 1]  ในครั้งนี้ใช้
x = (-5:0.1:5)’;
fplot2d(x,f)
            คำสั่งแรกก่อให้เกิดเว็คเตอร์คอลัมน์ของค่า  x  จาก 0 ถึง 1 เพิ่มค่าขึ้นทีละ .1. คำสั่งที่สองก่อให้เกิดการพล็อตฟังก์ชัน f.
            3.3.2 องค์ประกอบเลขคณิต
            การที่จะให้สามารถคำนวณตามลำดับองค์ประกอบ (componentwise arithmetic) นี่คือการทำอย่างไรดังนี้.

x = (-5:.1:5)’ ;
y = x .* abs(x) ./ ( 1 + x.^2) ;
plot2d( x , y )

            คำสั่งแรกก่อให้เกิดเว็คเตอร์ของค่า x  จาก-5 ถึง 5 โดยเพิ่มขึ้นทีละ .1. ซึ่งได้แก่เว็คเตอร์คอลัมน์ x  x = [5,4.9, · · · , 0, · · · 4.9, 5].  ส่วนเว็คเตอร์  y ประกอบด้วยค่าของ  f ที่ตามค่าของ x เหล่านี้ ตามที่มีจำนวนจุดมากมาย  กราฟของ x กับ y คล้ายกับเคิร์ฟที่สม่ำเสมอ  ที่ใหม่ตอนนี้คือตัวกระทำ .* , ./ และ .^ คำสั่งที่ 2    ยังมีการเรียกว่าตัวกระทำตามองค์ประกอบ(component-wise operation)    ในตัวอย่างข้างบน  x  คือคอลัมน์เว็คเตอร์ความยาว  101 และ abs(x) เป็นคอลัมน์เว็คเตอร์ซึ่งองค์ประกอบนำเข้าที่ i (ith) คือ |xi|. สูตร x*abs(x) คงจะไม่ถูกต้อง ตามความพยายามที่คูณ เมทริกซ์ x 1×101  โดยเมทริกซ์abs(x). 1 × 101 อย่างไรก็ตามเป็นการดำเนินการตามลำดับองค์ประกอบ x.*abs(x) ก่อให้เกิดเว็คเตอร์ความยาว 101 ด้วยการนำเข้า xi|xi|.  ต่อเนื่องในการหาค่านิพจน์โดยใช้เลขคณิตตามลำดับองค์ประกอบ จะได้เว็คเตอร์ y ความยาฝ101 ซึ่งการนำเข้าคือ xi|xi|/(1 + xi2 ). ( แน่นอนว่าไม่ควรมีความเชื่อมั่นมากเกินไป โดยหลักนี้การหารโดยเว็คเตอร์ไม่สามารถใช้ในทางคณิตศาสตร์อย่างเหมาะสม)
            ข้อสังเกตคือ  p.*q และ p*q ต่างกันโดยสิ้นเชิง. แม้ว่า p และ q เป็นเมทริกซ์ที่มีขนาดเดียวกัน และผลคูณทั้งสองแบบสามารถมีได้อย่างถูกต้องตามหลักเกณฑ์  ผลที่ได้จะแตกต่างกัน.
แบบฝึกหัดที่ 11
1. (ง่าย) จงหา 2 เมทริกขนาด 2×2  p และ q  นั่นคือ p.*q p*q.
2. (ยาก) จงหาเมทริกซ์ขนาด 2×2 ทั้งหมด ที่ p และ q ดังกว่างว่า p.*q=p*q.
            ก่อนที่ทำแบบฝึกหัดเพิ่มขึ้นอีก จะได้แสดงวิธีการการเพิ่มเคิร์ฟให้กราฟที่ผ่านมา  สมมุติว่าต้องการเปรียบเทียบฟังก์ชันที่ได้จัดไว้แล้ว คือฟังก์ชัน x|x|/(5+x2) และ x|x|/(15+x2). ทำให้ลุล่วงไปได้ด้วยคำสั่งเพิ่มเติม 3 คำสั่ง (จะเห็นว่า x ประกอบด้วยค่า x แล้วใช้ในการพล็อต  คำสั่งใหม่เหล่านี้นำเข้าได้ง่ายโดยการแก้ไขบรรทัดคำสั่งที่แล้ว) ดังนี้

y2 = x .* abs(x) ./ (5 + x.^2) ;
y3 = x .* abs(x) ./ ( 1/5 + x.^2) ;
plot2d(x,[y y2 y3])

ข้อสังเกต x จำเป็นต้องเป็นเว็คเตอร์คอลัมน์ สำหรับงานนี้  ได้กราฟดังรูปข้างล่าง
แบบฝึกหัดที่12.
1. ให้ใช้ไซแลบในการเขียนกราฟฟังก์ชัน cos(x), 1/(1 + cos2(x)), และ 1/(3 +
cos(1/(1 + x2)) บนกราฟที่แยกกัน.
2. ให้สร้างกราฟ 1/(1 + eαx), สำหรับ  4 x 4  และ α = .5, 1, 2, ในการพล็อต.
3. จงใช้คำสั่ง plot2d สร้างกราฟที่แสดงดังนี้
= 1
 (แนะ: ให้เลือกช่วงที่เหมาะสม และชุดของค่า x แล้วพล็อต  sin(x)/x. ถ้าได้รับข้อความว่าหารโดยศูนย์ นั่นหมายถึงว่า พยายามที่จะหาค่า sin(x)/x เมื่อ x เท่ากับ 0 พอดี)
            3.3.3 การพิมพ์กราฟ
            เมื่อกราฟได้วาดขึ้นอย่างถูกต้อง และมักต้องการที่จะพิมพ์ออกทางกระดาษ เหมือนกับกราฟมากมายที่พิมพ์ออกทางปริ้นเตอร์ จึงเป็นความคิดที่ดีที่จะทำป้ายกำกับหรือฉลากกราฟ ด้วยชื่อ การทำเช่นให้ใช้คำสั่ง xtitle .
\\. ให้แน่ใจในการใช้เครื่องหมายคำพูด
xtitle(’Exercise 3.4 Kim Lee.’)                 \\ around the title.
            ให้นำวินโดว์กราฟที่พล็อตไว้ออกมาแสดงด้านหน้า และควรจะมีชื่อปรากฏในกราฟ ถ้าทุกอย่างปกติ ให้คลิกที่เมนูไฟล์ เลือก ‘print scilab’ ชิ้นงานในวินโดว์กราฟ ถ้าทุกอย่างกำหนดไว้อย่างถูกต้อง กราฟจะปรากฏในกระดาษผ่านทางปริ้นเตอร์ที่เชื่อมต่อกับคอมพิวเตอร์ที่ใช้
            หลังจากพิมพ์ออกกระดาษมาแล้ว จะมีประโยชน์มากที่จะใช้ปากกาทำป้านกำกับแกน (ถ้ายังไม่ได้ทำให้ไซแลบ) และบางครั้งเขียนอธิบายจุดต่างๆหรือเคิร์ฟในพื้นที่วางภายใต้  มีทางเลือกที่ทำได้ก่อนที่จะพิมพ์ออกกระดาษ ให้ใช้คำสั่งไซแลบ xtitle ที่มีทางเลือกอาร์กิวเมนต์ 2 อย่าง และอาร์กิวเมนต์ legend ของ คำสั่ง plot2d สำหรับให้ปรากฏเป็นมืออาชีพมากกว่า. สำหรับขณะหนึ่งๆ เช่น
xbasc()
plot2d(x,[y  y2 y3],leg=’function y@function y2@function y3’)
xtitle(’Plot of three functions’,’x label’,’y label’)
            ทางเลือกอื่นๆ คือทางเลือกจากไฟล์เมนูวินโดว์กราฟิกส์ การเอ็กพอร์ท (export) หรือ คำสั่ง
xbasimp เพื่อจะพิมพ์กราฟที่อยู่ในไฟล์ดังนั้นจึงสามารถที่จะพิมพ์ได้ภายหลัง  ตัวอย่างเช่นการสร้างไฟล์โพสสคริปซ์โดยใช้คำสั่งดังนี้
xbasimp(0,’mygraph.eps’)
            คำสั่งนี้จะเขียนกราฟที่เพิ่งดำเนินการ(เกี่ยวข้องกับวินโดว์กราฟิสก์ 0) เป็นไฟล์ชื่อ mygraph.eps. ซึ่งไฟล์นี้สามารถเก็บไว้และพิมพ์ออกเครื่องพิมพ์ภายหลัง
3.3.4 การบันทึกกราฟ
            วิธีที่ง่ายที่สุดในการบันทึกกราฟคือการบันทึกคำสั่งไซแลบที่ใช้ในการสร้างกราฟ  ปกติแล้วมีเฉพาะหนึ่งหรือสองเส้น  ถ้าคำสั่งมีมากกว่าหนึ่งหรือสองบรรทัด เป็นไปได้ที่จะบันทึกไว้เป็นไฟล์หนึ่ง (ดูในบทต่อไป)

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

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