44
MATLAB PRIMER ภาษาไทย ไกรกร เศรษฐไกรกุล Motion Control Laboratory Clarkson University, Potsdam NY USA

MATLABPrimeThaiR1

  • Upload
    natkth

  • View
    25

  • Download
    15

Embed Size (px)

Citation preview

Page 1: MATLABPrimeThaiR1

MATLAB PRIMER ภาษาไทย

ไกรกร เศรษฐไกรกุล

Motion Control Laboratory Clarkson University, Potsdam NY USA

Page 2: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

ii

สารบัญ สารบัญ ........................................................................................................................................ii1. บทนํา ......................................................................................................................................1

1.1 เร่ิมใช MATLAB .................................................................................................................21.2 วิธีการอานคูมือ ....................................................................................................................2

2. การใชงานเบ้ืองตน........................................................................................................................32.1 คําสั่งพ้ืนฐาน.......................................................................................................................32.2 เวกเตอร และเมตริกซ )Vector and Matrix) ...................................................................................62.3 ฟงกชั่นภายใน ) Built-in functions) .........................................................................................122.4 การวาดกราฟ )Plotting )......................................................................................................22

3. การเขียนโปรแกรมใน MATLAB .....................................................................................................273.1 M-files: สคริปท และ ฟงกชั่น ) script and function).....................................................................273.2 Loops ..........................................................................................................................293.3 การใชคําสั่ง If ...................................................................................................................33

4 หัวขอเพ่ิมเติม............................................................................................................................384.1 MATLAB กับ โพลิโนเมียล.....................................................................................................38

5. ทายเลม..................................................................................................................................41

Page 3: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

1

1. บทนาํ

MATLAB มาจากคํายอ คือ MATrix LABoratory เปนโปรแกรมสําหรับชวยงานคํานวณทาง

คณิตศาสตรที่มีช่ือเสียงมากในปจจุบัน และเปนท่ีนิยมสูงสุดในทางการศีกษา และอุตสาหกรรม.

MATLAB ทํางานในลักษณะการตอบสนองผูใช (Interactive) สําหรับ การคํานวณเชงิตัวเลข

(numerical computation) และ การแสดงผลขอมูล (data visualization) รวมทั้งมีความ สามารถใน

การจัดรูปคําส่ังในลักษณะการเขียนเปนโปรแกรมเพ่ือใชงานตางๆทั้งงานทางวิทยาศาสตร และ

วิศวกรรม. ขอแตกตางอยางชัดเจนของ MATLAB กับ โปรแกรมสําหรับชวยงานคํานวณทาง

คณิตศาสตรอื่นๆ เชน MAPLE หรือ Mathematica คือ MATLAB ไมมีความสามารถในการคํานวณเชิง

ตัวแปร (symbolic computation) แตขอจํากัดนี้ไดรับการแกไขเม่ือมีการใช MATLAB ควบคูไปกับ

Symbolic toolbox.

MATLAB มีโครงสรางการทํางานตามลักษณะชื่อ คือ เมตริกซ (matrix). จํานวนโดดๆ หรือ scalar ถูก

เรียกไดวา เมตริกซ ขนาด 1x1. เวกเตอรชนิดแถว (row vector) มีสมาชิก 5 จาํนวน ก็คือ เมตริกซ

ขนาด 1x5 นั่นเอง. ดวยโครงสรางอันชาญฉลาด ทําให MATLAB กาวข้ึนสูแนวหนาของความนิยม

สําหรับผูใชงานดานการคํานวณ เพราะลักษณะที่ใกลเคียงกับการใชเคร่ืองหมาย (notation) ใน

คณิตศาสตรทั่วไป.

เปาหมายหลักของคูมือน้ี สําหรับเปนจุดเร่ิมตนของผูสนใจจะใชงาน MATLAB เบ้ืองตน ใหเขาใจ การ

ทํางานพ้ืนฐาน, ขอเดน, และ คําส่ังเบ้ืองตน เพ่ือเปนแนวทางในการศีกษาการใชงานอยางละเอียด

ตอไป

Page 4: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

2

1.1 เร่ิมใช MATLAB

เนื่องจากคูมือนี้มีจุดประสงคในการแนะนําการใชงาน MATLAB เบ้ืองตัน ไมใชแนะนําการใชงาน

คอมพิวเตอร ดังนั้นผูอานตองศีกษาวิธีการเรียกใชโปรแกรมดวยตนเอง ไมวาจะเปนการใชงานบน PC,

MAC, หรือ UNIX ก็ตาม จุดเร่ิมตนการใชงาน MATLAB รวมกับคูมือน้ีคือ เม่ือผูอานอยูที่หนาจอแรก

เรียกวา Command Window และ มีเคร่ืองหมายรอรับคําส่ัง (prompt) เปนสัญญลักษณ (>>)

1.2 วิธีการอานคูมือ

ในบทตอๆไป จะแสดงตัวอยางตางๆในการปอนขอมูล และแสดงผลทีไ่ดรับ. ดังนั้น จึงตองมีการตกลง

วิธีการไวตรงจุดน้ีกอน. คูมือนี้ถูกเขียนขึ้นมาโดยใช Tool ของ MATLAB เรียกวา Notebook Toolbox.

บรรทัดท่ีผูอานตองปอขอมูลจะเร่ิมตนดวยเคร่ืองหมาย prompt (>>) และ จบบรรทัดดวยการกดปุม

<Enter>

ตัวอยาง เชน เม่ือ ตองการให MATLAB คํานวณผลบวกของเลข 2 จํานวน ในคูมือจะแสดงผลดังน้ี

>> 5+4

ans =

9

ผูอานควรทดลองปอนคําส่ังตางๆ ตามตัวอยาง และ สังเกตผลที่เกิดขึ้นใหเขาใจการทาํงานของคําส่ัง

ตางๆ

Page 5: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

3

2. การใชงานเบ้ืองตน

2.1 คําส่ังพ้ืนฐาน

ทดลองสราง row vector ที่มีสมาชิกประกอบดวย 1,2,3,4,5 และ กําหนดคาใหตัวแปร x >> x = [ 1 2 3 4 5 ]

x =1 2 3 4 5

เราใชเคร่ืองหมาย เทากับ (=) สําหรับ กําหนดคาจากทางดานขวามือไปท่ีตัวแปรทางซายมือ เปนชนิด เวกเตอร โดยใช เคร่ืองหมาย bracket ( [ ] ) . ภายใน bracket ระบุสมาชิก 5 จํานวน แบงแยก

