|
การฝึกเขียนโปรแกรม SciLab ขั้นแนะนำ (โดย MathGuy)
โพสต์เมื่อ:
11:21 วันที่ 30 เม.ย. 2550 ชมแล้ว:
22,221
ตอบแล้ว:
197
วิชาการ.คอม > ครูอาจารย์
วิชาการ.คอม > ครูอาจารย์ > ครูคุยทั่วไป วิชาการ.คอม > ครูอาจารย์ > การเรียนการสอน วิชาการ.คอม > ครูอาจารย์ > เทคนิควิธีการสอน
น่าจะนับได้ว่า เป็นการนับ 1 ของการที่จะพอมีอะไรแบ่งปันให้กับคนอื่นๆบ้าง ในโลก Internet
จากที่เราได้ใช้ประโยชน์จากแหล่งความรู้ ข้อมูลต่างที่มีประโยชน์ต่อเรา ที่มีคนเสียสละเวลา
เสียสละแรงกายใจ แบ่งปันให้เราได้ใช้ร่วมกัน
เมื่อถึงจุดๆหนึ่ง เราก็น่าจะได้เริ่ม ทดแทนคุณกลับคืนบ้าง (รับมามากแล้ว เราก็ฝึกที่จะให้
)
.........................................................................................................................
กระทู้นี้ จึงเป็นการแบ่งปัน ในเรื่องการฝึกเขียนโปรแกรม SciLab
เข้าไปดูตรงนี้นะครับ : http://www.champa.kku.ac.th/jeerayut/scilab41/scilab41.html
(1) ถ้ารู้ว่า MatLab, Maple, Mathematica, Maxima, Octave คืออะไร ก็จะรู้ว่า SciLab เป็นพี่น้องกันด้วย
(2) SciLab เป็น Freeware และเข้าใจว่าจะเป็นต่อไปเรื่อยๆ (เช่นเดียวกับ Maxima และ Octave)
(3) ผมเชือว่า SciLab มีความสามารถสูงในการใช้งาน และกำลังจะเข้าไปพิสูจน์ หาคำตอบอันนี้
(4) กระทู้นี้จึงเป็นการเชิญชวน ผู้ที่สนใจ ให้เรียนรู้ไปด้วยกัน
(5) ผู้เรียนควรจะมีพื้นความรู้ทางคณิตศาสตร์ (มัธยมปลายน่าจะ OK) และมีพื้นความรู้ทางการเขียนโปรแกรมคอมพิวเตอร์บ้างพอสมควร (เคยเขียนมาบ้าง ภาษาอะไรก็ได้)
(6) ผมจะแนะนำให้น้อยที่สุด (เท่าที่คิดว่าน่าจะพอเริ่มต้นได้) และจะเน้นการทดลองเขียน การเรียนรู้ด้วยตัวเอง
(7) ถ้ามีผู้ใดที่ใช้โปรแกรมนี้อยู่ และถึงขั้นเชี่ยวชาญแล้ว ก็อยากจะให้มาช่วยๆกัน แลกเปลี่ยนประสบการณ์ครับ
(8) ผู้ที่สนใจ ถ้าได้ทดลองเขียน เรียนรู้ตามไป ถ้าไม่เข้าใจ ก็ให้ post ถามในกระทู้นี้นะครับ
สวัสดีครับ.....ขอร่วมเรียนรู้ด้วยคนครับ ถึงคุณ lekcha การหาค่าสูงสุด / ต่ำสุดของฟังก์ชัน จำเป็นต้องรู้ 1) ธรรมชาติ หรือพฤติกรรมของฟังก์ชัน บนโดเมนที่เราสนใจ 2) จากข้อ (1) จะทำให้เราทราบว่า สามารถเลือกใช้ขั้นตอนวิธี (algoritm) หรือ ระเบียบวิธี(method) ในการแก้ปัญหา หรือหาคำตอบ (ประมาณค่าของคำตอบ) ได้อย่างไร ........................................................................................................... ผมลองยกตัวอย่างเช่น ฟังก์ช้น y = f(x) = x^2 +10/x สนใจค่า x บนช่วงปิด [1, 2] ให้เราพิจารณาว่า f มีค่าสูงสุด หรือต่ำสุดหรือไม่ ถ้ามีจะหาค่าได้อย่างไร ........................................................................................................... จากตัวอย่าง เราอาจจะใช้วิธีทาง calculus หาค่าแม่นตรงออกมาก็ได้ ( dif หาจุดวิกฤติ แล้วตรวจสอบจุดวิกฤติดังกล่าว) หรือเราอาจจะใช้ระเบียบวิธีทาง numerical analysis แล้วเขียนโปรแกรม (ที่นี่เราจะใช้ SciLab) เพื่อประมาณค่าคำตอบดังกล่าวก็ได้ การรู้จัก (1) และ (2) สำหรับฟังก์ชัน f บนโดเมนของเรา จึงเป็นสิ่งสำคัญในเบื้องต้นที่เราต้องทราบ การเขียนโปรแกรมเป็นเรื่องอันดับรองถัดไป ซึ่งสามารถทำได้ เมื่อเรารู้วิธีการเขียน เขียน code ใน SciLab เพื่อวาดกราฟดูพฤติกรรมของ y = f(x) = x^2 +10/x บนช่วง [1,2]ได้ดังนี้ -->x=linspace(1,2,100); -->deff('y=f(x)','y=x^2+10/x'); -->for i=1:100, y(i)=f(x(i)); end -->plot2d(x,y) --> ได้กราฟดังนี้ ![]() ถ้าผมต้องการหาค่า ! ของ n ใดๆ หละครับ n! = 1 x 2 x 3 x ... x n สามารถคำนวณแบบทำซ้ำได้ง่ายๆ โดย กำหนด s=1 แล้วก็ให้ s := s x i เมื่อ i = 1,2,3, ..., n ได้ code ของ SciLab ดังนี้ -->function m=MyFact(n), -->s=1, -->for i=1:n, s=s*i; end, -->m=s, -->endfunction -->MyFact(5) ans = 120. -->MyFact(10) ans = 3628800. --> การบ้านครับ "แปดเหลี่ยม" โดยมีรูป "หกเหลี่ยม" ซ้อนอยู่ข้างใน -->x=[0.5 1 2 2.5 2.5 2 1 0.5 0.5]; -->y=[2 1 1 2 3 4 4 3 2]; -->plot2d(x,y) -->a=[0.8 1.0 2.0 2.2 2.0 1.0 0.8]; -->b=[2.5 1.5 1.5 2.5 3.5 3.5 2.5]; -->plot2d(a,b) แบบนีผมจะได้คะแนนเท่าไรครับ diary('h:\xxxxxxxx\xxxxx_5.txt'); //N! = N?(N-1)?(N-1)?????3?2?1 //x=N;for k=N-1 //if N-1 >1 then N=N-1; //x=x*k; //end //x k=N;// N=จำนวนเต็มใดๆ if k<1 then k=1,end x=1; for j=1:k,x=x*j; f=x; end N f diary(0) ผมได้อย่างนี้ครับ เป็นการบ้านผมเองครับ.......ลองผิดลองถูกตั้งหลายรอบ จงเขียนโปรแกรมเพื่อเก็บข้อมูลที่ไม่เป็น 0 ของสมาชิกเวกเตอร์ ซึ่งมีจำนวนสมาชิก 20 ตัว โดยเก็บค่าของตัวแปรที่ไม่เป็น 0ไว้ในตัวแปร val พร้อมทั้งระบุตำปหน่งที่พบค่าดังกล่าวไว้ในตัวแร idx Ex....เวกเตอร์ A มีสมาชิกดังนี้ A = [2 0 2 0 0 1 1 5] VAL = [2 2 1 1 5] IDX = [1 3 6 7 8] เดี๋ยวมาส่งการบ้านครับ ขอเวลาคิดสัก 1/2 วัน เริ่มจาก คหพ#123 ของคุณ lekcha ซึ่งเป็น code การสร้างรูปหกเหลี่ยมในรูปแปดเหลี่ยม (คัดลอกไว้อีกที) -->x=[0.5 1 2 2.5 2.5 2 1 0.5 0.5]; -->y=[2 1 1 2 3 4 4 3 2]; -->plot2d(x,y) -->a=[0.8 1.0 2.0 2.2 2.0 1.0 0.8]; -->b=[2.5 1.5 1.5 2.5 3.5 3.5 2.5]; -->plot2d(a,b) --> ได้ผลดังนี้ ( ให้ 9.5 คะแนนเต็ม 10 นะครับ รูป 6 เหลี่ยมถ้าเป็นด้านเท่าก็จะ perfect!) ![]() จาก คหพ#124 ของคุณ Phulandkar code ที่ post ให้ดู ผมดูแล้วยังไม่ค่อยมั่นใจ ลองช่วยปรับใหม่ หรืออธิบายให้ฟังหน่อย หรือลอง run ดูว่าได้ผลตามที่ต้องการหรือเปล่า สำหรับโจทย์ปัญหาใน คหพ#126 ลองศึกษา code และผล run ต่อไปนี้นะครับ ( ถ้าไม่เข้าใจตรงไหน ก็ถามขอคำอธิบายเพิ่มเติมได้ครับ )-->function [b]=FindIndex(a,n,x), -->i=0, -->for k=1:n, -->if a(k)==x then i=i+1; b(i)=k; end, -->end -->endfunction -->b=FindIndex([1 0 0 3 0 1 3 3],8,0) b = 2. 3. 5. -->b=FindIndex([1 0 0 3 0 1 3 3],8,1) b = 1. 6. -->b=FindIndex([1 0 0 3 0 1 3 3],8,3) b = 4. 7. 8. N = 6. f = 720. ได้คำตอบตามที่ต้องการครับ ลองหลายค่าแล้วครับ OK ครับ code ของ Phulandkar ถูกต้องแล้วครับ ถ้าปรับเขียนให้เป็นฟังก์ชัน จะได้ดังนี้ -->function f=myFactorial(n), -->k=n, -->if k<1 then k=1; end, -->x=1, -->for j=1:k,x=x*j; end, -->f=x, -->endfunction ทดสอบการใช้งาน -->myFactorial(6) ans = 720. --> จาก 126 ครับ diary('H:\B4913764\week3_6.txt') //A=[กำหนดเอง 20 ตัว] Val = []; Idx = []; x=1; for y=1:20 if A(y)<>0 then Val(1,x) = A(y); Idx(1,x) = y; x = x+1; end end A Val Idx diary(0) ได้ผลดังนี้ครับ A = 1. 2. 3. 0. 4. 5. 9. 7. 89. 0. 1. 4. 50. 4. 8. 4. 4. 5. 0. 0. Val = 1. 2. 3. 4. 5. 9. 7. 89. 1. 4. 50. 4. 8. 4. 4. 5. Idx = 1. 2. 3. 5. 6. 7. 8. 9. 11. 12. 13. 14. 15. 16. 17. 18. Code ใน คหพ#132 ถูกต้องแล้วครับ ( จริงๆ ผมเองยังไม่เคยลองใช้ คำสั่ง diary() เห็นคุณ Phulandkar ใช้สองสามหน เดี๋ยวผมจะไปค้นดูว่าเขาใช้กันยังงัย ... หรือ จะช่วยอธิบายการใช้ให้ฟังหน่อยได้มั้ยครับ )....................................................................... ผมปรับ code ให้เขียนในรูปฟังก์ชัน และเก็บไว้ใน Script file ( .sci) เพื่อ load ใช้งานได้ดังนี้ครับ //ฟังก์ชันสำหรับหาสมาชิกที่ไม่เป็น 0 ในอะเรย์ ให้เก็บทั้งค่า และตำแหน่ง function [Data_value, Data_index]=NonZero(data,n) i=0; for j=1:n if data(j)<>0 then i=i+1; Data_value(1,i)=data(j); Data_index(1,i)=j; end end endfunction ทดสอบการใช้งาน (ข้อมูลกี่ตัวก็ได้ ตัวอย่างใช้ 12 ตัว) -->data=[1 2 0 4 0 0 5 0 7 7 0 3] data = 1. 2. 0. 4. 0. 0. 5. 0. 7. 7. 0. 3. -->[Val, Idx]=NonZero(data,12) Idx = 1. 2. 4. 7. 9. 10. 12. Val = 1. 2. 4. 5. 7. 7. 3. --> ![]() ใช้เก็บข้อมูลที่ดำเนินการบน command window รูปแบบคำสั่ง diary(filename.xyz); diary(0); เมื่อเก็บไฟล์เรียบร้อย ให้ใช้ Scipad เปิดดู ![]() ขอบคุณ คุณ Phulandkar ที่ได้แลกเปลี่ยนกันตรงนี้ ต่อไปผมก็จะได้ลองใช้ คำสั่ง diary( 'filename.xxx') กับ diary(0) ดูบ้าง ปกติผมจะเขียนเป็น script file (.sci) แล้วค่อย execute หรือ load เข้ามาใน SciLab ส่วนผลการ run ก็ใช้วิธี copy เอาเลย จะวางใน notepad แล้วค่อย save ก็น่าจะได้ ส่วนใหญ่ ก็จะ run แล้ว copy ผล มาขึ้นไว้ที่นี่เลย แต่มีเครื่องมือช่วยในการจัดเก็บผลการ run จาก command ก็นับว่าสะดวกดี และสามารถเก็บไว้ใช้ได้ภายหลัง (เช่นการสอน การแนะนำ การแลกเปลี่ยนกัน ) ขอบคุณสำหรับความรู้ต่างๆคับ ผมกำลังศึกษาและทำ project เกี่ยวกับ image processing SciLab พอจะนำ input ที่เป็นสารสนเทศ มาทำการประมวลผลได้รึไม่ ขอบคุณล่วงหน้าครับ campus (IP:58.8.98.161) |
ขอบคุณผู้สนับสนุนHot Links |
Copyright© 2000-2007, Vcharkarn.Com. All rights reserved.
|
คลิ๊กเพื่อดูสถิติ รับรองและสนับสนุนโดย |
![]() สสวท. |
![]() มูลนิธิ พสวท. |
![]() พสวท. |