Download presentation
Presentation is loading. Please wait.
1
MATLAB 程式設計進階篇 一般數學函數的處理與分析
張智星 清大資工系 多媒體檢索實驗室
2
8-1 MATLAB 的函數表示法 函數(Functions)
MATLAB 指令須以字串形式輸入函數或是函式握把(Function Handles)的方式輸入此函數 MATLAB 指令可對數學函數進行運算與分析 數值積分 最佳化(Optimization,求函數的極大極小值) 求解非線性方程式的根 求解微分方程式
3
MATLAB 的數學函數範例 MATLAB 數學函數是以 M 檔案(副檔名為 m)表示 顯示其位置,可輸入
Ex.以下的數學式子,寫成檔案名稱為 humps.m 的 MATLAB 數學函數 顯示其位置,可輸入 >> which humps C:\Program Files\MATLAB71\toolbox\matlab\demos\humps.m 上述的函數已內建於 MATLAB 目錄之下
4
提示 顯示 humps 函數的內容,可輸入 humps 是單輸入函數,peaks 是雙輸入函數,兩者都是 MATLAB 常被用到的測試函數
>> type humps humps 是單輸入函數,peaks 是雙輸入函數,兩者都是 MATLAB 常被用到的測試函數 「函式」和「函數」都代表「functions」,通常「函數」表「mathematic function」,「函式」表「subroutines or functions in a programming language」,兩者有時候會混用
5
8-2數學函數的作圖 使用函式握把(Function Handle)來表示:這是比較新的方式,適用於 MATLAB 6.x & 來代表 humps.m 函式。 用 fplot 指令進行數學函數作圖 畫出 humps 函數在 [0,2] 間的曲線 範例8-1:fplot01.m subplot(2,1,1); fplot('humps', [0,2]); % 使用字串指定函式 subplot(2,1,2); [0 2]); % 使用函式握把來指定函式
6
改變 x、y 的區間 可同時改變 x 和 y 的區間 x 的區間為[0, 1] 範例8-2:fplot02.m y 的區間為[5, 25]
grid on 指令用於畫出 x、y 平面的格線(Grid) fplot('humps', [ ]); grid on % 畫出格線
7
字串的數學方程式作圖 fplot 也接受「當場表示」的數學函數 範例8-3:fplot021.m subplot(2,1,1);
fplot('sin(2*x)+cos(x)', [-10, 10]) % 使用字串指定函式 subplot(2,1,2); [-10, 10]) % 使用函式握把來指定函式
8
對多個函數作圖 fplot 也可同時對多個函數作圖 函數須放入一個向量 範例8-4:fplot022.m x 是行向量
(Column Vector) [sin(x), exp(-x)] 是二個行向量 每個行向量代表一個函 數(即一條曲線) exp(-x)], [0, 10])
9
產生 X 座標點 x 座標點的密度根據函數值的變化決定 fplot 是描點作圖,類似 plot(x, y)
顯示 fplot 所產生的 x 座標點 範例8-5:fplot03.m 函數變化平緩處,產生 稀疏的點 函數變化劇烈處,產生 緊密的點 [x, y] = [-1,2]); plot(x, y, '-o');
10
產生更密的 X 座標點 (I) 欲產生更密的 x 座標點 fplot指令加入相對容忍度(Tolerance)的輸入引數
範例8-6:fplot04.m subplot (2,1,1); [0.01,0.1]); subplot (2,1,2); [0.01,0.1], );
11
產生更密的 X 座標點 (II) 第一圖,fplot 指令使用預設相對容忍度,其值為 0.002 第二圖,相對容忍度被設為 0.0001
可得更準確的圖形,但也要花更多計算及作圖時間
12
ezplot 指令 ezplot指令和fplot指令類似,但使用更為簡便 若要畫出圖形 範例8-7:ezplot01.m
參數式函數的參數預設範圍為 -2*pi 到 2*pi 之間
13
參數式曲線 ezplot 也可畫出參數式的曲線 範例8-8:ezplot02.m
參數式函數的參數預設範圍仍是 -2*pi 到 2*pi 之間 @(t)cos(5*t));
14
隱函數作圖 ezplot 指令可用於隱函數作圖 範例8-9:ezplot03.m
15
8-3 函數的求根 fzero 指令 用於單變數函數的求根 使用語法 x = fzero(fun, x0)
16
x0 不同對fzero的影響 fzero 指令根據 x0 不同而執行下列動作 若 x0 為一個起始點
逐步縮小此區間以找出零點 若 fzero 無法找出此區間,傳回 NaN 若已知使函數值不同號的兩點 由 x0 直接指定尋根的區間 fzero 更快速找到位於此區間內的根
17
求根範例 -1 找出humps在 x = 1.5 附近的根,並驗算 範例8-10:fzero01.m
x = 1.5); % 求靠近 1.5 附近的根 y = humps(x); % 帶入求值 fprintf('humps(%f) = %f\n', x , y); humps( ) =
18
求根範例 -2 若已知 humps 在 x = -1 及 1 間為異號 令 x0 = [-1, 1] 為起始區找出 humps 的零點
範例8-11:fzero02.m 此時 fzero 找到的是另一個零點 x = [-1, 1]); % 求落於區間 [-1, 1] 的根 y = humps(x); % 帶入求值 fprintf('humps(%f) = %f\n', x , y); humps( ) =
19
求根範例 –3 (I) 若要畫出以上兩個零點 範例8-12:fzero03.m fplot(@humps, [-1, 2]);
z1 = 1.5); z2 = [-1, 1]); line(z1, humps(z1), 'marker', 'o'); % 畫出第一個零點的位置 line(z2, humps(z2), 'marker', 'o'); % 畫出第二個零點的位置 grid on % 畫出格線
20
求根範例 –3 (II)
21
求解過程的中間結果 (I) 顯示求解過程的中間結果 使用 optimset 指令,再將 optimset 傳回的結構變數送入fzero
範例8-13:fzero04.m opt = optimset('disp', 'iter'); % 顯示每個 iteration 的結果 a = [-1, 1], opt)
22
求解過程的中間結果 (II) 求零點過程中,用到二分法(Bisection)或內插法(Interpolation) 若給定一個起始點
Func-count x f(x) Procedure initial initial interpolation bisection interpolation bisection interpolation interpolation interpolation e interpolation e interpolation e interpolation e interpolation Zero found in the interval: [-1, 1]. a = 求零點過程中,用到二分法(Bisection)或內插法(Interpolation) 方法在左表Procedure的第四個欄位中 若給定一個起始點 fzero 最初的步驟中會先找出一個適當的區間來搜尋零點
23
提示 optimset 常用於設定最佳化的選項
24
8-4 函數的極小值 MATLAB 指令進行數學函數最佳化,將介紹 單變數函數的最小化 多變數函數的最小化 設定最佳化的選項
25
單變函數的最小化 fminbnd 指令 尋求 humps 在 [0.3, 1] 中的最小值 範例8-14:fminbnd01.m
最小值發生在 x = 0.637,且最小值為 [x, minValue] = 0.3, 1) x = 0.6370 minValue =
26
尋求最小值的中間過程 (I) 尋求最小值的中間過程 使用 optimset 指令來設定顯示選項
再將 optimset 傳回結構變數送入 fminbnd 範例8-15:fminbnd02.m opt = optimset('disp', 'iter'); % 顯示每個步驟的結果 [x, minValue] = 0.3, 1, opt)
27
尋求最小值的中間過程 (II) 左表列出x值的變化及相對的函數值 f(x) 最後一欄位列出求極小值的方法 通常是 x 值誤差小於 10^-4
Func-count x f(x) Procedure initial golden golden parabolic parabolic parabolic parabolic parabolic parabolic Optimization terminated successfully: the current x satisfies the termination criteria using OPTIONS.TolX of e-004 x = minValue = 左表列出x值的變化及相對的函數值 f(x) 最後一欄位列出求極小值的方法 通常是 黃金分割搜尋 (Golden Section Search) 拋物線內插法 (Parabolic Interpolation) x 值誤差小於 10^-4
28
放鬆誤差管制 (I) 放鬆誤差管制 使 fminbnd 提早傳回計算結果 由 optimset 達成
範例8-16將 x 的誤差範圍提高為 0.1 範例8-16:fminbnd03.m opt = optimset( 'disp', 'iter', 'TolX', 0.1); [x, minValue] = 0.3, 1, opt)
29
放鬆誤差管制 (II) Func-count x f(x) Procedure 1 0.567376 12.9098 initial
golden golden parabolic parabolic parabolic Optimization terminated successfully: the current x satisfies the termination criteria using OPTIONS.TolX of e-001 x = minValue =
30
多變數函數的極小值 fminsearch 指令 求多變數函數的極小值
必須指定一個起始點,讓 fminsearch 求出在起始點附近的局部最小值(Local Minima) 目標函數: 先產生一個 MATLAB 的函數 objective.m >> type objective.m function y = objective(x) y = (x(1)-1).^2 +(x(2)-2).^2 + (x(3)-3).^2;
31
多變數函數的極小值 範例 若起始點為 , , 範例8-17:fminsearch01.m
若起始點為 , , 範例8-17:fminsearch01.m fminsearch 使用的方法是下坡式 Simplex 搜尋(Downhill Simplex Search) x0 = [0, 1, 2]; x = x0) x =
32
最佳化選項 MATLAB 最佳化的選項 經由另一個輸入引數(Input Argument)來進入 fminbnd 或 fminsearch
使用語法 x = x1, x2, options) 或 x = x0, options ) options 結構變數 代表各種最佳化的選項(或參數)
33
設定最佳化選項 欲設定最佳化選項 用 optimset 指令
options = optimset(prop1, value1, prop2, value2, …) prop1、prop2 :欄位名稱 value1、value2 :對應的欄位值
34
設定最佳化選項 -1 印出最佳化步驟的中間結果,並放鬆誤差範圍
>> options = optimset('Disp', 'iter', 'TolX', 0.1) Display: 'iter' MaxFunEvals: [] MaxIter: [] TolFun: [] ………… TolRLPFun: [] TolXInteger: [] TypicalX: []
35
設定最佳化選項 -2 options 共有五十多個欄位 如果欄位值顯示是空矩陣, 使用此欄位的預設值來進行運算 顯示非空矩陣的最佳化選項:
>> options = optimset('fminbnd') 顯示非空矩陣的最佳化選項: Display: 'notify MaxFunEvals: 500 MaxIter: 500 TolX: e-004 FunValCheck: 'off'
36
設定最佳化選項 -3 若輸入 顯示非空矩陣的最佳化選項: Display: 'notify‘
>> options = optimset('fminsearch') 顯示非空矩陣的最佳化選項: Display: 'notify‘ MaxFunEvals: '200*numberofvariables' MaxIter: '200*numberofvariables‘ TolFun: e-004 TolX: e-004 FunValCheck: 'off'
37
最佳化選項說明 (I) Display MaxFunEvals MaxIter 若為 0 (預設值),不顯示中間運算結果
若不為 0,則顯示運算過程的中間結果 MaxFunEvals 函數求值運算(Function Evaluation)的最高次數 對 fminbnd 的預設值是 500 對 fminsearch 的預設值是 200 乘上 x0 的長度 MaxIter 最大疊代次數
38
最佳化選項說明 (II) TolFun TolX 決定終止搜尋的函數值容忍度 預設為 10^-4
此選項只被 fminsearch 用到,fminbnd 並不使用 TolX 終止搜尋的自變數值容忍度,預設為 10-4
39
提示 最佳化並非一蹴可及,通常一再重覆,最後才能收斂到最佳點 最佳化的結果和起始點的選定有很大的關聯,一個良好的起始點 加快最佳化收斂的速度
提高找到全域最佳值(Global Optimum)的機會
40
8-5 數值積分 MATLAB 可用於計算單變函數定積分
quad:適應式 Simpson 積分法(Adaptive Simpson Quadrature) quadl:適應式 Lobatto 積分法(Adaptive Lobatto Quadrature)
41
定積分 計算 humps 在 [0, 1] 的定積分 quad 及 quad8 都應用遞迴程序
>> q = 0, 1) q = quad 及 quad8 都應用遞迴程序 若遞迴次數達 10 次,兩種方法均會傳回 Inf 表示所計算之定積分可能不存在 quad 及 quad8第四個引數用來指定積分的相對誤差容忍度
42
曲線的長度 (I) quad 及 quadl 計算曲線的長度 一曲線是由下列參數化的方程式來表示 t 的範圍為 [0, 3*pi]
範例8-18:plotCurve.m t = 0:0.1:3*pi; plot3(sin(2*t), cos(t), t);
43
曲線的長度 (II) 此曲線的長度等於
44
曲線的長度 (III) 先定義函數 curvleng.m 曲線長度可計算如下 >> type curvleng.m
function out = curvleng(t) out = sqrt(4*cos(2*t).^2+sin(t).^2+1); 曲線長度可計算如下 >> len = 0, 3*pi) len =
45
雙重積分 (I) dblquad 指令 用來計算雙重積分 欲計算 其中 先建立被積分的函數 integrnd.m
>> type integrnd.m function out = integrnd(x, y) out = y*sin(x) + x*cos(y);
46
雙重積分 (II) 計算雙重積分 其中 Xmin:內迴圈積分的下界值 Xmax:內迴圈積分的上界值 Ymin:外迴圈積分的下界值
result = dblquad( 'integrnd', Xmin, Xmax, Ymin, Ymax) 其中 Xmin:內迴圈積分的下界值 Xmax:內迴圈積分的上界值 Ymin:外迴圈積分的下界值 Ymax:外迴圈積分的上界值
47
雙重積分 (III) 範例8-19:dblquad01.m
一般的情況下dblquad 會呼叫 quad 計算定積分。若須呼叫更為精確的 quadl,可執行下列指令 >>result = result = Xmin = pi; Xmax = 2*pi; Ymin = 0; Ymax = pi; result = Xmin, Xmax, Ymin, Ymax) result =
48
8-6 本章指令彙整 類別 指令名稱 功能 作圖 ezplo fplot 簡便的函數作圖 一般的函數作圖 求根 fzero 單變數函數的求根
最佳化 fminbnd fminsearch 單變數函數的最小值多變數函數的最小值 數值積分(Quadrature) quad quad8 dblquad 低精度的數值積分 高精度的數值積分 雙重(二維)積分
Similar presentations