ออกจากกันดวยเคร่ืองหมาย ชองวาง (space) หรือ อาจจะใชเคร่ืองหมาย comma ( , ) เขนเดยีวกับ ในคณิตศาสตรทัว่ไป หรือ ใชผสมกันก็ได เวกเตอรอีกลักษณะหน่ึงคือ column vector จะถูกสรางในลักษณะเดียวกัน แต เคร่ืองหมายทีจ่ะแยกสมาชิกออกจากกันจะเปล่ียนไปใชเคร่ืองหมาย semicolon ( ; ) แทน หรือ ทาํการสราง row vector กอน แลวทําการ transpose ดวยเคร่ืองหมาย ( ' ) ก็จะใหผลลัพธเชนเดียวกัน ลองพิจารณาวิธีตางๆในการสราง column vector ดังน้ี >> y = [6;7;8;9;10]

y =6789

10

>> y = [6 7 8,9,10]

y =6 7 8 9 10

>> y'

ans =67

Page 6: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

4

89

10

ตัวอยางแรกเปนการสราง column vector โดยตรงตามที่ไดกลาวไวขางตน ตัวอยางถัดมา เปนการสราง row vector กอน แลวจีงทาํการ transpose ใหเปน column vector ซึ่งเปนการกระทํา 2 คร้ัง ในการสราง row vector ครั้งแรก เห็นไดวา MATLAB ทําการแสดงผลการปอนขอมูลกลับมาอีกคร้ัง ซึง่บางคร้ังไมใชผลที่ตองการด ูเราสามารถยบัยั้งการแสดงผลนี้ไดโดยการใสเคร่ืองหมาย semicolon ( ; ) ไวที่ทายคาํส่ังกอนกดปุม <Enter> MATLAB สามารถกําหนดตัวแปรใหมหรือ เปล่ียนรูปแบบของตัวแปรท่ีมีอยูแลว ( scalar, เวกเตอร, หรือ เมตริกซ) ไดเม่ือใชเคร่ืองหมาย เทากับ ( = ) ถาไมมีการกําหนดใดๆในคาํส่ัง MATLAB จะเลือกใชตัวแปรชื่อ ans โดยอตัโนมัติ. จากตัวอยางขางบน y ถูกกําหนดใหเปนตวัแปรชนิด column vector และ y ถูกกาํหนดซ้ําใหเปนตัวแปรชนดิ row vector และ คาํส่ังสุดทายคือ การทํา transpose ของ y โดยไมมีการกําหนดตัวแปรใดๆ ผลจากการกําหนดตัวแปรใหมไดเร่ือยๆ อาจนํามาซึง่ความผิดพลาดของผูใชเอง ดังนั้น วิธีการตรวจสอบคาและชนิดของตวัแปร เปนสวนชวยเหลือเปนอยางมาก คาํส่ัง whos ใชสําหรับงานน้ี >> whos

Name Size Bytes Class

ans 5x1 40 double arrayx 1x5 40 double arrayy 1x5 40 double array

Grand total is 15 elements using 120 bytes

นอกจากนี้ คําส่ังคลายๆกัน คือ who จะใชสําหรับดูชื่อตวัแปรที่มีการสรางขึ้นมาแลว >> who

Your variables are:

ans x y

การลบตัวแปรออกจากหนวยความจํา ทําไดโดยใชคําส่ัง clear <variable_name> ตัวอยางเชน ตองการลบตัวแปรชื่อ ans ออกจากหนวยความจํา ทําได ดังนี ้>> clear ans >> who

Page 7: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

5

Your variables are:

x y

คําส่ัง clear โดยไมมีชื่อตัวแปรตามหลัง จะทาํการลบตัวแปรทุกตวัออกจากหนวยความจาํ และไมสามารถนํากลับคืนมาไดอีก ดังน้ัน จงีตองระวังในการใชคาํส่ังน้ี เม่ือทําการออกจาก MATLAB โดยใชคาํส่ัง quit. ตัวแปรตางๆจะถูกลบออกจากหนวยความจําเชนกัน ถาตองการเก็บตัวแปร และคาของตัวแปร เพื่อนาํมาใชใหมในอนาคต ทําไดโดยการใชคําส่ัง save <filename> คําส่ังนี้จะทําการเก็บคาตัวแปรไปไวในแฟมขอมูลชื่อ <filename>.mat เม่ือกลับเขามาใช MATLAB คร้ังตอไป สามารถเรียกส่ิงทีเ่ก็บไวกับมาโดยใช คําส่ัง load <filename>. { <filename> คือ ช่ือแฟมขอมูลที่ผูใชต้ังขี้น เชน mywork เปนตน } คําส่ังท่ีจะแนะนําเปนคําส่ังสุดทายในสวนนี ้คือ คาํส่ัง help เปนคําส่ังที่มีประโยชนสูงสุดในการเรียนรู MATLAB. คําส่ัง help มีวิธีใชหลายรูปแบบ เชน help, help <toolbox>, help <command> เปนตน แตละวิธจีะแสดงรายละเอียดตางๆกันออกไป ตัวอยาง การใช help เพ่ือดูรายละเอยีดของคําส่ัง who >> help who

WHO List current variables.WHO lists the variables in the current workspace.WHOS lists more information about each variable.WHO GLOBAL and WHOS GLOBAL list the variables in the

global workspace.WHO -FILE FILENAME lists the variables in the specified

.MAT file.

WHO ... VAR1 VAR2 restricts the display to the variablesspecified.

The wildcard character '*' can be used to displayvariables that

match a pattern. For instance, WHO A* finds all variablesin the

current workspace that start with A.

Use the functional form of WHO, such as WHO('-file',FILE,V1,V2),

when the filename or variable names are stored in strings.

S = WHO(...) returns a cell array containing the names ofthe

variables in the workspace or file. You must use thefunctional

Page 8: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

6

form of WHO when there is an output argument.

See also WHOS.

2.2 เวกเตอร และเมตริกซ (Vector and Matrix)

ในสวนท่ีแลวไดแสดงการสรางเวกเตอร และการกําหนดตัวแปร โดยสวนใหญ การสรางเวกเตอร และเมตริกซ จะประกอบดวยสมาชิกที่มีคาตอเนื่องกันไป แทนที่จะตองปอนขอมูลของสมาชิกทุกตวั MATLAB มีวิธีลัดในการทาํเชนน้ันใหสะดวกขึ้น โดยการใชคําส่ัง colon ( : ) ตัวอยางการสราง row vector u ท่ีประกอบดวยสมาชิก คือ 0,1,2,3,4,5,6,7,8 >> u = [0:8]

u =0 1 2 3 4 5 6 7 8

คําส่ังน้ีประกอบดวยการสราง row vector เร่ิมตนจาก 0 ถงึ 8 โดยเพ่ิมคาทีละ 1 ( คาปกติ หรือ defaults เม่ือไมมีการระบุในคําส่ัง ) ตัวอยางการสราง row vector v ที่ประกอบดวยสมาชกิ คือ 0,2,4,6,8 >> v = [0:2:8]

v =0 2 4 6 8

ตัวอยางน้ีแสดงการกําหนดระดับของการเพิ่มคาขี้นมาจาก 0 ถึง 8 โดยเพ่ิมคร้ังละ 2 ในการอางอิงคาที่ตําแหนงตางๆของเวกเตอร จะใชตัวชี ้(Index) โดยเร่ิมตนจากตวัแรกคือ 1. เชน ตัวแปร v ชนิดเวกเตอร มีสมาชิก 5 ตวั. เราขอดูคาสมาชกิตัวที่ 1 ไดโดยใชเคร่ืองหมายวงเล็บและตัวเลขขางใน เปนตัวกาํหนดตวัช้ี ดงัน้ี >> v(1)

ans =0

หรือ ใชคําส่ัง colon ( : ) เพื่อดูมากกวา 1 ตาํแหนง เชน ขอดูสมาชิก 2 ตวัแรก >> v(1:3)

ans =0 2 4

Page 9: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

7

หรือ ขอดูสมาชกิ 2 ตําแหนง คือ v(1) และ v(3) >> v(1:2:4)

ans =0 4

สําหรับเมตริกซ ใชหลักการเดียวกับการสรางเวกเตอร โดยการมองเมตริกซ ประกอบไปดวยหลายๆ row vector มาประกอบกัน หรือ หลายๆ column vector มาประกอบกัน กไ็ด ตัวอยาง การสรางเมตริกซ A ขนาด 3x3 >> A = [ 1 2 3 ; 3 4 5 ; 6 7 8 ]

A =1 2 33 4 56 7 8

อีกวิธใีนการสรางเมตริกซโดยการปอนขอมูลตามตําแหนงที่มองเห็นโดยตรง และหลีกเล่ียงการพิมพเคร่ืองหมาย semicolon ( ; ) ซ้ําๆ ทําไดดังน้ี >> A = [

1 2 33 4 56 7 8]

A =1 2 33 4 56 7 8

การอางอิงคาที่ตาํแหนงตางๆของเมตริกซทาํไดดวยวธิีเดยีวกันกบัเวคเตอร คือใชตวัแปรตามดวยเคร่ืองหมายวงเล็บและมีตัวชี้อยูภายใน ตัวชี้ของเมตริกซมีสองวิธ ีแตจะขอแนะนําวิธีทีใ่ชเหมือนกับ คณิตศาสตรทั่วไปคือ การอางอิงตาม row และ column. ตัวอยางการอางคาสมาชิกของเมตริกซ A ที่อยู แถวที ่2 คอลัมนที่ 3 มีคาคือ 5 >> A(2,3)

ans =5

ตัวอยางการอางคาสมาชิกของเมตริกซ A ที่อยู แถวที่ 3 คอลัมนที่ 2 มีคาคือ

Page 10: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

8

>> A(3,2)

ans =7

การอางอิงขอมูลโดยใชตวัชี้ท่ีไมถูกตองจะไดผลดังนี ้>> A(4,1)

??? Index exceeds matrix dimensions.

เน่ืองจาก A เปนตัวแปรชนดิเมตริกซท่ีมีขนาด 3x3 ดังนั้นจึงไมสามารถหาคาจากแถวท่ี 4 คอลัมนท่ี 1 ได ขอความแสดงความผิดพลาดจะชี้ใหเห็นสาเหตุของความผิดพลาดได จึงควรใหความสนใจเพื่อชวยในการแกปญหาใหเร็วข้ึน เมตริกซยอย (submatrix) สรางมาจากเมตริกซโดยใชคําส่ัง colon ( : ) ตัวอยาง สรางเมตริกซยอยขนาด 2x2 จาก เมตริกซ A (ขนาด 3x3) >> A(1:2,2:3)

ans =2 34 5

คําส่ัง colon ( : ) โดยไมมีการกาํหนดคาเร่ิมตน และ คาสุดทาย ยงัใชแสดงการอางอิงคาทัง้หมดใน row หรือ คาทั้งหมดใน column ได ตวัอยาง การอางอิงสมาชิกท้ังหมดในคอลัมนที่ 2 ของเมตริกซ A >> A(:,2)

ans =247

หรือ ตัวอยาง การอางองิสมาชิกทั้งหมดในแถวที่ 3 ของเมตริกซ A >> A(3,:)

ans =6 7 8

ตัวอยางตอไปจะเปนการสรางเมตริกซ B และ เวกเตอร s และ เวกเตอร t เพ่ือใชในตัวอยางอื่นๆ ในการแสดงวิธีการคาํนวณของเวกเตอร และเมตริกซ

Page 11: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

9

>> B = [

-1 3 10-9 5 250 14 2]

B =-1 3 10-9 5 250 14 2

>> s = [ -1 8 5 ]

s =-1 8 5

>> t = [7 ; 0 ; 11]

t =70

11 ดังที่กลาวไว ขอเดนของ MATLAB คือ ทําการคํานวณเวกเตอร และเมตริกซ ในลักษณะเดียวกับคณิตศาสตรทั่วๆไป ตัวอยาง การหักคาออกจากทุกสมาชิกในเมตริกซ A ดวย 1 >> A-1

ans =0 1 22 3 45 6 7

หรือ การบวก (หรือการลบ) ระหวางเมตริกซ (ตามกฎ ตองมีขนาดเทากัน) >> A+B

ans =0 5 13

-6 9 306 21 10

หรือ การบวก (หรือการลบ) ระหวางเวกเตอร >> s-t

??? Error using ==> -

Page 12: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

10

Matrix dimensions must agree.

Oops, we did it again. ขอความแสดงการผิดพลาดบอกถงึการพยายามลบเวกเตอรสองจาํนวนที่มีขนาดไมเทากัน คือ s ท่ีมีขนาด 1x3 และ t ที่มีขนาด 3x1. การบวก เวกเตอรทั้ง 2 สามารถทําไดโดยทําการ transpose ( ' ) เวกเตอรตัวใดตวัหน่ึงกอน >> s - t'

ans =-8 8 -6

ในการคูณก็เชนเดียวกัน ตองเปนไปตามกฎทางคณิตศาสตร >> B*x

??? Error using ==> *Inner matrix dimensions must agree.

>> B*t

ans =10321222

สําหรับการหารเวกเตอร และเมตริกซ มีเงื่อนไขดังน้ี ให M คือ square เมตริกซ ที่สามารถหา inverse ได ( Invertible matrix) และ b คือ เวกเตอรที่มีขนาดสัมพันธกับ M x = M\b มาจากสมการ Mx = b x = b/M มาจากสมการ xM = b ตัวอยาง การหารเวกเตอร และเมตริกซ โดยให M คือ B และ b คือ t >> x = B\t

x =2.43070.68010.7390

Page 13: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

11

x คือ ผลลัพธของสมการ Bx = t ทดลองคูณ x กลับเขาไปในสมการจะไดเทากับ t นั่นเอง >> B*x

ans =70

11

คา x เปนเลขทศนิยม ซึ่งโดยปกติ MATLAB จะแสดงผลแค 4 ตําแหนง เวนเสียแตวามีการใชคําส่ังเปล่ียนแปลงการแสดงผลเชน คําส่ัง format long >> format long >> x

x =2.430715935334870.680138568129330.73903002309469

ในหลายๆคร้ัง เม่ือตองการทาํการคํานวณตางๆ สําหรับสมาชิกแตละตัวในเวกเตอร หรือเมตริกซ. MATLAB จะยอมใหใชวิธีทีเ่รียกวา "element-wise" operations. ตัวอยางเชน ตองการคูณสมาชิกแตละตัวในเวกเตอร s กับตัวมันเอง หรือ แสดงอยูในลักษณะเชนนี้

2 [ (1) * (1), (2) * (2), (3) * (3)]s s s s s s s= คําส่ัง s*s ไมสามารถทําได เนื่องจากผิดกฎการคูณของเวกเตอร และเมตริกซ. วิธีที่จะทาํไดคือตอง

บอก MATLAB ใหทําโดยใชการคูณแบบ "element-wise" โดยใฃเคร่ืองหมาย " .* " แทนการใช " * " โดยทัว่ไปการใชเคร่ืองหมายจุด " . " นําหนาเคร่ืองหมายในการคํานวณอื่นๆ (operators) หมายถึง การคาํนวณแบบ "element-wise" ของเคร่ืองหมายนั้นๆ >> s*s

??? Error using ==> *Inner matrix dimensions must agree.

>> s.*s

ans =1 64 25

Page 14: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

12

เคร่ืองหมาย " .^ " คือ การยกกําลังของสมาชกิแตละตัว >> s.^2

ans =1 64 25

Operators ใน MATLAB ไดแก

+ - * / \ ' ^ แบบฝกหัดทายบท สรางเวกเตอร และเมตริกซ เหลาน้ี แลวทดลองทําแบบฝกหดั

2 9 0 0

0 4 1 4

7 5 5 1

7 8 7 4

A

=

,

1

6

0

9

b

− =

, [ ]3 2 4 5a = − −

1. คํานวณผลเหลานี้

a) b) 4 c) d) e)T TA b a b a a b A a⋅ + ⋅ ⋅ ⋅

