วันเสาร์ที่ 30 พฤษภาคม พ.ศ. 2563

พื้นที่ทำงานและไดเรคทอรีทำงาน ไซแลบติวเตอร์เรียล 3

ไซแลบติวเตอร์ 3

การดำเนินการเมทริกซ์
การสร้างเมทริกซ์และการดำเนินการเมทริกซ์อย่างง่าย

การดำเนินการเมทริกซ์ สร้างผนึกรวมไว้ในตัวไซแลบ  คือ การบวก การลบ การคูณ ทรานสโพส อินเวิร์สชั่น     ดีเตอร์มีแนนท์ ฟังก์ชันตรีโกณ ล็อก ฟังก์ชันเอ็กโพเนนเชี่ยล และ อื่นๆ อีกมาก  ให้ศึกษาตัวอย่างต่อไปนี้
-->a=[1 2 3]                               สร้างเว็คเตอร์แถวหนึ่ง
-->a=[1; 2; 3]                             สร้างเว็คเตอร์คอลัมน์หนึ่ง
-->a=[1 2 3]'                               สร้างเว็คเตอร์คอลัมน์เหมือนกับทีกล่าวถึงมาแล้วข้างบน
-->x=[1 2 3]; y=[4 5 6 7];           สร้างเมทริกซ์ ซึ่งเกิดจากการรวมของ และ เทียบได้เหมือนกัน -->a=[x y]                                     (จำนวนแถวเท่ากัน)
-->a=[1 2 3; 4 5 6; 7 8 9];           กำหนด 3x3 เมทริกซ์เซมิโคลอนแสดงให้เห็นการจบแถวหนึ่งๆ
-->b=a';                                       ทรานสโพส a และเก็บไว้ใน b. เครื่องหมาย Apostrophe(‘) คือตัวกระทำ
                                                      ทรานสโพส

-->c=a+b                                   บวก กับ bและเก็บผลไว้ใน c.   และ จะต้องมีขนาดเท่ากัน
   
ans   =                                    ถ้าเป็นอย่างอื่นไซแลบจะรายงานข้อผิดพลาด      2     6    10
     6    10    14
    10    14   18
-->d=a-b                                   ลบ ออกจาก และเก็บผลใน d.
-->e=a*b                                   คูณ ด้วย b และเก็บผลไว้ใน e  และ ต้องเทียบได้ตรงกันสำหรับการคูณ
 
  ans   =                                    เมทริกซ์
       14     32     50    
        6      10     14
        50    122   194
-->f=[3 1 2; 1 5 3; 2 3 6];            กำหนด 3x3 เมทริกซ์ด้วชื่อ f.
-->g=inv(f)0.4285714    0.               -0.1428571   อินเวิร์ทเมทริกซ์ และเก็บผลไว้ใน g.  fจะต้องเป็น square และมีค่าบวก
0.                  0.2857143 -0.1428571  แน่นอน(square and positive definite)  การเตือนจะปรากฏขึ้นถ้าไม่ถูกต้อง
-0.1428571 -0.1428571   0.2857143      ตามงื่อนไข
-->f*g                                              คำตอบต้องเป็น identity matrix
-->det(f)                                           Determinant ของ f.
ans  =
      49
-->log(a)                                          เมทริกซ์ของ log ของแต่ละองค์ประกอบของ a.
           
การดำเนินการเมทริกซ์บางอย่างเช่นการคูณ เอ็กโพเนนเชียล สามารถดำเนนการตามลำดับ
องค์ประกอบเป็นหลัก
  
-->a .* b                                    คูณกันแต่ละองค์ประกอบ (Element by element multiplication)ans =
  30   36    42
  66    81    96
 102  126  150
-->a^2                                      ให้ผลเหมือนกันกับ a*a.
ans =
   30    36    42
   66    81    96
   102  126   150
-->a .^2                                     แต่ละองค์ประกอบยกกำลังสอง
ans =
   1     4     9
  16   25   36
  49   64   81

การบวกเมทริก และการลบเมทริกซ์ เป็นการดำเนินการตามองค์ประกอบ ส่วนการบวกและการลบตามองค์ประกอบจะให้ผลเป็นข้อผิดพลาด ดังเช่นa. + b                                        จะให้ข้อผิดพลาด  error
a. - b

มีฟังก์ชันที่อำนวยความสะดวกบางอย่าง เพื่อใช้ในเมทริกซ์ที่ใช้กันทั่วไป เล่น เมทริกซ์ศูนย์ (zero matrices) เมทริกซ์ไอเดนติตี (identity matrices) และอื่นๆ
-->a=zeros(5,8)                          สร้าง 5x8 matrix  ด้วยทุกองค์ประกอบเป็นศูนย์
-->b=ones(4,6)                          สร้าง 4x6 matrix ด้วยทุกองค์ประกอบเป็น 1
-->c=eye(3,3)                             สร้าง 3x3 identity matrix
-->d=eye(3,3)*10                       สร้าง 3x3 diagonal matrix
-->x = rand(3,5)                         สร้างเมทริกซ์ มี3แถว คอลัมน์ องค์ประกอบเมทริกซ์จากการสุ่ม
                                                   ตัวเลขมีค่า 
