1、MATLAB 程式設計進階篇 一般數學函數的處理與分析,張智星 jangmirlab.org http:/mirlab.org/jang 台大資工系 多媒體檢索實驗室,函數的函數,MATLAB 可對數學函數進行各種運算與分析,例如: 作圖 求根 優化:求函數的極大或極小值 數值積分 求解微分方程式,如何表示此種被分析的函數? 字串 函數握把 (function handles) 匿名函數 (anonymous function),Functions of Functions!,一維數學函數的範例,MATLAB 是以 M 檔案(副檔名為 m)來表示一個函數 例如,內建於MATLAB目錄的 hum
2、ps.m 可用來計算下列函數:更多資訊: 欲顯示此檔案的位置 which humps 欲顯示此檔案的內容 type humps,提示,MATLAB 常被用到的測試函數 humps:單輸入函數 peaks:雙輸入函數 函式和函數都代表functions,兩者常會混用,若要正名,可區分如下: 函數:通常用來表示mathematic functions 函式:通常用來表示subroutines or functions in a programming language,We use 函數 to represent both.,數學函數的作圖,表示函數的方式 函數握把:使用 humps 來代表 hu
3、mps.m 字串:使用 humps 來代表 humps.m 用 fplot 指令進行數學函數作圖 畫出 humps 函數在 0,2 間的曲線 範例:fplot01.m,subplot(2,1,1); fplot(humps, 0,2); % 使用字串指定函式 subplot(2,1,2); fplot(humps, 0 2); % 使用函式握把來指定函式,Less flexible!,同時改變 x、y 的區間,我們可同時改變 x 和 y 的區間 範例:fplot02.mx 的區間為0, 1 y 的區間為5, 25,fplot(humps, 0, 1, 5, 25); grid on % 畫出格
4、線,匿名函式,fplot 也接受匿名函式(當場指定的函式) 範例:fplot021.m,subplot(2,1,1); fplot(sin(2*x)+cos(x), -10, 10) % 使用字串指定函式 subplot(2,1,2); fplot(x)sin(2*x)+cos(x), -10, 10) % 使用函式握把來指定函式,對多個函數作圖,fplot 也可同時對多個函數作圖,其中每個函數須以一個行向量來表示 範例:fplot022.mx 是行向量(MATLAB 預設值) sin(x), exp(-x) 是二個行向量 每個行向量代表一個函數(即一條曲線),fplot(x)sin(x),
5、exp(-x), 0, 10),帶有參數的函數,匿名函式也可以帶有參數 範例:fplot023.m此時 “(x)” 不可省略,以便指定自變數,a=1; b=1.1; c=1.2; fplot(x)sin(a*x), sin(b*x), sin(c*x), 0, 10),Function handle is more flexible!,產生 X、Y 座標點,fplot 可進行描點作圖,類似 plot(x, y),但x 座標點的密度根據函數值的變化決定 我們顯示 fplot 所產生的 x 座標點 範例:fplot03.m函數變化平緩處,產生稀疏的點 函數變化劇烈處,產生緊密的點,x, y = f
6、plot(humps, -1,2); plot(x, y, -o);,產生更密的 X 座標點 (1),若欲產生更密的 x 座標點,可在 fplot 指令加入另一個輸入引數,已指定相對容忍度(Tolerance) 範例:fplot04.m,subplot (2,1,1); fplot(x)sin(1./x), 0.01,0.1); subplot (2,1,2); fplot(x)sin(1./x), 0.01,0.1, 0.0001);,產生更密的 X 座標點 (2),在第一圖中,fplot 指令使用預設相對容忍度,其值為 0.002。 在第二圖中,相對容忍度被設為 0.0001,可得到更準確
7、的圖形,但也要花更多計算及作圖時間。,ezplot 指令,ezplot指令和fplot指令類似,可進行描點作圖,但使用更為簡便,預設的作圖範圍為 範例8-7:ezplot01.m,ezplot(x)x3-x2+x);,平面中的參數式曲線,ezplot 也可畫出平面中的參數式曲線 範例8-8:ezplot02.m參數式函數的參數預設範圍仍是,ezplot(t)sin(3*t), (t)cos(5*t);,利薩如圖形(Lissajous Figures),空間中的參數式曲線,ezplot3 可畫出空間中的參數式曲線 範例8-8:ezplot021.m參數式函數的參數預設範圍仍是,ezplot3(t
8、)sin(3*t), (t)cos(5*t), (t)t),3D利薩如圖形,隱函數作圖,ezplot 指令可用於隱函數作圖 下列範例可以畫出 範例8-9:ezplot03.m,ezplot(x,y)x3+2*x2-3*x-y2+15);,函數的求根,fzero 指令 用於單變數函數的求根 語法 x = fzero(fun, x0) fun 是欲求根的函數(以字串或函數握把來表示) x0 是一個起始點或起始區間,X0 對 fzero 的影響,fzero 指令根據 x0 不同而執行下列動作 若 x0 為一個起始點fzero 會自動找出附近包含零點(即根,或函數變號點)的區間 逐步縮小此區間以找出零
9、點 若 fzero 無法找出此區間,傳回 NaN 若已知使函數值不同號的兩點 由 x0 直接指定尋根的區間fzero 更快速找到位於此區間內的根,求根範例 (1),找出humps在 x = 1.5 附近的根,並驗算 範例8-10:fzero01.mfzero 先找到在 1.5 附近變號的兩點(即 1.26 及 1.6697),然後再找出 humps 的零點,x = fzero(humps, 1.5); % 求靠近 1.5 附近的根 y = humps(x); % 帶入求值 fprintf(humps(%f) = %fn, x , y);,humps(1.299550) = 0.000000,求
10、根範例 (2),若已知 humps 在 x = -1 及 1 間為異號 令 x0 = -1, 1 為起始區間來找出 humps 的零點 範例8-11:fzero02.m此時 fzero 找到的是另一個零點,x = fzero(humps, -1, 1); % 求落於區間 -1, 1 的根 y = humps(x); % 帶入求值 fprintf(humps(%f) = %fn, x , y);,humps(-0.131618) = 0.000000,求根範例 (3),若要畫出以上兩個零點,請見下列範例 範例8-12:fzero03.m,fplot(humps, -1, 2); grid on
11、z1 = fzero(humps, 1.5); z2 = fzero(humps, -1, 1); line(z1, humps(z1), marker, o, color, r); line(z2, humps(z2), marker, o, color, r);,顯示求解過程的中間結果 (1),MATLAB 可以顯示求解過程的中間結果 使用 optimset 指令來設定顯示選項 再將 optimset 傳回結構變數送入 fzero 範例8-13:fzero04.moptimset 常用於設定最佳化的選項,下一節會有比較完整的介紹,opt = optimset(disp, iter); %
12、顯示每個 iteration 的結果 a = fzero(humps, -1, 1, opt),顯示求解過程的中間結果 (2),求零點過程中,找下一點的兩個方法顯示在第四個欄位(Procedure 欄位) 二分法(Bisection) 內插法(Interpolation) 可由doc fzero找到所使用的演算法,Func-count x f(x) Procedure1 -1 -5.13779 initial2 1 16 I initial3 -0.513876 -4.02235 interpolation4 0.243062 71.6382 bisection5 -0.473635 -3.8
13、3767 interpolation6 -0.115287 0.414441 bisection7 -0.150214 -0.423446 interpolation8 -0.132562 -0.0226907 interpolation9 -0.131666 -0.0011492 interpolation10 -0.131618 1.88371e-007 interpolation11 -0.131618 -2.7935e-011 interpolation12 -0.131618 8.88178e-016 interpolation13 -0.131618 -9.76996e-015 i
14、nterpolation Zero found in the interval: -1, 1. a = -0.1316,數值積分,MATLAB 可用於計算單變函數定積分 quad:適應式 Simpson 積分法(Adaptive Simpson Quadrature) quadl:適應式 Lobatto 積分法(Adaptive Lobatto Quadrature),定積分,計算 humps 在 0, 1 的定積分 q = quad(humps, 0, 1) q =29.8583 quad 及 quad8 都應用遞迴程序 若遞迴次數達 10 次,兩種方法均會傳回 Inf 表示所計算之定積分可
15、能不存在 quad 及 quad8第四個引數用來指定積分的相對誤差容忍度,曲線的長度 (1),quad 及 quadl 計算曲線的長度 一曲線是由下列參數化的方程式來表示t 的範圍為 0, 3*pi 範例:plotCurve.m,t = 0:0.1:3*pi; plot3(sin(2*t), cos(t), t);,曲線的長度 (2),此曲線的長度等於,曲線的長度 (3),先定義函數 curveLength.m type curveLength.m function out = curveLength(t) out = sqrt(4*cos(2*t).2+sin(t).2+1); 曲線長度可計
16、算如下 len = quad(curveLength, 0, 3*pi) len =17.2220,雙重積分 (1),dblquad 指令 用來計算雙重積分 欲計算其中 先建立被積分的函數 integrand.m type integarnd.m function out = integrand(x, y) out = y*sin(x) + x*cos(y);,雙重積分 (2),計算雙重積分 result = dblquad( integrand, xMin, xMax, yMin, yMax) 其中 xMin:內迴圈積分的下界值 xMax:內迴圈積分的上界值 yMin:外迴圈積分的下界值 y
17、Max:外迴圈積分的上界值,雙重積分 (3),範例:dblquad01.m一般的情況下dblquad 會呼叫 quad 計算定積分。若須呼叫更為精確的 quadl,可執行下列指令 result = dblquad(integrand, xMin, xMax, yMin, yMax, quadl) result = -9.8696,xMin = pi; xMax = 2*pi; yMin = 0; yMax = pi; result = dblquad(integrand, xMin, xMax, yMin, yMax),result = -9.8698,函數的優化,MATLAB 提供了數個基本
18、指令來進行數學函數的優化,本節將介紹: 單變數函數的最小化: fminbnd 多變數函數的最小化: fminsearch 設定最佳化的選項 若讀者有興趣使用較複雜的方法,可以使用最佳化工具箱(Optimization Toolbox),單變函數的最小化,fminbnd 指令 尋求 humps 在 0.3, 1 中的最小值 範例:fminbnd01.m最小值發生在 x = 0.637,且最小值為 11.2528,x, minValue = fminbnd(humps, 0.3, 1),x =0.6370 minValue =11.2528,尋求最小值的中間過程 (1),尋求最小值的中間過程 使用
19、 optimset 指令來設定顯示選項 再將 optimset 傳回結構變數送入 fminbnd 範例8-15:fminbnd02.m,opt = optimset(disp, iter); % 顯示每個步驟的結果 x, minValue = fminbnd(humps, 0.3, 1, opt),尋求最小值的中間過程 (2),左表列出x值的變化及相對的函數值 f(x) 最後一欄位列出求極小值的方法,包含 黃金分割搜尋(Golden Section Search) 拋物線內插法(Parabolic Interpolation) x 值誤差小於 10-4,Func-count x f(x) Pr
20、ocedure1 0.567376 12.9098 initial2 0.732624 13.7746 golden3 0.465248 25.1714 golden4 0.644416 11.2693 parabolic5 0.6413 11.2583 parabolic6 0.637618 11.2529 parabolic7 0.636985 11.2528 parabolic8 0.637019 11.2528 parabolic9 0.637052 11.2528 parabolic Optimization terminated successfully:the current x
21、 satisfies the termination criteria using OPTIONS.TolX of 1.000000e-004 x = 0.6370 minValue = 11.2528,放鬆誤差管制 (1),放鬆誤差管制 使 fminbnd 提早傳回計算結果 由 optimset 達成 下例將 x 的誤差範圍提高為 0.1 範例8-16:fminbnd03.m,opt = optimset( disp, iter, TolX, 0.1); x, minValue = fminbnd(humps, 0.3, 1, opt),放鬆誤差管制 (2),Func-count x f(x
22、) Procedure1 0.567376 12.9098 initial2 0.732624 13.7746 golden3 0.465248 25.1714 golden4 0.644416 11.2693 parabolic5 0.611083 11.4646 parabolic6 0.677749 11.7353 parabolicOptimization terminated successfully:the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-001 x = 0.6
23、444 minValue = 11.2693,多變數函數的極小值: fminsearch,fminsearch 指令 求多變數函數的極小值 必須指定一個起始點,讓 fminsearch 求出在起始點附近的局部最小值(Local Minima) Derivative free Less efficient Method: Downhill Simplex Search (DSS), aka Nelder-Mead method Amoeba method,Downhill Simplex Search,DSS in Wikipedia Many variations Basic Steps Us
24、e a simplex to explore the objective function, with the operations: Reflection Expansion Contraction Shrink,Downhill Simplex Search,About DSS Strengths Straightforward concept Easy programming No gradient or derivative needed Weakness Slow Only good for continuous objective function Could be trapped
25、 in local minima,Quiz!,多變數函數的極小值範例,若目標函數為我們必須先產生一個 MATLAB 的函數 objective.m若起始點為 範例:fminsearch01.m,x0 = 0, 0, 0; x = fminsearch(objective, x0),function y = objective(x) y = (x(1)-1)2 +(x(2)-2)2 + (x(3)-3)2;,x =1.0000 2.0000 3.0000,最佳化選項,MATLAB 最佳化的選項 經由另一個輸入引數(Input Argument)來進入 fminbnd 或 fminsearch 使
26、用語法 x = fminbnd(objFun, x1, x2, options) x = fminbnd(x)objFun(x, a), x1, x2, options)或 x = fminsearch(objFun, x0, options ) x = fminsearch(x)objFun(x, a), x0, options )options 此結構變數可代表各種最佳化的選項(或參數),Extra parameters,Extra parameters,設定最佳化選項 (1),如何設定最佳化選項 用 optimset 指令 options = optimset(prop1, value1
27、, prop2, value2, ) prop1、prop2 :欄位名稱 value1、value2 :對應的欄位值,設定最佳化選項 (2),印出最佳化步驟的中間結果,並放鬆誤差範圍 options = optimset(Disp, iter, TolX, 0.1)Display: iterMaxFunEvals: MaxIter: TolFun: TolX: 0.1000FunValCheck: OutputFcn: PlotFcns: ActiveConstrTol: ,設定最佳化選項 (3),options 共有五十多個欄位 如果欄位值顯示是空矩陣, 使用此欄位的預設值來進行運算 opt
28、ions = optimset(fminbnd) 顯示非空矩陣的最佳化選項: Display: notify MaxFunEvals: 500 MaxIter: 500 TolX: 1.0000e-004 FunValCheck: off,設定最佳化選項 (4),若輸入 options = optimset(fminsearch) 顯示非空矩陣的最佳化選項: Display: notify MaxFunEvals: 200*numberofvariables MaxIter: 200*numberofvariables TolFun: 1.0000e-004 TolX: 1.0000e-004
29、 FunValCheck: off,最佳化選項說明 (1),Display 若為 0 (預設值),不顯示中間運算結果 若不為 0,則顯示運算過程的中間結果 MaxFunEvals 函數求值運算(Function Evaluation)的最高次數 對 fminbnd 的預設值是 500 對 fminsearch 的預設值是 200 乘上 x0 的長度 MaxIter 最大疊代次數 對 fminbnd 的預設值是 500 對 fminsearch 的預設值是 200 乘上 x0 的長度,最佳化選項說明 (2),TolFun 決定終止搜尋的函數值容忍度 預設為 10-4 此選項只被 fminsear
30、ch 用到,fminbnd 並不使用 TolX 終止搜尋的自變數值容忍度,預設為 10-4,提示,最佳化並非一蹴可及,通常一再重覆,最後才能收斂到最佳點 最佳化的結果和起始點的選定有很大的關聯,一個良好的起始點 加快最佳化收斂的速度 提高找到全域最佳值(Global Optimum)的機會,Steps for Down-hill Simplex search (DSS) Define an objective function myFun(x) Set initial guess “x0” Start the search via fminsearch x=fminsearch(myFun,
31、x0); Variants Objective function myFun(x, prm) Start the search x=fminsearch(x) myFun(x, prm), x0); x=fminsearch(myFun, x0, , prm);,More Examples of DSS,Old usage,Extra parameters To be passed to myFun(),DSS: Example 1 (1/3),Fermat point A point P in a plane such that PA+PB+PC is minimized. Solution
32、 Analytic solution P satisfies AFB=BFC=CFA=120o Numerical solution All kinds of optimization methods,Quiz!,Properties!,DSS: Example 1 (2/3),Objective function dist2ABC.mMain program: goMinDist2ABC.m,function sumDistance=dist2ABC(x) % dist2ABC: The distance sum to points A, B, C A=0 0; B=3 0; C=0 4;
33、sumDistance=norm(x-A)+norm(x-B)+norm(x-C);,p0=5 5; % Initial guess p=fminsearch(dist2ABC, p0); ,Bad idea to hardwire the data points,DSS: Example 1 (3/3),DSS: Example 2 (1/3),Problem definition Find a point P such that the total distance to a set of points is minimized. Solution Analytic solution No
34、t sure if it exists Numerical solution All kinds of optimization methods,DSS: Example 2 (2/3),Objective function dist2points.mMain program: goMinDist2points01.m,function sumDistance=dist2points(x, points) % dist2points: The sum of distance sum to points sumDistance=0; for i=1:size(points,2)sumDistan
35、ce=sumDistance+norm(x-points(:,i); end,points=-1 -1; 3 0; 0 4; 1 1; 2 5; 4 2; p0=5 5; % Initial guess p=fminsearch(x) dist2points(x, points), p0); ,Its Better to accept the data points externally,Data matrix of 2xn,DSS: Example 2 (3/3),DSS: Example 3 (1/2),Objective function minDist2points02.mMain p
36、rogram: goMinDist2points02.m,function p=minDist2points02(points, x0, showPlot) % minDist2points: Compute the point that has the min total if nargin2|isempty(x0), x0=mean(points, 2); end % Initial guess p=fminsearch(x)dist2points(x, points), x0); ,points=-1 -1; 3 0; 0 4; 1 1; 2 5; 4 2; p=minDist2points02(points, , 1); fprintf(p=%sn, mat2str(p);,Data matrix of 2xn,Initial guess,DSS: Example 3 (2/2),本章指令彙整,