2. อธิบายความแตกตางระหวางผลลัพธของ A*A, A^2, และ A.^2

3. สรางเมตริกซยอยที่ประกอบดวย แถวที่ 2 และ แถวที ่3 ของเมตริกซ A

4. แกสมการเชิงเสน Ax = b สําหรับ x. ตรวจคาํตอบดวยการคูณกลับเขาไปในสมการ

2.3 ฟงกช่ันภายใน ( Built-in functions)

MATLAB มีฟงกชั่น และคําส่ังใหใชเปนจาํนวนมาก ในคูมือนี้จะแนะนําเพียงบางสวนท่ีใชเปนประจํา โดยแยกออกตามประเภท ฟงกชั่นสําหรับ Scalar

Page 15: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

13

ฟงกชั่นของ MATLAB สวนนมากจะทํางานกับตวัแปรแบบ scalar แตยังคงใชงานกับตวัแปรแบบเวกเตอรไดโดยใชวิธ ี"element-wise." ตัวอยางฟงกชั่นบางสวนไดแก sin ฟงกชั่นตรีโกณมิติ sine cos ฟงกชั่นตรีโกณมิติ cosine tan ฟงกชั่นตรีโกณมิติ tangent asin ฟงกชั่นตรีโกณมิติ inverse sine acos ฟงกชั่นตรีโกณมิติ inverse cosine atan ฟงกชั่นตรีโกณมิติ inverse tangent exp ฟงกชั่น exponential log ฟงกชั่น natural logarithm abs ฟงกชั่น absolute value sqrt ฟงกชั่น ถอดรากท่ี 2 rem ฟงกชั่น หาเศษจากการหาร ( remainder ) round ฟงกชั่น ปดเขาหาจํานวนเต็ม floor ฟงกชั่น ปดเขาหาจํานวนเต็มทางดานลบอินฟนิตี้ (ปดลง) ceil ฟงกชั่น ปดเขาหาจํานวนเต็มทางดานบวกอินฟนิตี้ (ปดขึ้น) รายละเอียด และวิธีการใชฟงกช่ันตางๆ ใหใชคําส่ัง help <function> ฟงกชั่นตรีโกณมิติจะใชคาในการคํานวณแบบ radian. ดังน้ัน MATLAB มีตัวแปรพิเศษใหใชคือ pi โดยมีคา 3.1415...π = >> sin(pi/2) ans =

1

>> cos(pi/2)

ans =6.1232e-017

Page 16: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

14

คา sine ของ / 2π คือ 1 และ คา cosine ของ / 2π คือ 0. เนื่องจาก MATLAB ทํางานแบบเชงิตัวเลข หรือ Nummerical คาที่ไดจีงออกมาในลักษณะใกลเคียงอยางมาก