0 – 1
-->y = int(rand(3,5)*100);           สร้างเมทริกซ์ 3 แถว คอลัมน์องค์ประกอบเป็นเลขจำนวนเต็มสุ่ม
                                                    ระหว่าง  
และ 100

เป็นไปได้ที่จะหาขนาด(size) ความยาว (length) และชนิด(type) ของตัวแปรไซแลบ  เช่น
-->y=[1:5; 6:10;11:15];                size คืนกลับค่าจำนวนแถวและคอลัมน์-->size(y)                                  ในเมทริกซ์ y
ans =
     3.     5.
-->length(y)                               จำนวนองค์ประกอบใน y
ans =
      15
 
สร้างช่วงของตัวเลขที่ที่ทำเป็นเว็คเตอร์  ให้ศึกษาคำสั่งต่อไปนี้
-->a=[1:5]                                 สร้างเว็คเตอร์ มี องค์ประกอบดังนี้ [1, 2, 3, 4, 5]
-->b=[0:0.5:5]                           สร้างเวคเตอร์หนึ่งมี 11 องค์ประกอบดังนี้
                                                     
 [0, 0.5, 1.0,1.5, ... 4.5, 5.0]

 ช่วงที่ต้องการเริ่มจากค่าเริ่มต้น ค่าที่เพิ่ม และ ค่าสุดท้าย แยกด้วยโคลอน (:). ถ้ากำหนดเพียงสองค่า (ให้แยกด้วยเพียงโคลอนเดียว  ด้วยค่าเริ่มต้นและค่าสุดท้าย และคิดให้มีการเพิ่มค่าทีละ 1(a:b เป็นรูปแบบย่อของ a:1:b ซึ่ง a และ b เป็นสเกลล่า)   การเพิ่มจะเป็นค่าลบ หากค่าเริ่มต้นมากกว่าค่าท้าย
ช่วง(range) มีบทบาทสำคัญในการดำเนินการ sub-matrics จะเห็นได้ในในติวเตอเรียลต่อไป


ในการสร้างเมทริกซ์ว่างด้วยคำสั่ง  
-->a=[]
-->size(a)
ans =
     0      0
-->whos - name a
Name                     Type           Size           Bytes   

a                           constant        0x0            0       
ans                        constant       1x2             0     


แบบฝึกหัด 3  การสร้างเมทริกซ์ และการดำเนินการพื้นฐานเมทริกซ์บางอย่าง 

1. สามารถใช้ตัวดำเนินการ .+  เหมือนกับที่ใช้ตัวดำเนินการ .* หรือไม่ ? (Ans: ไม่ได้ จริงแล้วก็ไม่จำเป็นต้องใช้ แทนกัน ).
2. ขนาดของเมทริกซ์ว่างเป็นเท่่าใด  a = []? (Ans: Size 0 x 0)
3. ขณะที่สร้างช่วง สามารถที่จะกำหนดการเพิ่มช่วงแบบลบได้หรือไม่? (Ans: ได้ ถ้าค่าเริ่มต้นมากกว่าค่าท้าย)
4. ใช้คำสั่งใดในการสร้างค่า 0-2pi ที่การเพิ่มขึ้นทีละ p/16? (Ans: 0:%pi/16:2*%pi).
5. คำสั่งใดที่แยกองค์ประกอบทางแนวทะแยง ของเมทริกซ์จรุรัส ให้อยู่ในรูปของเว็คเตอร์? (Ans: a = diag(x) สร้างเวคเตอร์หนึ่งที่มีองค์ประกอบตามแนวทะแยงของเมทริกซ์ x ).
6. กำหนด square matrix a, แล้วสร้างเป็น matrix b ที่องค์ประกอบตามแนวทะแยงที่เหมือนกับใน เมทริกซ์ a แต่องค์ประกอบอื่นทั้งหมดเป็น 0 ? (Ans: b = eye(a) .* a).
7. ให้สกัดเทอม off-diagonal (ที่ offset of 1) ของเมทริกซ์จตุรัส(square matrix)ให้อยู่ในรูปเวคเตอร์
(Ans: b = diag(x, 1)  เพื่อที่จะสะกัดเทอมดังกล่าว ตามแนวทะแยงและ b = diag(x, -1)  เพื่อสะกัด เทอมด้านล่าง ตามแนวทะแยง b = diag(x) คือทางลัดสำหรับ b = diag(x, 0).  ค่าปริยาย offset เป็น zero
8. ให้สร้างเมทริกซ์ขนาด 5x5 ให้มีองค์ประกอบตามที่ต้องการตามแนวทะแยง,  ด้านบนแนวทะแยง และด้านล่างแนวทะแยง (Ans: b = diag([1:5])  สร้างเมทริกซ์ขนาด 5x5 ที่ซึ่งองค์ประกอบตามแนวทะแยงเป็นองค์ประกอบของเว็คเตอร์ [1 2 3 4 5]).
9. ให้สร้างเมทริกซ์ขนาด5x5 ให้มีองค์ประกอบที่ต้องการทางด้านบนของแนวทะแยงหลัก (Ans: b = diag([1:4], 1)  ให้สร้างเมทริกซ์ขนาด 5x5 ของจำนวนศูนย์ และนำองค์ประกอบของเว็คเตอร์ [1 2 3 4] ด้านบนแนวทะแยงหลัก  เพื่อวางเว็คเตอร์ตามด้านล่างของแนวทะแยงหลัก โดยใช้ b= diag([1:4], -1)).
10. ให้สร้างเมทริกซ์แบบ tri-diagonal ขนาด 5x5 ด้วยองค์ประกอบเฉพาะตามด้านบนและล่างตามแนวทะแยง(Ans: b = diag([1:5]) + diag([6:9], 1) + diag([10:13], -1) จะนำเว็คเตอร์ [1 2 3 4 5] บนแนวทะแยงหลัก, [6 7 8 9] อยู่บนแนวทะแยง ด้านบนของแนวทะแยงหลัก      


ไซแลบติวเตอร์เรียล 2 พื้นที่ทำงานและไดเร็คทอรีทำงาน 
(The Workspace and Working Directory)

            ขณะที่สิ่งแวดล้อมของ Scilab เป็นด้านที่มองเห็นได้ของ Scilab, ยังมีด้านอื่นที่ไม่สามารถที่มองเห็นได้ นั่นก็คือเนื้อที่ความจำที่ตัวแปรทั้งหมดและฟังก์ชันถูกเก็บไว้  และเรียกบริเวณนี้ว่าพื้นที่ทำงาน (Workspace) มีหลายครั้งที่จำเป็นต้องตรวจสอบเนื้อที่เก็บ เพื่อที่จะตรวจสอบดู่ว่าเป็นตัวแปรหนึ่ง หรือฟังก์ชันหนึ่งได้กำหนดไว้หรือไม่ คำสั่งต่อไปนี้ช่วยให้ผู้ใช้ตรวจสอบเนื้อที่ความจำ ได้แก่  who whos และ who_user() ให้ใช้ความช่วยเหลือออนไลน์เพื่อเรียนรู้มากขึ้นเกี่ยวกับคำสั่งเหล่านี้
            คำสั่ง who แสดงรายการชื่อของตัวแปรในบริเวณทำงาน Scilab   ให้สังเกตว่าชื่อตัวแปรที่นำหน้าด้วย “%”  มีตัวแปรเฉพาะหลายตัวที่ใช้เป็นประจำและดังนั้นได้กำหนดไว้ก่อนใน Scilab.   รวมทั้ง
%pi(π  ), %e ( ), %i (✓-1  ), %inf ( ∞ ), %nan (NaN)  และอื่นๆ

       คำสั่ง whos  แสดงรายการตัวแปร ตามด้วยจำนวนความจำที่ใช้ในบริเวณทำงาน  ตัวแปรที่แสดงรายการสามารถเลือกบนฐานชนิด หรือชื่อ  ดังบางตัวอย่างดังนี้
-->whos()                                 แสดงเนื้อหาทั้งหมดของพื้นที่ทำงาน รวมทั้งฟังก์ชัน ไลบรารี และตัวคงที่

-->whos -type constants          แสดงเฉพาะตัวแปรที่สามารถเก็บตัวคงที่จำนวนจริงและเชิงซ้อน ชนิดอื่น       เป็นบูลีน สตริง ฟังก์ชัน ไลบรารี โพลีโนเมียลและอื่นๆ  สำหรับรายการที่               สมบูรณ์ใช้คำสั่ง -->help typeof.

-->whos -name nam                แสดงรายการตัวแปรทั้งหมด ซึ่งชื่อขึ้นต้นด้วยตัวอักขระ nam
              
           เพื่อที่จะเข้าใจว่า Scilab จัดการอย่างไรกับตัวเลข  ให้ทดลองคำสั่งต่อไปนี้ และตามด้วยการใช้คำสั่ง whos  ดังต่อไปนี้
-->a1=5;                         กำหนดตัวแปรจำนวนจริงด้วยชื่อ 'a1'
-->a2=sqrt(-4)               กำหนดตัวแปรตัวเลขเชิงซ้อนด้วยชื่อ 'a2'
-->a3=[1, 2; 3, 4]           กำหนดเมทริกซ์  2x2  ด้วยชื่อ 'a3'
-->whos -name a           แสดงรายการตัวแปรที่ชื่อขึ้นต้นด้วยตัวอักษร 'a'

Name   Type                 Size     Bytes
a3         constant           2 by 2   48
a2         constant           1 by 1   32
a1         constant           1 by 1   24

ต่อไปให้ทดลองคำสั่งต่อไปนี้:
-->a1=sqrt(-9)               แปลง 'a1'ให้เป็นเลขเชิงซ้อน to a complex number
-->whos -name a           สังเกตว่าตอนนี้t 'a'เป็นตัวเลขเชิงซ้อน
-->a1=a3                        แปลง 'a1ไปเป็นเมทริกซ์
-->whos -name a           สังเกตว่า 'a' ตอนนี้เป็นเมทริกซ์
-->save('ex01.dat')        บันทึกตัวแปรทั้งหมดในพื้นที่ทำงานไปยังไฟล์ในดิสค์ชื่อ ex01.dat
-->load('ex01.dat')        โหลดหรือเรียกตัวแปรทุกตัวจากไฟล์ในดิสค์ex01.dat มายังพื้นที่ทำงาน
ให้สังเกตจุดสำคัญต่อไปนี้
 Scilab จัดให้ตัวเลขสเกลล่าเป็เมทริกซ์ขนาด 1x1 (และไม่เป็นเหมือนตัวเลขธรรมดา)
เพราะว่าชนิดข้อมูลพื้นฐานใน Scilab เป็นเมทริกซ์อย่างหนึ่ง
 Scilab แปลงชนิดของตัวแปรโดยอัตโนมัติตามความต้องการตามสถานะการณ์  จึงไม่จำเป็นต้องมีการกำหนดชนิดของตัวแปร
แบบฝึกหัด 2  พื้นที่ทำงานและไดเร็คทอรีทำงาน                                                                                       
1. ชนิดข้อมูลที่ใช้ได้ในไซน์แลบมีอะไรบ้าง ?
 (ตอบให้พิมพ์คำสั่ง help type ก็จะแสดงรายการชนิดข้อมูลที่มีใช้)2. คำสั่งอะไรที่แสดงรายการตัวแปรทั้งหมดที่มีอยู่ในพื้นที่ทำงานไซแลบที่ขึ้นต้นด้วยอักขระ”sa”?
(ตอบ: whos –name sa)
3. ใช้คำสั่งใดแสดงรายการตัวแปรทั้งหมดในพื้นที่ทำงานไซแลบที่มีชนิดข้อมูลเป็นบูลีน
(ตอบ
: whos –type Boolean)
4. ตัวคงที่ piในไซแลบหาค่าได้อย่างไร ?
(ตอบ 
%pi)
5. คำสั่งใดที่ใช้หาว่าไดเรคทอรีทำงานล่าสุดเป็นอะไรอยู่ที่ไหน?
(ตอบ
: pwd )
6. ที่ใดที่สามารถหาไดเรคทอรีทำงานปัจจุบันล่าสุดได้?
(ตอบ
จากไฟล์เมนู  disp Current Directory)
7. เปลี่ยนไดเรคทอรีทำงานปัจจุบัน/ล่าสุดไปเป็นตำแหน่งที่แตกต่างออกไปได้อย่างไร?
(ตอบ: cd (“chane directory”) หรือไปที่เมนูไฟล์  Change Directory และเลือกไดเรคทอรีที่จะไป ในไดอะล็อกบ็อก)8. ทำไมจึงเป็นเรื่องสำคัญการที่รู้ไดเร็คทอรีทำงานปัจจุบันล่าสุด?
(ตอบ เพราะว่าเป็นตำแหน่งโดยปริยายที่ไซแลบบันทึกไฟล์ทั้งหมดไว้ นอกจากว่าได้ระบุตำแหน่งเส้นทางเต็มในการเข้าถึงไว้อย่างชัดเจน)9. ไซแลบเป็นภาษาที่เน้นการใช้ชนิดข้อมูลหรือไม่
(ตอบ สำหรับภาษาที่เน้นชนิดข้อมูลนั้น แต่ละตัวแปรและชนิดข้อมูลของตัวแปรจะต้องกำหนดก่อนเป็นสิ่งแรก ก่อนที่จะนำไปใช้  ยิ่งกว่านั้น ทันทีที่กำหนดชนิดแล้วมักจะไม่สามารถเปลี่ยนชนิด  ให้ดูในวิกิพีเดียสำหรับนิยามของ การเน้นชนิดข้อมูล (
strongly Typed)  เหมือนกับที่ได้เขียนไว้ หรือไม่ และอะไรคือ static typing และ type safety?)


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

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