|
การฝึกเขียนโปรแกรม SciLab ขั้นแนะนำ (โดย MathGuy)
โพสต์เมื่อ:
11:21 วันที่ 30 เม.ย. 2550 ชมแล้ว:
22,228
ตอบแล้ว:
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 ถามในกระทู้นี้นะครับ
ไม่แน่ใจว่า มีข้อความหายไปอีกหรือเปล่า ความคิดเห็นที่ 54 และ 55 ไม่ปรากฏครับ ความเห็นที่ 54 โดยคุณ np 1. จงเขียนคำสั่งเพื่อหา ห.ร.ม. ของ n1 และ n2 เมื่อ n1 และ n2 เป็นจำนวนใดๆที่ผู้ใช้ป้อนเข้ามา 2. จงเขียนคำสั่งเพื่อหา เงินรวม ของเงินต้น 50000 บาท ดอกเบี้ยทบต้น ร้อยละ 2 ต่อปีซึ่งฝากธนาคารเป็นเวลา 7 ปี ความเห็นที่ 55 โดยคุณ np ขอโทษ ครับ ขอแก้ คหพต.54 ข้อ 2 จาก 5 หมื่น เป็น num และจากร้อยละ 2 เป็นร้อยละ b และจาก เป็นเวลา 7 ปี เป็น t ปี ทั้งสองความเห็นนี้โดนแจ้งลบโดยคุณ np ทางทีมงานเห็นว่า เป็นการแจ้งลบโดยเจ้าของความเห็น จึงทำการซ่อนออกไปครับ ถ้าหากทีมงานเข้าใจผิดพลาด กรุณาชี้แนะครับ จะนำกลับมาให้ได้ ขอให้เทวดา ฟ้าดิน บรรดาลให้ คุณ np ชักแหงกๆเดี๋ยวนี้หรือเวลาใดก็ได้เลยครับ ถ้า np แจ้งลบ คิดง่ายๆ ก็เขาเป็นผู้ถาม แสดงว่าเขาอยากรู้ แล้วเขาจะแจ้งลบทำไม และที่สำคัญ ปุ่มแจ้งลบมันอยู่ตรงไหนล่ะเนี่ยะ ไม่อยากโทษหรอกว่าเป็นฝีมือใคร np (IP:202.57.149.52) ตอบ การหา ห.ร.ม. หรือ GCD (Greatest common divisor) ก่อนนะครับ ................................................................................. -->function m=MyGCD(n1,n2), -->r=n2-n1*int(n2/n1), -->if r==0 then m=n1, else m=MyGCD(r,n1), end, -->endfunction -->u=[MyGCD(2,6) MyGCD(12,15) MyGCD(3,7) MyGCD(100,120)] u = 2. 3. 1. 20. --> (คำอธิบาย) เราเขียน code เป็นฟังก์ชัน ซึ่งต่อไปจะเก็บไว้ใน Library และสามารถนำมาใช้งานในส่วน code อื่นๆ ได้ ภายหลัง(Reuse) การป้อน input แบบ GUI (Graphic user interface) มี window เล็กๆ pop up ขึ้นมาให้เติมค่า ก็ทำได้ครับ แต่ขออนุญาตเก็บเอาไว้ก่อน เอาไว้ศึกษาในส่วนเรื่อง GUI อีกทีหนึ่งครับสรุปอีกทีนะครับ การเขียนฟังก์ชันต่างๆ ที่เราต้องการขึ้นมาใช้เอง เป็นหัวใจของการใช้ SciLab แต่แน่นอนว่า SciLab ก็มีฟังก์ชันสำเร็จแล้วจำนวนมากเช่นกัน (คำอธิบาย ต่อ) มาวิเคราะห์ฟังก์ชัน MyGCD( , ) ที่เราพึ่งเขียนไปดูนะครับ บรรทัดที่ 1 -->function m=MyGCD(n1,n2), ตั้งชื่อฟังก์ชันว่า MyGCD มี inputs สองตัวคือ n1, n2 ผมลืมบอกไปว่า SciLab ใช้ตัวเลขจำนวนจริง(เลขทศนิยม) บรรทัดที่ 2 -->r=n2-n1*int(n2/n1), เป็นการหาเศษจากการหาร n2 ด้วย n1 (ผมเข้าใจว่าน่าจะมีฟังก์ชันสำเร็จ แต่ตรงนี้เราเขียนเองเลย ซึ่งปกติ จะเร็วกว่า และเราสามารถควบคุมได้ ... แต่ต้องรู้ว่าถูกต้องจริงๆ) int(n2/n1) คือ เอา n2 ตั้ง หารด้วย n2 แล้วก็ใช้ฟังก์ชัน int() เพื่อเอาเฉพาะที่เป็นจำนวนเต็ม ไม่เอาเศษ r จะเป็น 0 ก็ต่อเมื่อ n1 หาร n2 ลงตัว บรรทัดที่ 3 if r==0 then m=n1, else m=MyGCD(r,n1), end, ถ้าเศษ r เป็น 0 ก็จะได้ว่า ห.ร.ม. คือ m=n1 แต่ถ้า r ไม่เป็น 0 จะได้ว่า r < n1 แล้วให้เราคำนวณ MyGCD(r,n1) แทน เป็นการคำนวนแบบเวียนเกิด (Recursion) ซึ่งเป็น ความสามารถในการคำนวณของ Computer ที่สำคัญมากเลยทีเดียว กล่าวคือ MyGCD(n1,n2)=MyGCD(r,n1) แล้วก็ให้ทำซ้ำจนกว่า จะหารกันลงตัว ในการเรียกครั้งต่อๆไป (ซึ่งต้องเกิดขึ้นแน่นอน) คำตอบของปัญหา การฝากเงินที่มีอัตราดอกเบี้ยคิดแบบทบต้นทุกปี -->function m=MoneyInterest(x,r,t) -->a=x, -->for i=1:t, a=a+a*r, end, -->m=a, -->endfunction -->for k=1:5 -->v(k)=MoneyInterest(50000,0.02,k); -->end -->v v = 51000. 52020. 53060.4 54121.608 55204.04 --> คุณ np ลองค่อยๆไล่ code ดูนะครับว่า ถูกต้อง อย่างที่ต้องการ หรือไม่ครับ ทำการตรวจสอบแล้วพบว่า ข้อความนั้นแจ้งลบโดยสมาชิกชื่อ np หมายเลขสมาชิกคือ 19253 (http://www.vcharkarn.com/include/vcontribution/showvc.php?Vid=19253) แม้ชื่อจะเหมือนกันเป๊ะ แต่คาดว่าไม่น่าจะเป็นคนเดียวกับคุณ np ที่ post เข้ามา เพราะคุณ np ที่โพสต์ไม่ได้ login ส่วนคุณ np ที่แจ้งลบเป็นสมาชิกที่ login อยู่ (ปุ่มแจ้งลบจะอยู่หลังหมายเลขความเห็นครับ สมาชิกเท่านั้นครับที่จะแจ้งลบได้ หากไม่ได้ log in จะไม่เห็นปุ่มนี้ครับ - หลังจากการแจ้งลบระบบจะบันทึกไว้ครับ ว่าใครแจ้งลบ ดังจะเห็นจากตัวอย่างความเห็นถัดไปที่ผมทดสอบแจ้งลบครับ) ตรงจุดนี้อาจจะทำให้ทางทีมงานเข้าใจผิดครับ เพราะนึกว่าแจ้งลบโดยเจ้าของความเห็น เป็น human error ครับ ทีมงานได้นำข้อความที่โพสต์ไว้กลับคืนมาให้แล้วครับ ต้องขออภัยในความผิดพลาดครับ และขอโทษคุณ np ด้วยครับ ขอบคุณ คุณอ๊อฟ ที่ช่วยตรวจสอบ แก้ไข ให้อย่างรวดเร็ว ว่าจะถอย. . . .ดีกว่า ม่ า ย อ า ว . . .ดีกว่า แล้วนะ ดูๆไป ก็น่าสนใจ ขอบคุณครับ อยากจะถามว่า ใน ScaiLab ใช้ฟังก์ชัน Modulo (หมายถึงการหารที่เอาแต่เศษ)อย่างไรครับ ใน JavaScript ใช้ % เช่น n1%n2 ใน Authorware ใช้ MOD เช่น MOD(n1,n2) np (IP:202.57.149.52) ผมกำลังค้นหาอยู่เหมือนกันครับ จะรีบค้นตรวจดูให้ครับ ........................................................................ แต่ถ้าจะเขียนขึ้นมาใช้งานเอง ก็เขียนได้ดังนี้ครับ -->function m=MyMod(a,n), -->m=a-n*int(a/n), -->endfunction -->v=[MyMod(27,5) MyMod(23,9) MyMod(11,3) MyMod(20,4)] v = 2. 5. 2. 0. --> หาเจอแล้วครับ .............................................. -->modulo(24,5) ans = 4. -->modulo(11,4) ans = 3. -->v=[modulo(20,7) modulo(100,53) modulo(144,20)] v = 6. 47. 4. --> ทดลองสร้างลวดลายอย่างง่าย ( 2 สี คือ 0 กับ 1) -->for i=1:10, -->for j=1:10, -->if modulo(i*i+j*j,3)==1 then A(i,j)=1; else A(i,j)=0; end, -->end, end, -->A A = 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 1. 0. 1. 1. 0. 1. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 1. 0. 1. 1. 0. 1. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 1. 0. 1. 1. 0. 1. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. ผมพยามที่จะเขียนคำสั่งหา หรม. มาอวดคุณ MathGuy ตาม อัลกอฮอลิซึม ของผมโดยใช้ Modulo แต่มันก็ไม่ได้สักที จึงอยากจะให้ช่วยแปลงคำสั่งของ JavaScript นี้เป้น ภาษาสกายแลบให้ด้วยครับ <HTML><HEAD><TITLE>npGCD</TITLE></HEAD><BODY> <script language="javascript"> n1=18 n2=12 i=1 while(n1%(n2/i) !=0) { i=i+1 } document.write("ห.ร.ม.ของ "+n1+" และ "+n2+" คือ "+n2/i) </SCRIPT></BODY></HTML> แปลว่า ให้เอา n2 มาหารด้วย i แล้วนำไปหาร n1 ถ้าหารลงตัว หรม.ก็คือ n2 ที่หารด้วย i นั้น ถ้าหารไม่ลงตัวก็เพิ่ม i ขึ้นทีละ 1 (ขอสอนสังฆราชให้ว่ายน้ำหน่อย) อ้อ และขอ ตัวอย่างการใช้ for, while, Array ด้วยครับ np (IP:58.8.97.220) อันดับแรก ศึกษา ทำความเข้าใจ ขั้นตอนวิธีนี้ก่อนนะครับ แนวคิดก็ง่ายๆ คือ เริ่มหาตัวประกอบของ n1 ที่อยู่ในรูป n1/i ( i ต้องหาร n1 ลงตัว) เมื่อเราเริ่ม i จากค่าน้อย (เริ่มจาก 1) ดังนั้น n1/i ก็จะเริ่มจากตัวประกอบที่โตที่สุดของ n1 ( แต่อย่าลืมว่า เราต้องเอาเฉพาะที่ i หาร n1 ลงตัว) แล้วเราก็ตรวจสอบว่า ตัวประกอบ n1/i นี้จะหาร n2 ด้วยหรือไม่ ถ้าไม่ ก็ปรับเพิ่มค่า i จนเราได้ตัวประกอบ n1/i ตัวแรก ที่หาร n2 ลงตัวด้วย ค่า n1/i ดังกล่าว ก็จะเป็นตัวประกอบร่วมที่โตที่สุด ก็คือ ห.ร.ม. นั่นเอง เป็นขั้นตอนวิธีที่ง่าย น่าสนใจ และเขียน code ง่าย แต่จริงๆ แล้ว เป็นขั้นตอนวิธี(algorithm) ที่ไม่มีประสิทธิภาพ เมื่อ n1,n2 มีค่ามากๆ โดยเฉพาะอย่างยิ่งเมื่อ n1 และ n2 มีห.ร.ม. เป็น 1 เราสามารถปรับเป็น code ใน ไซแลป (SciLab) ได้ดังนี้ครับ -->function m=npGCD(n1,n2), -->for i=1:n1, -->if modulo(n1,i)==0 then, -->if modulo(n2,(n1/i))==0 then break; else i=i+1, end, -->else i=i+1, end, -->end, -->m=n1/i, -->endfunction -->npGCD(100,40) ans = 20. -->v=[npGCD(12,30) npGCD(22,121) npGCD(55,15) npGCD(12,44)] v = 6. 11. 5. 4. --> ให้สังเกตว่า -->if modulo(n1,i)==0 then, -->if modulo(n2,(n1/i))==0 then break; else i=i+1, end, -->else i=i+1, end, มีโครงสร้างของ IF ซ้อนกันอยู่ 2 ชั้น ......................................................... ขอไปทานข้าวเที่ยงก่อนนะครับ จะกลับมาพูดถึง FOR , WHILE และ ARRAY เพิ่มเติม ( คุณ np ได้ตัวอย่าง code ที่น่าสนใจดีมากเลยครับ ) ( ใน code ของ scilab ผมสลับบทบาทของ n1 กับ n2 มื่อเทียบกับ ใน code ของ java ) FOR ได้อธิบายไว้บ้างแล้วใน คหพ#11 ตัวอย่างเพิ่มเติมการใช้ FOR -->for k=1:5 -->u(k)=k*k; -->end -->u u = 1. 4. 9. 16. 25. ซึ่งสามารถเขียนด้วยโครงสร้าง WHILE ดังนี้ -->s=1; -->while(s<=5), A(s)=s*s; s=s+1; end -->A A = 1. 4. 9. 16. 25. การใช้ u(1), ...,u(5) และ A(1), ... ,A(5) ก็คือ ARRAY นั่นเองครับ ( ใน scilab จะเรียกว่า vector ) ใน scilab เราสามารถใช้ตัวแปร และ ARRAY ได้โดยไม่ต้องประกาศ(declare)ล่วงหน้า เขียนปรับให้ง่ายขึ้น ... แต่ต้องตรวจสอบให้มั่นใจว่าถูกต้อง! -->function m=np2GCD(n1,n2), -->for i=1:n1, -->if modulo(n2,(n1/i))==0 then break; else i=i+1; end, -->end, -->m=n1/i, -->endfunction -->np2GCD(30,18) ans = 6. -->np2GCD(120,144) ans = 24. --> เขียนปรับให้ง่ายขึ้นโดยใช้ WHILE ... แต่ก็ต้องตรวจสอบให้มั่นใจว่าถูกต้อง! -->function m=np3GCD(n1,n2), -->i=1, -->while(modulo(n2,(n1/i))<>0), i=i+1; end, -->m=n1/i, -->endfunction -->np3GCD(30,18) ans = 6. -->np3GCD(120,144) ans = 24. --> |
ขอบคุณผู้สนับสนุนHot Links |
Copyright© 2000-2007, Vcharkarn.Com. All rights reserved.
|
คลิ๊กเพื่อดูสถิติ รับรองและสนับสนุนโดย |
![]() สสวท. |
![]() มูลนิธิ พสวท. |
![]() พสวท. |