matlab 7 在工程上的應用 -...

80
MATLAB 7 在工程上的應用 William J. Palm III 4 MATLAB 程式設計

Upload: others

Post on 19-Nov-2019

12 views

Category:

Documents


0 download

TRANSCRIPT

  • MATLAB 7 在工程上的應用William J. Palm III

    第 4 章MATLAB 程式設計

  • 演算法與控制結構

    演算法就是將精確定義的的指令以排序過的程序在某一段有限的時間內進行某一項任務。排序意思是這些指令可加上編號,

    但是演算法有能力使用控制結構來改變這些指令的順序。下列是三種演算法運算的種類:

    循序運算:表示依順序執行的指令。

    條件運算:這種控制結構首先詢問一個一定要回答的問答,答案是真/偽,並且接下來根據這個答案選取下一步的指令。

    迭代運算(迴圈):表示重複執行某一組指令的控制結構。

  • 結構化程式設計

    結構化程式設計是設計一個程式的一個技巧,此技巧就是使用模組的體系,每一個模組都有一個單一的入口點以及出口點,並且在模組中控制的命令向下通過這個結構,而不會無條件分支到此結構的更高層。

    在MATLAB中,這些模組可以是內建的或者是使用者定義的函數。

  • 結構化程式設計的優點

    1. 結構化的程式易於撰寫,因為程式設計者可先研讀整個問題,接下來才處理細節。

    2. 為了某一應用撰寫的模組(函數),亦可以使用於其他的應用(所以也稱之為可重複使用的程式碼)。

    3. 結構化程式設計易於除錯,因為每一個模組只被用來執行一個任務,並且可以獨立於其他的模組單獨被測試。

    4. 結構化程式設計對於團隊合作的環境是有效率的,因為許多人可以共同合作同一個程式,而每一個人負責開發一個或者一個以上的模組。

    5. 結構化的程式易於了解以及修改,特別是將模組給予有意義的名稱,以及對於每一個模組的任務有完善的使用說明的時候。

    更多相關資料請查詢課本第4-4~4-5頁

  • 表4.1–1 開發電腦求解的步驟

    1. 簡潔地敘述問題。2. 指定程式所需要使用的資料。這些資料就是「輸入」。3. 指定程式所需要產生的資訊。這些資訊就是「輸出」。4. 徒手計算或者使用計算機運算整個求解步驟;若有必要,可

    使用一組比較簡單的資料來測試。

    5. 撰寫以及執行程式。6. 檢查程式的輸出以及徒手計算的結果。7. 以輸入的資料執行這個程式,並且對輸出執行真實性檢查。8. 如果你將來會把此程式視作一個常用的工具而一直使用,記

    得以某個範圍的合理資料值執行此程式來測試;並且對結果執行真實性檢查。

  • 有效的文件說明可以藉由下列方式完成:

    1. 適當地選取變數名稱,忠實反應這些變數代表的量。

    2. 在程式內加入註解。

    3. 使用結構圖。

    4. 使用流程圖。

    5. 在程式中加入文字敘述,通常以假碼(偽碼)敘述。

  • 以圖形作文件說明

    在開發結構化的程式以及將程式以文件說明時,我們需要兩種圖形來輔助。

    這兩種圖形分別是結構圖以及流程圖。

    1. 結構圖是描述此程式不同部分如何連結在一起的圖形。

    2. 流程圖對於開發,以及用文件說明包含條件敘述的程式時非常有用,因為流程圖顯示了程式根據條件敘述如何執行所採取的各種路徑(也稱之為「分支」)。

  • 圖4.1–1 電腦遊戲程式的結構圖。

  • 圖4.1–2 敘述的流程圖表示法。

  • 以假碼作文件說明

    要直接避免處理電腦程式語言中可能會發生的複雜語

    法,我們可以使用假碼代替,假碼使用了自然語言以及數學算式來建立類似電腦敘述的敘述,但沒有複雜的語法。假碼也可以使用一些簡單的MATLAB語法來解釋程式的運作。

    每一個假碼指令可以加以編號,但要明確並且可以加以計算。

  • 例題 1. 假碼(Pseudo-code)

    1. 輸入邊長 a, b, 和 c. 2. 計算周長, p. p = a+b+c; 3. 計算半周長 s, s = p/2; 4. 計算面積, A. 5. 顯示 p 和 A. 6. 結束

    ( )( )( )A s s a s b s c

    問題敘述: 計算三角形周長 p 與面積 A,三邊長各為a, b, 和 c. 計算公式為:

    ( )( )( )A s s a s b s c , / 2p a b c s p

  • 輸入a, b, c

    計算p

    計算A

    顯示p, A

    結束

    流程圖

  • 範例 1. 連續運算(Sequential operations)

    a = input('Enter the value of side a: '); b = input('Enter the value of side b: '); c = input('Enter the value of side c: '); p = a + b + c; % 求周邊長 s = p/2; % 二分之ㄧ周長 A = sqrt(s*(s-a)*(s-b)*(s-c)); % 求面積 disp('The perimeter is:') p disp('The area is:') A

  • 範例2. 假碼(Pseudo-code)

    1. 輸入 x 和 y座標。 2. 計算斜邊長 r; 3. 計算角度 ,

    If x 0, theta = atan(y/x) else theta = atan(y/x)+pi

    4. 轉換徑度量至度單位,theta = theta*(180/pi) 5. 顯示 r 與 theta 6. 停止。

    問題敘述: 輸入點座標(x, y),計算極座標(r, ),其中

    2 2r x y 1tan ( )yx

    2 2r x y

    計算角度以tan-1(對邊/底邊),即y/x;注意是x與y是座標有正負之分。

  • 流程圖

    輸入x, y

    計算 r

    x 0

    theta = atan(y/x)

    結束顯示r, theta

    theta = atan(y/x)+pi

    轉換徑度量theta = theta*(180/pi)

    Yes

    No

  • 範例 2. 條件運算(Conditional Operations)

    x = input('Enter the value of x: '); y = input('Enter the value of y: '); r = sqrt(x^2+y^2); if x >= 0 theta = atan(y/x); else theta = atan(y/x) + pi; end disp('The hypoteneuse is:') disp(r) theta = theta*(180/pi); disp('The angle is degrees is:') disp(theta)

  • 範例3. 假碼(Pseudo-code)

    1. 初始化 total為0, total = 0。 2.初始化counter為0,k = 0。 3. While 當total小於20,000則計算total

    counter 增量值為1,k = k + 1 更新total值 total = 10*k^2-4*k+2+total

    4. 顯示目前k 的值。 5. 顯示目前total的值。. 6. 停止。

    問題敘述: 求 級數和需要多少項次不會超過20,000。在此項次下的級數和為多少?

    210 4 2, 1,2,3,....k k k

  • 流程圖初始化total

    初始化 k

    total

  • 範例 3. 迭代運算(Iterative)

    total = 0; k = 0; while total < 2e+4 k = k+1; total = 10*k^2 - 4*k + 2 + total; end disp('The number of terms is:') disp(k) disp('The sum is:') disp(total)

  • 找出錯誤

    將程式除錯的意思就是找出並且除去這些在程式中的「臭蟲」,或者錯誤。這樣的錯誤通常可以歸類於以下幾種類別。

    1. 語法的錯誤,例如忽略了括號或者逗號、或者將指令名稱拼字錯誤。MATLAB通常可以偵測明顯的錯誤並且顯示出描述此錯誤內容與所在位置的訊息。

    2. 錯誤通常肇因於不正確的數學程序之錯誤。這些錯誤稱做執行時的錯誤。當程式執行的時候並不一定每次都發生;只有在某些特殊的資料輸入時才會發生。一個常見的例子是除以零。

  • 要找出執行時的錯誤,嘗試下列方法:

    1. 永遠都先以此問題的簡單版本來測試,這種簡單的版本可以徒手計算來驗證。

    2. 移除各敘述末尾的分號,顯示出中間的執行結果。

    3. 要測試使用者定義之函數,先暫時以註解排除function列,並且以腳本檔的方式來執行這個檔案。

    4. 使用編輯器除錯器的除錯功能,關於這部分我們會在4.7 節中討論。

  • 開發大型程式

    1. 撰寫以及測試個別的模組(單元測試階段)。2. 撰寫使用到這些模組的最上層程式(增長階段)。並非

    所有的模組在初始測試的階段都被涵蓋到。隨著增長程

    序的演進,越來越多的模組被包含在內。

    3. 測試第一版完整的程式(α版發行階段)。這通常由組織內與程式開發緊緊相關的技術人員來完成。可能會找

    到一些α版本的錯誤並且移除之。4. 最終α版本發行的測試由組織內相關人員以及熟悉信任

    的外部人員完成,這些外部測試人員通常要簽署保密協

    定。此時才為β版本發行階段,可能會發行許多次的β版。

  • 表 4.2–1 關係運算子

    運算子 意義

    < 小於

    大於

    >= 大或等於

    == 等於

    ~= 不等於

  • 例如,假設x = [6,3,9] 以及 y = [14,2,9]。下列的MATLAB對話說明了這些例子。

    >>z = (x < y)z =

    1 0 0>>z = (x ~= y)z =

    1 1 0>>z = (x > 8)z =

    0 0 1

  • 關係運算子可以用來做陣列處理。

    假設

    x = [6, 3, 9]

    以及

    y = [14, 2, 9]

    若是輸入

    z = x(x

  • 算術運算子+、-、*、/以及 \ 具有比關係運算子更高的優先權。因此敘述

    z = 5 > 2 + 7

    與下列敘述是等效的

    z = 5 >(2+7)

    並且傳回的結果為z = 0。

    我們可以使用括號來改變優先權;例如,z = (5 > 2) + 7與z = 8是等效的。

  • logical類別

    當使用關係運算子的時候,例如

    x = (5 > 2)

    會建立一個邏輯變數,在這個例子中是x。

    在MATLAB 6.5版之前,logical是任何一種數值資料類型的屬性。現在logical是第一級資料類型,並且也是一個MATLAB的類別,因此logical現在與其他例如字元以及胞陣列的第一級的類型同等級。

    邏輯變數之值只可能是1(真)以及0(偽)。

  • 然而,如果陣列只包含 0 以及 1,並不代表它一定是邏輯陣列。例如,下列的對話中,k 以及 w 看來相同,但是 k是一個邏輯陣列,而w卻是一個數值陣列,因此會出現一個錯誤訊息。

    >>x = [-2:2]; k = (abs(x)>1)k =

    1 0 0 0 1>>z = x(k)z =

    -2 2>>w = [1,0,0,0,1]; v = x(w)??? Subscript indices must either be real positive... integers or logicals.

    更多相關資料請查詢課本第4-12頁

  • STOP

  • 使用邏輯陣列存取陣列

    當使用邏輯陣列來處理另外一個陣列時,會抓出該陣列中對應到邏輯陣列中元素為 1 之位置的對應元素。

    因此輸入A(B),其中B是一個具有與 A 相同尺寸的邏輯陣列,則傳回 A 在 B 為 1 處的值。

    給定A = [5,6,7;8,9,10;11,12,13]以及B = logical(eye(3)),我們可以藉由輸入C = A(B)來得到 A 的對角線元素,並且得到C = [5;9;13]。

    以邏輯陣列指明陣列下標可以得到對應於邏輯陣列中為真(1)處對應元素。

    更多相關資料請查詢課本第4-13頁

  • 表 4.3–1 邏輯運算子

    運算子 名稱 定義 ~ 反 ~A 傳回與 A 相同維度的陣列;新陣列在 A 為零的地

    方具有 1 且在 A 不為零的地方具有 0。 & 且 A&B 傳回的陣列具有與 A 以及 B 相同的維度;A&B

    在 A 以及 B 對應元素均不為零的位置傳回的是 1,而在 A 或者 B 中對應元素有一為零的位置傳回的是 0。

    | 或 A|B 傳回的陣列具有與 A 以及 B 相同的維度;在 A 以及 B 對應元素至少有一個不為零的位置傳回的是 1,而在 A 以及 B 中元素都為零的位置傳回的是 0。

    && 短路且 純量邏輯算式的運算子。A && B 在 A 以及 B 均為真的情況下傳回真,其他狀況則傳回偽。

    || 短路或 純量邏輯算式的運算子。A || B 在 A 或者 B 或者兩者都是真的情況下傳回真,其他狀況則傳回偽。

  • 表 4.3–2 運算子類型的優先順序

    優先權 運算子類型 第一 括號;由最內的一對括號開始計算。 第二 算術運算子以及邏輯反相(NOT)(~);由左至右開始

    計算。 第三 關係運算子;由左至右開始計算。 第四 邏輯且(AND)。 第五 邏輯或(OR)。

  • 邏輯函數 定義 logical(A) 將陣列 A 的元素轉換成為邏輯值。 xor(A,B) 傳回一個與矩陣 A、B 具有相同維度的陣列;若

    A、B 其中一個不為零,且兩個不同時為零,則新陣列傳回一;若 A 以及 B 均為零或者均不為零,則新陣列傳回零。

    表 4.3–4 邏輯函數

    (接下頁)

  • find 函數

    邏輯函數

    find(A)

    [u,v,w] = find(A)

    定義

    計算一個陣列,此陣列的元素是陣列A中不為零的元素的索引。

    計算陣列u以及v,u的元素是陣列A中不為零的元素的列索引,v的元素是陣列A中不為零的元素的行索引,並且w包含這些不為零的元素的值。陣列w可以省略。

  • 邏輯運算子以及find函數

    考慮下列的對話

    >>x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];>>z = find(x&y)z =

    1 2 5

    我們注意到find函數傳回的是索引,而不是值。

    (接下頁)

  • 邏輯運算子以及find函數(承上頁)

    在下列的對話中,注意區分y(x&y)所得到的結果以及在前一頁投影片中find(x&y)所得到的結果

    >>x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];>>values = y(x&y)values =

    2 4 7>>how_many = length(values)how_many =

    3

    更多相關資料請查詢課本第4-17~4-18頁

  • 測試問題

    T4.3-1 本練習 x = [5,-3,18,4];y = [-

    9,13,7,4]; z = ~y>x z = 0 1 0 0 z = x&y z = 1 1 1 1

    z = x|y z = 1 1 1 1 z = xor(x,y) z = 0 0 0 0

  • START

  • Example 4.3-1假碼 1. 設定初始速率(speed) 、重力場(gravity)和角度(angle) %v0 = 20; g = 9.81; A = 40*pi/180; 2. 計算著地時間 %time_to_hit = 2*v0*sin(A)/g; 設為t_hit 3. 計算時間、高度和速率 %t = 0, t_hit/100, 2t_hit/100, 3t_hit/100, ….. % % 4. 決定當高度不小於6 且速率不大於16 % u = find(h>=6&v

  • time = (n-1)*t_hit

    1st 點符合h>=6&v=6&v=6&v=6&v

  • 輸入初始 V0, g, A

    計算著地時間 t_hit

    計算 t, h, V

    find h >= 6且V

  • Example 4.3-1 拋射質點的高度及速度

    %設定初始速率(speed) 、重力場(gravity)和角度(angle) v0 = 20; g = 9.81; A = 40*pi/180; %計算著地時間 t_hit = 2*v0*sin(A)/g; %計算時間、高度和速率 t = [0:t_hit/100:t_hit]; h = v0*t*sin(A) - 0.5*g*t.^2; v = sqrt(v0^2 - 2*v0*g*sin(A)*t + g^2*t.^2); %決定當高度不小於6 且速率不大於16 u = find(h>=6&v

  • 測試問題

    T4.3-2 同例題4.3-1, 但既不是 h< 4 或 V> 17;繪製h(t)與v(t)以確認答案.

    Note: 邏輯運算 | : OR ; ~ NOT ~(h17): either h< 4 or V> 17 改變find(h>=6&v

  • 測試問題 T4.3-2 程式與例題4.3-1 相

    同除了

    u =find(~(h17));. v0 = 20;g = 9.81;A =

    40*pi/180; t_hit = 2*v0*sin(A)/g; t = [0:t_hit/100:t_hit]; h = v0*t*sin(A)-0.5*g*t.^2;

    v = sqrt(v0^2-2*v0*g* sin(A)*t+g^2*t.^2);

    u = find(~(h17)); t_1 = (u(1)-1)*(t_hit/100) t_2 = u(length(u)-

    1)*(t_hit/100) 結果為t1 = 0.5766 和t2 =

    2.0443. 因為h < 4 或 v > 17 其 t <

    t1 且 t > t2.

  • 狀態敘述

    If I get a raise, I will buy a new car . (period) %01 If I get a least a $100 per week raise, I will buy a new car; else I will put the raise into savings . (period) %02 If I get a least a $100 per week raise, I will buy a new car; else, If the raise is greater $50, I will buy a new stereo; otherwise, I will put the raise into savings . (period) %03

  • if 敘述

    if敘述的基本形式為

    if 邏輯算式敘述

    end

    每個if敘述必須要伴隨一個end敘述。如果邏輯算式為真的時候,end敘述標記所要執行的敘述的結束。

    更多相關資料請查詢課本第4-20頁

  • if x >= 0 y = sqrt(x); end 同理: if x >= 0, y = sqrt(x), end

    z=0; w= 0; if (x >= 0)&(y>=0) z= sqrt(x) + sqrt(y); w= log(x) – 3*log(y); end

  • 流程圖 Figure 4.4–1 x, y

    False

    True

    End

    x 0?

    Compute z, w

    y 0?

    True

    False

  • else 敘述使用else敘述其基本結構為

    if 邏輯算式敘述群組1

    else敘述群組2

    end

    更多相關資料請查詢課本第4-22~4-25頁

    if x >= 0 y = sqrt(x); else y = exp(x) -1; end

  • 圖4.4–2 else 結構的流程圖。

  • 當測試的時候,if這個邏輯算式被執行,其中邏輯算式可以是一個陣列,則此測試只有在邏輯算式中所有的

    元素均為真的情況之下,才會傳回一個真的值!

  • 例如,如果我們沒有辦法看出此測試是如何進行,則下列的敘述並不是以我們想像中的方式進行。

    x = [4,-9,25];if x < 0

    disp(’Some elements of x are negative.’)else

    y = sqrt(x)end

    此測試if x < 0傳回的值結果是偽,當此程式被執行之後會得到下列的結果y =

    2 0 + 3.000i 5

  • 另外,考慮如果x為正的情形

    x = [4,-9,25];if x >= 0

    y = sqrt(x)else

    disp(’Some elements of x are negative.’)end

    當此程式被執行之後,產生下列的結果:

    Some elements of x are negative.

    此測試if x < 0的結果是偽,並且因為x >= 0傳回了[1,0,1]的向量,所以此測試if x >= 0傳回的值結果也是偽。

  • 下列的敘述

    if 邏輯算式1if 邏輯算式2

    敘述end

    end

    可以用下列更為簡潔的形式來取代If 邏輯算式1 & 邏輯算式2

    敘述end

  • elseif 敘述

    if敘述的一般形式為

    if 邏輯算式1敘述群組1

    elseif 邏輯算式2敘述群組2

    else敘述群組3

    end

    如果不需要else以及elseif敘述的話可以省略。然而,如果兩者都被使用,則else敘述必須要在elseif後出現,來承擔所有未予說明的條件。

  • 圖4.4–3 if-elseif-else 結構的流程圖。

  • 例如,假設x > 10 時 y = ln x,在 0 ≤ x ≤ 10 時 y = sqrt(x),並且在x < 0 時y = exp(x) - 1 。下列的敘述會計算 y ,假設 x 已經具有一個純量值。

    if x > 10y = log(x)

    elseif x >= 0y = sqrt(x)

    elsey = exp(x) - 1

    end

    更多相關資料請查詢課本第4-24~4-25頁

  • 圖4.4–4 用以說明巢套if敘述的流程圖。

  • if x > 10 y = log(x) if y >= 3 z = 4*y; elseif y >= 2.5 z = 2*y; else z = 0; end else y = 5*x; x = 7*x; end

  • 測試問題

    T4.4-1 使用 x = 13 測試,程式為:

    x = 13; if x>10 y = log(x) if y >= 3 z = 4*y elseif y > 2.5

    z = 2*y else z = 0 end else y = 5*x z = 7*x end

  • T4.4-2 注意asin(x)函數回傳正確值為徑度量,但x須在第一及第四象限. 因須注意可能所給的q 與 x不相容.

    例如, q 不能等於 1,假如 x < 0. 下列程式須避免次錯誤輸入

    if x >= 0&x

  • disp(y) end elseif x-1 if q==4 y = asin(x)*180/pi; else y = asin(x)*180/pi -90; end if q==1|q==2 disp(‘Incompatible values

    of x and q’)

    else

    disp(y)

    end

    else

    disp(‘The magnitude of x is greater than 1’)

    end

  • 字串

    字串就是包含字元的變數。字串非常適用於建立輸入提示符號、建立訊息,以及對於儲存與操作例如姓名以及地址這一類的資料。

    要建立一個字串變數,則將字元以單引號圍住。例如,字串變數name可以用下列的方式建立:

    >>name = ’Leslie Student’name =

    Leslie Student

    (接下頁)

  • 字串(承上頁)

    下列的字串number和藉由輸入number = 123所建立出來的變數number是不一樣的。

    >>number = ’123’number =

    123

  • 字串和input敘述

    下一張投影片所列出的程式使用isempty(x) 函數,如果陣列x為空陣列則傳回1,若是其他情況則傳回 0。

    同時使用了輸入函數,其語法為

    x = input(’prompt’, ’string’)

    這個函數會在螢幕上顯示字串prompt ,同時等候由鍵盤的輸入,並且將輸入的值傳回至字串變數x中。

    若是沒有輸入任何東西而直接按下Enter鍵的話,則此函數傳回一個空的矩陣。

  • 字串與條件敘述

    下列的提示程式是一個能夠讓使用者鍵入Y或者y或者直接按下Enter鍵來回答Yes(是)的腳本檔。任何其他的回應會被當作是No(否)這個答案。

    response = input(’Want to continue? Y/N [Y]: ’,’s’);if (isempty(response))|(response==’Y’)|(response==’y’)

    response = ’Y’else

    response = ’N’end

    更多相關資料請查詢課本第4-27~4-28頁

  • for 迴圈

    一個簡單的for迴圈例子如下

    for k = 5:10:35x = k^2

    end

    迴圈變數 k一開始被指派成5,並且根據x = k^2來計算x。每一次相鄰的兩個通過k會被加上一個迴圈增量10,並且繼續計算x直到k超過35。因此k會出現的值為5、15、25以及35,並且x會出現的值為25、225、625以及1225。此程式接下來會繼續執行接在end敘述後面的任何敘述。

  • 圖4.5–1 for迴圈的流程圖。

  • 以迴圈變數表示式 k = m:s:n 使用for迴圈時,要注意下列的規則:

    步長值s可以為負值。例如,k = 10:-2:4會產生k = 10、8、6、4。

    如果s被省略,則步長值預設為”1”。

    如果s是正值,當m大於n的時候迴圈不會執行。

    如果s是負值,當m小於n的時候迴圈不會執行。

    如果m等於n,則迴圈只會執行一次。

    如果步長值s不是整數,則四捨五入誤差會使得迴圈執行通過的次數與想像不一樣。

  • continue 敘述

    下列的程式碼使用continue敘述來避免計算到負數的對數。

    x = [10,1000,-10,100];y = NaN*x;for k = 1:length(x)

    if x(k) < 0continue

    endy(k) = log10(x(k));

    endy此結果為 y = 1, 3, NaN, 2。

    更多相關資料請查詢課本第4-31~4-32頁

  • while 迴圈

    while迴圈是用於當某一特定條件滿足時,才終止迴圈的對話,而事先我們未能知道通過的次數。一個簡單的while的迴圈例子為

    x = 5;while x < 25

    disp(x)x = 2*x - 1;

    end

    此程式中disp敘述所顯示的結果為5、9以及17。

  • 典型的while結構如下。

    while 邏輯算式敘述

    end

    要使得while迴圈能夠正確地運作,下面兩個條件必須要發生:

    • 迴圈變數必須在while敘述執行之前就要有一個值。• 迴圈變數必須要在敘述中被變更。

    更多相關資料請查詢課本第4-38~4-40頁

  • 圖4.5–3 while迴圈的流程圖。

  • 一個簡單的while的迴圈例子為

    x = 5;k = 0;

    while x < 25

    k = k + 1;

    y(k) = 3*x;

    x = 2*x-1;

    end

    起始的時候迴圈變數 x 被指派為5,並且直到第一次遇到敘述為 x = 2*x - 1 之前都一直保持這個值。接下來此值變成9。在每一次通過迴圈之前,檢查x是否小於25。如果是,則繼續通過;如果不是,則跳過此迴圈。

  • switch 結構

    switch結構提供了另外一種使用if、elseif,以及else指令的替代方式。任何使用switch所撰寫出來的程式必定可以使用if結構撰寫出來。

    然而,對於某些應用而言,switch結構比if結構較具有可讀性。

  • switch 結構的語法

    switch 輸入算式(純量或者字串)case 值1

    敘述群組1case 值2

    敘述群組2...

    otherwise敘述群組 n

    end

  • 下列的switch段落顯示羅盤上對應至該角度的點。

    switch anglecase 45

    disp(’Northeast’)case 135

    disp(’Southeast’)case 225

    disp(’Southwest’)case 315

    disp(’Northwest’)otherwise

    disp(’Direction Unknown’)end

    更多相關資料請查詢課本第4-42~4-44頁

  • Test Your Understanding Problems T4.5-1 The script file is m = 0; for q = 0:6:18 m = m+1; n = 0; for r = 4:4:12 n = n+1; A(m,n) = r+q; end end T4.5-2 The script file is [m,n] = size(A); for c = 1:n x = 0;

    for r = 1:m x = x + A(r,c); end sum_A(c) = x; end disp(sum_A) T4.5-3 The script file is x = 49; k = 1; while x>0 y = sqrt(x) k = k+1; x = 50 - k^2; end

  • T4.5-4 The script file is error = 0; x = 0; while error < 1 x = x + 0.01; approx = 1 + x + x^2/2 + x^3/6; error = 100*(exp(x) - approx)/exp(x); end disp(x)

  • Test Your Understanding Problems T4.6-1 The script file is angle = input(‘Enter an angle in degrees.’) switch angle case 45 disp(‘Angle is in first quadrant’) case -45 disp(‘Angle is in second quadrant’) case 135 disp(‘Angle is in third quadrant’) case -135 disp(‘Angle is in fourth quadrant’) otherwise disp(‘Quadrant is unknown.’) end