176.1230 017 6.1230 10 0e −− = × ≈ ฟงกชั่น exp และ log น้ันใชไดตามปกติ ตัวอยางการใชฟงกชั่น rem, เปนการหาเศษที่เหลือจากการหาร, เศษจากการหาร 12 ดวย 4 คือ 0 >> rem(12,4)

ans =0

หรือ เศษจากการหาร 12 ดวย 5 คือ 2 >>rem(12,5)

ans =2

ฟงกชั่น floor, ceil และ round ใหสังเกตจากตัวอยางขางลางนี ้>> floor(1.4) ans =

1

>> ceil(1.4)

ans =2

>> round(1.4)

ans =1

อยางที่กลาวไวตอนตน ฟงกช่ันตางๆ สามารถทํางานแบบ "element-wise" สําหรับตัวแปรแบบเวกเตอร ตัวอยาง [ ]0 0.1 0.2 ... 0.9 1x = ให exp( )y x= จะสรางตัวแปร y เปนแบบเวกเตอรตัวใหม ที่มีสมาชิกเทากับ x และได 0 0.1 0.2 0.9 1...y e e e e e = >> x=[0:0.1:1]

Page 17: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

15

x =0 0.1000 0.2000 0.3000 0.4000 0.5000

0.6000 0.7000 0.8000 0.9000 1.0000

>> y=exp(x) y =

1.0000 1.1052 1.2214 1.3499 1.4918 1.64871.8221 2.0138 2.2255 2.4596 2.7183

ฟงกชั่นสําหรับ Vector ฟงกชั่นบางอยางจะรับขอมูลแบบเวกเตอร และใหผลลัพธเปนแบบ scalar. เชน max ฟงกชั่น หาคาสูงสุดของสมาชิก min ฟงกชั่น หาคาตํ่าสุดของสมาชิก length ฟงกชั่น หาขนาดของเวกเตอร sort ฟงกชั่น จัดเรียงสมาชิก(จากนอยไปมาก) sum ฟงกชั่น หาผลรวมของสมาชิกทั้งหมด prod ฟงกชั่น หาผลคูณของสมาชิกทั้งหมด median ฟงกชั่น หาคา median mean ฟงกชั่น หาคา เฉล่ีย (mean ) std ฟงกชั่น หาคา เบี่ยนเบนมาตรฐาน (standard deviation) เชนเดิม รายละเอียด และวิธีการใชฟงกช่ันตางๆ ใหใชคาํส่ัง help <function> ลองดูตัวอยาง การใชงานตอไปนี ้>> z = [ 0.9347, 0.3835, 0.5194, 0.8310 ] z =

0.9347 0.3835 0.5194 0.8310

>> max(z)

ans =0.9347

>> min(z)

ans =0.3835

Page 18: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

16

>> sort(z)

ans =0.3835 0.5194 0.8310 0.9347

>> sum(z)

ans =2.6686

>> mean(z)

ans =0.6672

ฟงกชั่นเหลานี้สามารถใชกับเมตริกซไดเชนกัน แตผลลัพธท่ีออกมาจะเปนลักษณะผลที่เกิดจากการกระทําของขอมูลในแตละคอลัมน ลองสังเกตจากตัวอยาง ตอไปน้ี >> M = [

0.7012, 0.2625, 0.32820.9103, 0.0475, 0.63260.7622, 0.7361, 0.7564 ] M =

0.7012 0.2625 0.32820.9103 0.0475 0.63260.7622 0.7361 0.7564

>> max(M)

ans =0.9103 0.7361 0.7564

ถาตองการหาคําตอบของคาสมาชิกสูงสุดในเมตริกซ M ทําไดโดยใชฟงกช่ัน max อีกคร้ังกับ คําตอบที่แลว >> max(ans)

ans =0.9103

หรือ ทําการรวบสองคําส่ังมาใชในคร้ังเดียว ดงันี้ >> max(max(M))

Page 19: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

17

ans =0.9103

ฟงกชั่นสําหรับ Matrix MATLAB ทํางานไดดี และเร็วมากสําหรับเมตริกซ ฟงกชั่นท่ีใชในสวนนี้มี 2 ประเภท คือ กลุมฟงกชัน่สําหรับสรางเมตริกซ เชน eye ฟงกชั่นสราง identity matrix zeros ฟงกชั่นสราง zeros matrix ones ฟงกชั่นสราง ones matrix diag ฟงกชั่นสราง diagonal matrix หรือ ดีงเฉพาะแถวแทยงออกมาจากเมตริกซอื่น triu ฟงกชั่นดงี สวน upper triangular ออกมาจากเมตริกซอื่น tril ฟงกชั่นดงี สวน lower triangular ออกมาจากเมตริกซอ่ืน rand ฟงกชั่นสุมสราง matrix อยาลืมใช help <function> เพื่อดูการใชงาน ตัวอยางการสราง identity matrix ขนาด 4x4 ใชฟงกชั่น eye >> eye(4,4)

ans =1 0 0 00 1 0 00 0 1 00 0 0 1

ฟงกชั่น eye ใชสราง identity matrix ขนาด MxN ตามแตจะระบุ ถาตองการสราง square matrix สามารถใสคาเดียว คือ eye(4) จะไดผลเหมือนตัวอยางขางบน เชนเดียวกันกับฟงกชั่น zeros สําหรับสรางเมตริกซที่มีสมาชิกท้ังหมดคือ 0 และ ฟงกชั่น ones สําหรับสรางเมตริกซท่ีมีสมาชิกทั้งหมดคือ 1. >> zeros(2,3)

ans =0 0 00 0 0

>> ones(2)

Page 20: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

18

ans =1 11 1

นอกจากนี้ ฟงกชั่น rand ยังใชสําหรับสรางเมตริกซที่มีการสุมคาของสมาชิกทั้งหมด ( ชนิด Uniform โดยคาอยูระหวาง 0 กับ 1 ) >> C = rand(5,4)

C =0.8381 0.5028 0.1934 0.69790.0196 0.7095 0.6822 0.37840.6813 0.4289 0.3028 0.86000.3795 0.3046 0.5417 0.85370.8318 0.1897 0.1509 0.5936

ฟงกชั่น triu และ tril จะดีงสวน upper และ lower ของเมตริกซออกมา >> triu(C)

ans =0.8381 0.5028 0.1934 0.6979

0 0.7095 0.6822 0.37840 0 0.3028 0.86000 0 0 0.85370 0 0 0

>> tril(C)

ans =0.8381 0 0 00.0196 0.7095 0 00.6813 0.4289 0.3028 00.3795 0.3046 0.5417 0.85370.8318 0.1897 0.1509 0.5936

ฟงกชั่น diag มีวิธีการใชอยู 2 แบบ อยางแรก จะดงีคาของแถวในแนว main diagonal ออกจากเมตริกซ ตัวอยางเชน D คือ เมตริกซ ฟงกชั่น diag(D) จะสรางเวกเตอร ที่ประกอบดวยสมาชิกในแนว main diagonal. >> D = [

0.0579 0.2028 0.01530.3529 0.1987 0.74680.8132 0.6038 0.4451 ]

Page 21: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

19

D =0.0579 0.2028 0.01530.3529 0.1987 0.74680.8132 0.6038 0.4451

>> diag(D)

ans =

0.0579

0.1987

0.4451

อยางที่ 2 ตือ การสราง diagonal matrix.

>> diag([ 0.0579;0.1987;0.4451 ])

ans =0.0579 0 0

0 0.1987 00 0 0.4451

ฟงกชั่น diag ยังใชกับ แถวในแนวทแยงอื่นๆไดดวย ลองอานไดจาก help diag. ฟงกชั่นกลุมท่ีสอง ไดแก size ฟงกชั่น หาขนาดของเมตริกซ det ฟงกชั่น หา determinant ของเมตริกซ inv ฟงกชั่น หา inverse ของเมตริกซ rank ฟงกชั่น หา rank ของเมตริกซ rref ฟงกชั่น หา reduced row echelon ของเมตริกซ eig ฟงกชั่น หา eigenvalues และ eigenvectors ของเมตริกซ poly ฟงกชั่น หา characteristics polynomial ของเมตริกซ norm ฟงกชั่น หา norm ของเมตริกซ ( 1-norm, 2-norm, ∞ -norm ) cond ฟงกชั่น หา condition number ของเมตริกซ ( 2-norm ) lu ฟงกชั่น หา LU factorization ของเมตริกซ qr ฟงกชั่น หา QR factoriazation ของเมตริกซ

Page 22: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

20

