บทที่ 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(), คือคำสั่งกราฟิกส์ซึ่งล้างหน้าต่างกราฟิกส์ จากกราฟที่ล้างไปนั้น ข้อมูลเป็นเชิงเส้นโดยประมาณ ที่ซึ่งเรื่องนี้ไม่ชัดเจนเพียงแต่มาจากจำนวนตัวเลข กราฟที่ดีแสดงได้รวดเร็วถึงสิ่งที่กำลังดำเนินการ เมื่อได้มองภาพกราฟแล้ว เพียงแต่คลิกส่วนที่สามารถจะมองเห็นได้ของหน้าต่างคำสั่ง คำสั่งเพิ่มเติมสามารถที่จะพิมพ์เข้าไปได้
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
n 3 5 9 17 33 65
sn .257 .0646 .0151
3.96×10−3
9.78×10−4
2.45×10−4
.
การพล็อต n กับ sn โดยตรงไม่ได้แสดงรูปแบบที่ชัดเจน (สังเกตุ dots, ‘...’,
การพล็อต 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!!
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
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
การบันทึกกราฟ
วิธีที่ง่ายที่สุดในการบันทึกกราฟคือการบันทึกคำสั่งไซแลบที่ใช้ในการสร้างกราฟ ปกติแล้วมีเฉพาะหนึ่งหรือสองเส้น ถ้าคำสั่งมีมากกว่าหนึ่งหรือสองบรรทัด
เป็นไปได้ที่จะบันทึกไว้เป็นไฟล์หนึ่ง (ดูในบทต่อไป)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น