chol ฟงกชั่น หา Cholesky decomposition ของเมตริกซ svd ฟงกชั่น หา Single value dexomposition ของเมตริกซ การใช help จะเปนวิธีชวยในการเรียนรูวิธีการใชฟงกช่ันขางตนไดดีที่สุด ลองพิจารณาตัวอยางตอไปนี้เพื่อทําความเขาใจการใชฟงกขั่นขางบน >> A = [ 9, 7, 0; 0, 8, 6; 7, 1, -6 ]

A =9 7 00 8 67 1 -6

>> size(A)

ans =3 3

>> det(A)

ans =-192

ถาเมตริกซมีคา Determinant ไมเทากับศูนย แสดงวา เมตริกซนั้นหาคา inverse ได >> inv(A)

ans =0.2812 -0.2187 -0.2187-0.2187 0.2812 0.28120.2917 -0.2083 -0.3750

สามารถตรวจสอบผลไดจากสมการ 1AA I− = และ 1A A I− = >> A*inv(A)

ans =1.0000 0 00.0000 1.0000 0

-0.0000 0 1.0000

>> inv(A)*A

ans =

Page 23: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

21

1.0000 -0.0000 00.0000 1.0000 0

-0.0000 0.0000 1.0000

สังเกตผลลัพธที่เกิดขึ้นจะเห็นวา มีการใชคา 0 และ 0.0000 ปนเปกันไป สาเหตเุนื่องมาจาก MATLAB ใชวิธกีารคํานวณเชิงตัวเลข (Numerical computation) ดังนั้นในบางคร้ัง ผลท่ีไดจะไมใชคาแทจริง (exact value) แตสามารถประมาณไดวาเปนคาเดียวกัน สําหรับ การหาคา eigenvalues ( )iλ และ eigenvectors ( )ix ของ A นํามาจากสมการทางคณิตศาสตร i i iAx xλ= >> eig(A)

ans =-4.805512.64623.1594

จะสราง column vector ดวย eigenvalues และ >> [X,D] = eig(A)

X =0.2103 0.8351 0.6821

-0.4148 0.4350 -0.56910.8853 0.3368 0.4592

D =-4.8055 0 0

0 12.6462 00 0 3.1594

จะสราง diagonal matrix D โดยมีคา eigenvalues อยูในแนว diagonal หลัก และ เมตริกซ X ซึ่ง แตละคอลัมนคือ eigenvector ท่ีตอบสนองสําหรับ eigenvalue แตละตัว แบบฝกหัดทายบท ใฃเมตริกซ A, เวกเตอร b และ เวกเตอร a จากตัวอยาง

1. สรางเมตริกซขนาด 2x2 ที่มีคาสุมทั้งหมดเปนจํานวนบวก 2. หาคาสมาชิกสูงสุด และคาสมาชกิตํ่าสุด ในเมตริกซ A 3. จัดเรียงขอมูลของเวกเตอร b จากนอยไปหามาก

Page 24: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

22

4. a. หาคา eigenvectors และ eigenvalues ของเมตริกซ 1B A−= เก็บคาของ

eigenvalues ในตัวแปรชนิด column vector ชื่อ lambda b. สราง I คือ Identity matrix ขนาด 4x4. คํานวณหาคา determinant ของ

jB lambda I− ⋅ โดย j = 1, 2, 3, 4. ( หมายเหตุ: 1lambda คือ eigenvalue ตัวที่ 1 เปนตน )

2.4 การวาดกราฟ ( Plotting )

สําหรับสวนสุดทายในบทนี้จะเก่ียวกับการใช MATLAB ในการวาดรูปจากขอมูลที่มีอยู เปนขอดีที่เรียกวา data visualization. ปอนคําส่ัง help plot จะเห็นคําอธิบายถึงความสามารถในการวาดกราฟแบบ 2 มิต ิถา x และ y คือเวกเตอร ท่ีมีขนาดเทากัน เม่ือใชคําส่ัง plot(x,y) จะไดกราฟของ x เทียบกับ y. ตัวอยาง ถาตองการวาดกราฟของสมการ cos( )y x= จาก π− ถึง π . เร่ิมตนโดยการสรางเวกเตอร x ที่มีคาเร่ิมจาก π− ถึง π ดวยการเพิ่มคาทีละ 0.01 >> x = -pi:0.01:pi; การใส semicolon ( ; ) ท่ีทายบรรทัดเพื่อไมให MATLAB แสดงผลออกมาทางจอภาพเพราะจํานวนสมาชิกใน x มีจํานวนมาก และไมจําเปนท่ีจะด ูจากนั้นทําการกาํหนดคา y >> y = cos(x); เชนเดียวกับขางบน ใส semicolon ( ; ) เพ่ือไมให MATLAB แสดงผลออกมาทางจอภาพ >> plot(x,y) เม่ือทําคําส่ังนี้ MATLAB จะสรางจอแสดงผลใหมกับกราฟที่มีคาของ x และ y. คําส่ังที่นาสนใจและนํามาใชเพ่ือเพิ่มรายละเอียดของกราฟ คือ การกําหนดช่ือและความหมายของแกนท้ังสอง ดวยคําส่ัง xlabel และ ylabel รวมทั้ง การกําหนดช่ือของกราฟ ดวยคําส่ัง title.

Page 25: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

23

-4 -3 -2 -1 0 1 2 3 4-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

>> xlabel('x')

>> ylabel('y=cos(x)')

ในวงเล็บและเคร่ืองหมายคําพูดเดี่ยว ( single quaotes, ' ' ) คือ ขอความที่ตองการใหไปปรากฎบนกราฟของแตละแกน. >> title('Graph of cosine from -pi to pi ')

-4 -3 -2 -1 0 1 2 3 4-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

x

y=co

s(x)

Graph of cosine from -pi to pi

Page 26: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

24

คําส่ังเหลาน้ีสามารถใชไดหลังจากจอแสดงผลของกราฟปรากฎขึน้มาแลว และสามารถแกไขหลายๆคร้ังจนกวาจะพอใจ ในการวาดกราฟ สามารถระบุสีและลักษณะของเสนแบบตางๆได ถาไมมีการระบุ ( ดงัเชนตัวอยางขางบน ) MATLAB จะกําหนดใหเอง y yellow . point m magenta o circle c cyan x x-mark r red + plus g green - solid b blue * star w white : dotted k black -. dashdot -- dashdash ทดลองวาดกราฟเดิมดวยสีเขยีว >> plot(x,y,'g') ตัวที ่3 ในคําส่ัง plot จะระบุสี ในที่นี้คือ g หมายถึงสีเขยีว (ตองอยูในเคร่ืองหมายคําพูดเดี่ยว, single quaotes, ' ' ) หรือ ลองเปล่ียนจากเสนทึบ ( solid line ) เปนเสนประ ( dashed line ) >> plot(x,y,'--') หรือ ผสมระหวางเสนประแบบจดุ ( dotted ) สีฟา ( blue ) >> plot(x,y,'b:') เม่ือมีการวาดหลายๆกราฟในอแสดงผลเดียวกัน ตวัอยางเชน กําหนดเวกเตอรใหม >> z = sin(x); ใชคาํส่ัง plot วาดกราฟของ ทั้ง y และ z เทียบกับ x ดังนี ้>> plot(x,y,'--',x,z,':') ผลจากจอแสดงผลขางลางจะเหน็วา เสนทึบจะแสดงผลจาก cos( )y x= และ เสนจดุจะแสดงผลจาก sin( )z x=

Page 27: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

25

-4 -3 -2 -1 0 1 2 3 4-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

เม่ือมีการแสดงผลหลายกราฟในจอแสดงผลเดียวดังนี ้เพ่ือสรางความกระจางสําหรับผูตองการอานคาจากกราฟเพ่ิมเติม การสราง legend เพื่ออธิบายวา กราฟใดแทนส่ิงใดเปนส่ิงที่ควรทํา โดยใชคําส่ัง legend ดังนี้ >> legend('cos(x)','sin(x)')

-4 -3 -2 -1 0 1 2 3 4-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1cos(x)sin(x)

Page 28: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

26

ตัวหนังสือในเคร่ืองหมายคําพูดเดี่ยวท้ังสอง จะถูกนําไปสรางในกลองเล็กๆในจอแสดงผลพรอมกับตัวอยางเสนกราฟส้ันๆ. วิธีการกําหนดลําดับในการสราง legend น้ี ขี้นอยูกับการอางอิงขอมูลเม่ือทําการสรางกราฟ ในท่ีนี ้จอแสดงผลนี้เรียกกราฟ y กอน z ในจอแสดงผลมีเมนูคําส่ังท่ีจะทําการพิมพภาพออกทางเคร่ืองพิมพไดตลอดเวลา หรือ อาจจะใชคําส่ัง print จากจอคําส่ัง อีกคําส่ังที่นาสนใจคือ คาํส่ัง grid จะทําการสราง เสนตารางบนกราฟ. อานรายละเอียดไดจาก help grid นอกจากนี้คําส่ังที่นาสนใจในการวาดกราฟ ไดแก subplot สรางจอแสดงภาพแสดงกราฟยอยๆในจอแสดงผลใหญ loglog วาดกราฟโดยใชสเกลแบบ log-log semilogx วาดกราฟโดยใชสเกลแบบ log บนแกน x semilogy วาดกราฟโดยใชสเกลแบบ log บนแกน y surf วาดกราฟพื้นผิวสามมิติแบบลายเงา surfl วาดกราฟพื้นผิวสามมิติแบบลายเงาพรอมแสง mesh วาดกราฟพื้นผิวสามมิติแบบตาราง แบบฝกหัดทายบท ทดลองวาดกราฟของสมการ 2 3( ) , ( ) ; 1,...,1f x x g x x x= = = − บนภาพเดียวกัน. แสดงชื่อของแกน x และ แกน y, ชื่อของจอแสดงผล, แสดง legend และ พิมพออกทางเคร่ืองพิมพ

Page 29: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

27

3. การเขียนโปรแกรมใน MATLAB

3.1 M-files: สคริปท และ ฟงกชั่น ( script and function)

ในการใชความสามารถของ MATLAB ใหมีประสิทธิภาพสูงสุด ตองเรียนรูการนําคําส่ัง และฟงกชัน่ตางๆมาใชประกอบกันอยางตอเนื่อง โดยการสรางไฟลที่บรรจุคําส่ัง และฟงกชั่นเหลานั้น และ เรียกใชจากจอคาํส่ัง ไฟลเหลานีจ้ะเก็บเปนไฟลชนดิ .m ซึ่งไฟลชนิดนี้จะถูกอาน และเขาใจโดย MATLAB m-files มี 2 ประเภท ไดแก script files และ function files. Script files: บรรจุคําส่ัง และฟงกชั่นตางๆทีเ่ราสามารถปอนในจอคําส่ัง โดยนาํมารวมกันเพ่ือสะดวกในการทาํงาน และไมตองทาํการปอนขอมูลหรือคําส่ังซํ้าๆกันบอยๆ ตวัอยางเชน เม่ือตองการใช script ชื่อ compute.m ใหทําการพิมพ compute จากจอคําส่ัง MATLAB จะทําการอานไฟลชื่อ compute.m และทําทีละบรรทัด การใช script มีประโยชนมากถาตองทําการปอนขอมูลโดยตรงจํานวนมาก เชน เมตริกซ Function files: ใชสําหรับการสรางฟงกชั่นไวใชเอง โดยระบุตัวแปร input และผลลัพธเปนตัวแปร output. บางคร้ังในการแกปญหา อาจตองการทําการคํานวณบางอยางทีไ่มมีในฟงกชั่นภายในของ MATLAB. ลองดูตัวอยางงายๆ เชน โปรแกรมขางลางอยูในไฟลชือ่ log3.m และใชสําหรับคาํนวณ logarithm ฐาน 3 สําหรับเลขจํานวนเต็มบวก วิธีการสรางไฟลน้ีมีไดหลายแบบ เชน ใช Editor ที่มากับ MATLAB เอง ( โดยใชคําส่ัง edit จากจอคําส่ัง หรือ สําหรับ WINDOWSใช NOTEPAD สรางขี้นมา และเก็บไฟลแบบ .m ( ปกติ notepad จะเก็บเปน .txt ) หรือ สําหรับ UNIX ใช vi เปนตน ที่สําคัญคือ ตองเก็บไฟลเปนชนิด .m เสมอ function [a] = log3(x)

% [a] = log3(x) - Calculate the base 3 logarithm of x.

a = log(abs(x))./log(3);

% End of function

Page 30: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

28

ลองใชฟงกชันนี้ทําการคาํนวณ 3log (5) >> log3(5)

ans =1.4650

การสรางฟงกชั่นขางบนมีรูปแบบมาตรฐานดังนี้ (a) มีคําวา function (b) มีตัวแปร output (อาจมีมากกวา 1 ตัวแปร) อยูในเครื่องหมาย bracket [ ] ( คือ ตัวแปร a ในตัวอยาง )

(c) มีเคร่ืองหมายเทากับ = (d) มีชื่อของฟงกขั่นซึ่งตรงกับชื่อของไฟล ( คือ log3 ในตัวอยาง ) (e) มีตัวแปร input (อาจมีมากกวา 1 ตัวแปร) ( คือ ตวัแปร x ในตัวอยาง )

สําหรับ คําส่ังตางๆ ท่ีตามหลังเคร่ืองหมาย เปอรเซ็นต ( % ) จะไมถูกอานโดย MATLAB นั่นคือ จะเปนเพียงขอความเพื่อใหรับทราบเทานั้น ยกเวน บรรทัดทีเ่ร่ิมตนดวย % ( หลายๆบรรทัดก็ได ) ที่ตามหลังบรรทัดแรก ( ที่มีคําวา function อยู ) ของไฟล จะถูกพิจารณาเปนพิเศษสําหรับคําส่ัง help >> help log3

[a] = log3(x) - Calculate the base 3 logarithm of x.

MATLAB จะแสดงผลของ help ตามท่ีเราใสไวในไฟล นีค่ือ วิธีที่เราด ูhelp จากคาํส่ัง และฟงกชั่นอืน่ๆ เชนกัน จากตัวอยาง เราใช algorithm ในการคํานวณ logarithm ฐาน 3 โดยใขสมการน้ี

3log ( ) ln( ) / ln(3)x x= การใช absolute เพ่ือปองกันปญหาที่จะเกิดจากการปอนคา x เปนจํานวนลบ และ ในโปรแกรม มีการใชวิธ ีelement-wise ดังนั้นการปอนคา x เปนเวกเตอร หรือ เมตริกซ สามารถทําไดเชนกัน สวนหน่ึงที่ ผูอานตองทําความเขาใจเพ่ิมเติมคือ การเปลี่ยนไดเร็กตอร่ี และ การกําหนด PATH ให MATLAB เขาไปเรียก script files หรือ function files มาใช อีกประการหนึ่ง ใน script files หรือ function files สามารถเรียก m-files อื่นๆมาใชไดเชนกัน คาํส่ังภายใน และ ฟงกชั่นภายใน สวนมากก็อยูในรูปของ m-files.

Page 31: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

29

แบบฝกหัดทายบท เขียน script m-file ชื่อ rand_int.m ที่สรางตัวเลขสุมข้ึนมา เม่ือเรียกจากจอคําส่ัง ( แนะ: ปกติในฟงกขั่นตองใสตัวแปร input ดวย ) 3.2 Loops

ในการเขียนโปรแกรมการใช loop นับวาเปนวิธีท่ีใชคอนขางมากและมีประโยชนสูง คําส่ังในการสราง loop มี 2 คําส่ัง คือ for และ while. ใน MATLAB การใช loop ทําไดทั้งใน m-files และ ในจอคําส่ัง. โครงสรางของ loop คือ เริ่มดวยคําส่ัง for หรือ while และจบดวยคําส่ัง end. for loop ใชสําหรับกระทําการวนทํางานคําส่ังท่ีอยูภายใน loop ไปเร่ือยๆ. >> for j = 1:4

jend

j =1

j =2

j =3

j =4

ตัวอยางขางบน ทําการสราง loop เร่ิมจาก 1,� , 4 และ แสดงคาเม่ือผาน loop แตละรอบออกมา ในระหวางคําส่ัง for และ end สามารถใส คาํส่ัง และฟงกชั่นไดหลายๆคร้ัง ดังตัวอยางขางลาง สรางเวกเตอร [ ]1, 2, ... 9, 10x = และ คํานวณ 2 2 2 2 21 , 2 , ... 9 , 10x = โดยใหชื่อวา x2 >> x = 1:10

x =1 2 3 4 5 6 7 8 9 10

>> for i = 1:10

x2(i) = x(i)^2;end

Page 32: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

30

>> x2

x2 =1 4 9 16 25 36 49 64 81 100

ตัวอยางน้ีเปนการทดลองการใช loop เทานั้น ในทางปฎิบัติ MATLAB มีวิธีการคํานวณที่รวดเร็วกวา และมีประสิทธิภาพสูง >> x2 = x.^2

x2 =1 4 9 16 25 36 49 64 81 100

ในการแกปญหาใดๆ พยายามใชวิธีหลังซึ่งเรียกวา "vectorized" กอน เม่ือหลีกเล่ียงไมไดจึงใชวิธกีาร loop. การทํา loop หลายๆชั้น ( Nested loop ) ทําไดดังตัวอยางตอไปนี้ เปนการหาคายกกาํลังสองของสมาชิกแตละตัวในเมตริกซ A ( จริงๆแลวใช A.^2 จะดีกวา ) >> A = [1, 5, -3; 2, 4, 0; -1, 6, 9 ]

A =1 5 -32 4 0

-1 6 9

>> for i = 1:3

for j= 1:3A2(i,j) = A(i,j)^2;

endend

>> A2

A2 =1 25 94 16 01 36 81

ตัวอยางตอไปจะเปนการใชงานจริง, m-file ชื่อ gaussel.m ใชทํา Guassian eleimination และ back substitution (อยูในเร่ือง matrix ) เพื่อแกสมการ Ax b=

Page 33: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

31

function [x] = gaussel(A,b) % % This subroutine will perform Gaussian eleimination % and back substitution to solve the system Ax=b. % % INPUT: A - matrix for the left hand side. % b - vector for the right hand side % OUTPUT: x - the solution vector N = max(size(A)); % perform Gaussian Elimination for j=2:N, for i=j:N, m = A(i,j-1),A(j-1,j-1); A(i,:) = A(i,:) - A(j-1,:)*m; b(i) = b(i) -m*b(j-1); end end % perform back substitution x = zeros (N,1); x(N) = b(N)/A(N,N); for j=N-1:-1:1, x(j) = (b(j)-A(j,j+1:N)*x(j_1:N))/A(j,j); end % End of function

ทดลองใชฟงกชั่นดังนี ้>> A = [4 3 2 3;1 2 3 6;4 2 2 1;9 9 1 -2]

A =4 3 2 31 2 3 64 2 2 19 9 1 -2

>> b = [1;0;2;-5]

Page 34: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

32

b =102

-5

ทําการตรวจสอบวา determinant ของ A ไมเทากับ 0 จีงจะหา inverse ของ A ได >> det(A)

ans =-94

คําตอบของสมการ Ax b= หาไดดังนี ้>> x = gaussel(A,b)

x =1.2979

-1.7660-0.02130.3830

แนนอนการแกสมการดวยวิธีนี้ไมใฃวิธีที่มีประสิทธิภาพสูงสุด วิธทีี่ดีท่ีสุดคือการใชฟงกชั่นภายในของ MATLAB นั่นคือ x = A\b (ทดลองดู) while loop คือ วิธีที่ 2 ในการสราง loop. การใช while จะมีการตรวจสอบเงื่อนไข กอนที่จะเขาไปทํางานภายใน loop ถาเงื่อนไขนัน้ถูกตอง ตวัอยาง ใหคา n กับ function file ช่ือ exple.m ซึ่งจะแสดงจํานวนต็มบวกที่นอยที่สุด a สําหรับอสมการ 2a n≥ function [a] = exple(n) % [a] = exple(n) % a=0; while 2^a <n a = a + 1; end % End of function

>> exple(4)

ans =2

Page 35: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

33

เงื่อนไขตางๆท่ีใชในบรรทัดคาํส่ัง while จะเปนส่ิงทีตั่ดสินวาจะขาม loop ไป หรือเขาไปทํางานใน loop นั้น เคร่ืองหมายเหลานี้เรียกวา relational operators. ซี่งมีดังน้ี < นอยกวา > มากกวา <= นอยกวา หรือ เทากับ >= มากกวา หรือ เทากับ == เทากับ ~= ไมเทากับ หมายเหต:ุ = ใชสําหรับกาํหนดคา และ == ใชสําหรับเปรียบเทียบเงื่อนไข นอกจากนี้ เงื่อนไขจาก relational operators สามารถเชื่อมตอกันดวย logical operators. & และ | หรือ ~ ไม แบบฝกหัดทายบท Hibert matrix, H ขนาด nxn มีสมาชิกสัมพันธกับตําแหนงคือ

1/( 1), , 1,2,..., .ijH i j i j n= + − = สราง 5x5 Hilbert matrix และตรวจคาํตอบจากฟงกช่ันภายในของ MATLAB ช่ือ hilb. 3.3 การใชคําส่ัง If

คําส่ัง If ใชสําหรับตัดสินใจในเงื่อนไขที่ไดรับวาจะกระทาํคาํส่ังใดเม่ือเงื่อนไขถกูตอง หรือทาํคาํส่ังใดเม่ือเงื่อนไขไมถูกตอง. รูปแบบท่ัวไปของ if มีดังนี ้

Page 36: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

34

if เงื่อนไข คําส่ัง (ไดมากกวา 1 คาํส่ัง) elseif เงื่อนไข % บรรทัดน้ีมีหรือไมก็ได คําส่ัง (ไดมากกวา 1 คาํส่ัง) % บรรทัดน้ีมีหรือไมก็ได else % บรรทัดน้ีมีหรือไมก็ได คําส่ัง (ไดมากกวา 1 คาํส่ัง) % บรรทัดน้ีมีหรือไมก็ได end

ใน if สามารถใช logical operators ( &, | , ~ ) ใน เงื่อนไข ที่มีความสัมพันธมากๆ ตัวอยางการใช if สําหรับสมการงายๆ และ การวาดกราฟของสมการ

2 if -1< 0.5

0.25 if 0.5 1

x xF

x

<=

≤ <

เร่ิมตนดวยการสรางเวกเตอร x จาก -1 ถึง 1 เพิ่มคร้ังละ 0.01 >> x = -1:0.01:1;

จากนั้นสราง loop เพื่อผานคา x ไปใชในการคํานวณหา F ดังนี้ >> for i = 1:length(x)

if x(i) <0.5F(i) = x(i)^2;

elseF(i) = 0.25;

endend

แลวทําการวาดกราฟ >> plot(x,F)

Page 37: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

35

-1 -0.5 0 0.5 10

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

สําหรับตัวอยางตอไป เปนการเขยีนโปรแกรมสําหรับรับตัวแปรเปน square matrix และ ใหคา output เปน inverse ของ เมตริกซน้ัน. m-file ชื่อ chk_inv.m จะใชสําหรับตรวจเงื่อนไขตางๆ วาเมตริกซท่ีปอนเขามาสามารถทําการ inverse ไดเชน determinant ไมเทากับ 0 หรือ เปน square matrix. function [Ainv] = chk_inv(A) % [Ainv] = chk_inv(A) % Calculate the inverse of a matrix A % if it exists. [m,n] = size(A); % computer the size of the matrix A if m~=n % check if A is square disp('Matrix is not square.'); break % quit the function elseif det(A) == 0 % check if A is singular disp('Matrix is singular.'); break % quit the function else Ainv = inv(A); % compute the inverse end % End of function

Page 38: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

36

ทดลองใชโปรแกรมนี้กับเมตริกซสุมขนาด 3x3 >> A=rand(3,3)

A =0.4966 0.6449 0.34200.8998 0.8180 0.28970.8216 0.6602 0.3412

>> chk_inv(A)

ans =-3.1874 -0.2083 3.37152.5029 4.0495 -5.94732.8322 -7.3343 6.3202

ในโปรแกรมขางบนมีคําส่ังใหม 2 คําส่ังคือ disp และ break. คําส่ัง break คือ การหยุดการทํางานทั้งหมดในโปรแกรมและออกจากโปรแกรม (กลับไปสู prompt บนจอคําส่ัง). สวนคาํส่ัง disp คือ การแสดงตัวหนังสือที่กําหนดไวในระหวางเคร่ืองหมายคําถามเดี่ยว ( ' ' ) ออกมาบนจอคําส่ัง วธิีการใช disp แสดงผลตางๆดูไดจาก help disp ตัวอยางสุดทาย สราง m-file ชื่อ fact.m ที่จะใหคา factorial ของจาํนวนเต็มบวก

( ) 1 2 3...( 1)fact n n n= ⋅ ⋅ − ⋅ โดยใชวิธีเรียกซ้ํา (recursive) ! ( 1)!n n n= − ⋅ โปรแกรมน้ีจะชวยใหเขาใจวิธีการเขียนโปรแกรมแบบ recursive นอกเหนือไปจากชวยใหเขาใจการใช if function [N] = fact(n) function [N] = fact(n) % [N] = fact(n) % Calculate n factorial if ((n==1) | (n==0)) N=1; else N = n*fact(n-1); end % End of function

>> fact(10) ans =

3628800

Page 39: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

37

แบบฝกหัดทายบท

1. ปรับปรุง log3.m จาก 3.1, โดยลบคําส่ัง absolute ออก และใชเงือ่นไขในการตรวจสอบวา ตัวแปร input ไมใชจํานวนลบ หรือ ศูนย แลวทําการหาคาของ logarithm ฐาน 3

2. เขียน m-file ชื่อ div5.m ที่รับตัวแปร input และตรวจวาเลขน้ันมีคาหารดวย 5 ลงตัว พรอมทั้งแสดงขอความบอกผลดวย

Page 40: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

38

4 หัวขอเพิ่มเติม

4.1 MATLAB กับ โพลิโนเมียล

แมวา MATLAB เปนโปรแกรมทีใ่ชหลักการของการคาํนวณเชิงตวัเลข ( Numerical computation ) แตมันยังมีความสามารถในการคํานวณเกี่ยวกับโพลิโนเมียลได โดยวิธีการใชโพลิโนเมียลใน MATLAB จะเก็บคาสัมประสิทธิ์ (Coefficient) ของโพลิโนเมียลไวในตัวแปรชนิดเวกเตอร เรียงลําดบั จากสัมประสิทธิ์ของอันดับ (order) สูงสุดไปหาสัมประสิทธิ์ของอันดับต่ําสุด เชน โพลิโนเมียล

2( ) 3 5p x x x= − + จะเก็บไวในเวกเตอร [1, 3,5]p = − และ โพลิโนเมียล

4 2( ) 7q x x x x= + − จะเก็บไวในเวกเตอร [1,0,7, 1,0]q = − MATLAB เขาใจเวกเตอรที่มีขนาด n+1 วาเปน โพลิโนเมียลที่มีอันดับสูงสุด คือ n ดังนั้น ถาในโพลิโนเมียลที่สนใจ ขาดบางอันดับ (เชนในตัวอยาง q ขาดอันดับสาม) จึงตองใสสัมประสิทธิ์มีคาเปนศูนยไปที่ตําแหนงน้ันในเวกเตอร คําส่ัง Polyval ใชสําหรับหาคาของโพลิโนเมียล โดยจะแทนคาเขาไปในสมการ ตัวอยางตองการหาคาของโพลิโนเมียล q เม่ือ x = -1 >> p = [1,-3,5]; >> q = [1,0,7,-1,0]; >> polyval(q,-1)

ans =9

คําส่ัง roots ใชสําหรับหารากทั้งหมดของโพลิโนเมียล >> roots(q)

ans =0

-0.0712 + 2.6486i-0.0712 - 2.6486i0.1424

Page 41: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

39

ใน MATLAB, ตัวแปรแตละตวัจะอยูในระบบจาํนวนเชิงซอน ( Complex number ) โดยใช 1i = − หรือ 1j = − . จากตัวอยางท่ีแลว รากทัง้ 4 ของโพลิโนเมียล จะมี 2 รากที่เปนจํานวน

เชิงซอน หมายเหตุ

1. ในการใชงาน MATLAB พยายามหลีกเล่ียงการใชตัวแปร i และ j ในการคํานวณตางๆ โดยเฉพาะ loop. ( ตัวอยางที่ผานมา ใช i, j แบบเดียวกับการกําหนดคา subscript ในการอางถงึเมตริกซ ) ในกรณีที่มีการคํานวณเกี่ยวกับจํานวนเชิงซอน เพื่อหลีกเล่ียงความสับสน

2. j ถูกใชสําหรับจํานวนจินตภาพ เชนเดียวกับ i ดวยเหตุผลทางวศิวกรรมไฟฟา ซึ่งปกติใช i สําหรับตัวแปรกระแสไฟฟา ดังนั้น ตาํราในดานวิศวกรรมไฟฟาทั้งหมด จึงใช j ในการอางองิถึงจํานวนจินตภาพ

ในการคูณโพลิโนเมียลสองจาํนวน MATLAB ใชหลักการทีเ่รียกวา convolution กับสัมประสิทธิ์ของโพลิโนเมียลทั้งสอง โดยคาํส่ัง conv. ตัวอยาง การคูณโพลิโนเมียล ( ) 2s x x= + และ

2( ) 4 8t x x x= + + จะไดคําตอบคือ 3 2( ) ( ) ( ) 6 16 16z x s x t x x x x= = + + + >> s = [1 2]; >> t = [1 4 8]; >> z = conv(s,t)

z =1 6 16 16

ในการหารโพลิโนเมียลใชหลักการคลายๆกัน โดยคาํส่ัง deconv. ซ่ึงจะใหคาํตอบเปนผลท่ีไดและเศษที่เหลือจากการหาร ดังตัวอยางนี ้ ( ) ( ) /( ( )s x z x t x= >> [s,r] = deconv(z,t)

s =1 2

r =0 0 0 0

จะเห็นวาเราไดผลคือ s(x) กลับคืนมา และ ไมมีเศษเหลือ ( ( ) 0r x = ) เน่ืองจากเปนการหารลงตัว

Page 42: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

40

นอกจากนี่ MATLAB ยังสามารถทํา derivatives โพลิโนเมียลไดอยางงายๆ (ถาจะทําแบบมีตัวแปร ตองทําการตดิต้ัง symbolic toolbox) โดยใชคําส่ัง polyder. ตัวอยางเชน ตองการทาํการ derivative โพลิโนเมียล 2( ) 3 5p x x x= − + >> p = [1,-3,5]; >> polyder(p)

ans =2 -3

เห็นไดวา ขนาดของเวกเตอร (หรือ อันดับของโพลิโนเมียล) หลังจากทําการ derivative จะลดลงไป 1

อันดับ ทําไม? คําตอบคือ ( )2 3

dp xx

dx= −

Page 43: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

41

5. ทายเลม

คูมือเลมนี้ หวังใหผูอานไดเขาใจหลักการเบื้องตน และตวัอยางในการใชโปรแกรม MATLAB และ เปนแนวทางที่จะใหมีความตั้งใจท่ีจะหาตํารา หรือ คูมืออื่นๆ มาอานประกอบเพิ่มเติม เพื่อทาํการ ศึกษาการใชงานท่ีลึกซึ้งย่ิงขึ้น ความคิดในการเขยีนคูมือนี้เร่ิมตนประมาณป 1995 หลังจากไดรับการแนะนําการใช MATLAB จาก อาจารยท่ีปรึกษา Dr. Bouzid Aliane

1 แตตองลาชาดวยสาเหตมุากมาย ขอขอบคุณไวในท่ีนี้ ผูเขียนมีโครงการสําหรับการเขยีนคูมืออื่นๆ ในอนาคตอันใกลนี ้ เชน GPS, Embedded uC, Analog/Digital Communication, Nikola Tesla and his patents, VHDL/VerilogHDL Design และ อื่นๆ ซึ่งสามารถดาวนโหลดไดจาก http://www.thisisthainland.info2 คําถาม แนะนํา หรือ ตชิม ไดท่ี [email protected]

ไกรกร เศรษฐไกรกุล BSEE (Power Electronics) สถาบันเทคโนโลยีพระจอมเกลา พระนครเหนือ 1989

MSEE (Computer Engineering) University of New Haven, CT USA 1997 EE Degree (Telecommunications Engineering) Syracuse University, NY USA 2000

Currently Ph.D.candidated (DSP, Controls, Robotics) Clarkson University, NY USA ~2002

1 Associate Professor, Electrical & Computer Engineering Department. University of New Haven, CT USA 2 เว็บไซดน้ีเปนเว็บสวนตัว และสงวนสิทธิ์ไมอนุญาตในการเชื่อมตอกับเครือขายของกลุมบรษิัทท้ังหมดในเครือสามารถ

Page 44: MATLABPrimeThaiR1

MATLAB Primer ภาษาไทย ฉบับพิมพครั้งแรก ๑ มกราคม ๒๕๔๕

42

หนังสืออางอิง MATLAB Primer (2nd edition), Kermit Sigmon, Department of Mathematics,

University of florida, Gainesville, FL 32611 MATLAB for Engineering Applications, William J. Palm III, McGraw-Hill, 2001 Introduction to MATLAB for Engineers, William J. Palm III, McGraw-Hill, 2001