Transcript 進階主題選讀
MATLAB 程式設計入門篇 進階主題選讀 修改自張智星教授講義 [email protected] http://www.cs.nthu.edu.tw/~jang 清大資工系 多媒體資訊檢索實驗室 多項式加減乘除 n次多項式 在matlab中,用向量表示多項式 p(x) = anxn + an-1xn-1 + ... + a1x + a0 p = [an, an-1, ..., a1, a0] 例如[1 2 3 1]代表x3 + 2x2 + 3x + 1 運算: p1 + p2 多項式和 p1 - p2 多項式差 conv(p1, p2) 多項式乘積 [q, r] = deconv(p1, p2) 多項式相除,得到商式和餘式 多項式求值、微積分 用polyval指令進行多項式求值: p = [3 4 -2 5]; x = linspace(-3, 3); y = polyval(p, x); plot(x, y, '.-'); 多項式微分:q = polyder(p) 多項式積分:q = polyint(p, k) % k為不定常數 多項式擬合 用polyfit指令進行多項式擬合: % 製造資料 p = [2 -3 -4]; x = linspace(-2, 2, 20); y = polyval(p, x) + (rand(1, 20)-0.5); % 加上適當誤差 % 擬合,假設已經知道是二次式 p2 = polyfit(x, y, 2); y2 = polyval(p2, x); % 畫圖 plot(x, y, 'o', x, y2, 'x-'); legend('原始資料', '擬合結果'); 多項式擬合 擬合時的次方數差異: % 製造資料 p = [2 -3 -4]; x = linspace(-1, 1, 20); x2 = linspace(-1.3, 1.3); y = polyval(p, x) + (rand(1, 20)-0.5); % 加上適當誤差 % 擬合,測試到七次方,擬合後之曲線有100個點,每個row是一條線 curve = zeros(7, 100); for i = 1:7 thisCoef = polyfit(x, y, i); curve(i, :) = polyval(thisCoef, x2); end % 畫圖 plot(x, y,'o', x2, curve); legend('實際資料', '1次', '2次','3次', '4次', '5次', '6次', '7次'); 單變數函數求根 範例:找出humps函數的根 humps是一個單變數函數,MATLAB常用的測試函數之一 % 找某個點附近的根 x = fzero('humps', 1.5); y = humps(x); fprintf('x: %f, y:%f\n', x, y); % 找某區間內的根。區間邊界的函數值必須異號,否則error x = fzero('humps', [-1 1]); y = humps(x); fprintf('x: %f, y:%f\n', x, y); % 顯示中間結果 opt = optimset('disp', 'iter'); x = fzero('humps', [-1, 1], opt); fzero與roots的差異 fzero: 用於一般單變數函數的求根 一次只找一個根 使用牛頓法 roots: 只用於多項式求根 一次找到全部的根 將多項式表示成「伴隨矩陣」(Companion Matrix),再 用解特徵值方法求根 單變數函數最佳化 範例:找出humps函數的最小值 % 畫出圖形 fplot('humps', [-2 2]); % 找某區間內的最小值 x = fminbnd('humps', 0, 1); y = humps(x); fprintf('x: %f, y:%f\n', x, y); % 顯示中間結果 opt = optimset('disp', 'iter'); x = fminbnd('humps', 0, 1, opt); % 放鬆誤差管制 opt = optimset('disp', 'iter', 'tolx', 0.1); x = fminbnd('humps', 0, 1, opt); 多變數函數最佳化 範例:找出自訂函數的最小值 myFunc.m: function y = myFunc(x) y = 100*(x(2)-x(1)^2)^2+(1-x(1))^2; fminsearch使用範例: % 找某區間內的最小值 [x z]= fminsearch('myFunc', [-1.2, 1]); fprintf('x: [%f %f], y:%f\n', x(1), x(2), z); 關於最佳化 optimset共有五十多個選項,其中 最佳化的結果,和起始點的選定有很大的關連。如果有好的 起始點 Display: 是否顯示中間過程 MaxIter: 最大疊代次數 TolX:終止搜尋的自變數容忍度 TolFun:終止搜尋的函數值容忍度 加快收斂速度 提高找到全域最佳解的機會 通常需要一再重複,才能收斂到最佳點 單變數函數的數值積分 quad: 適應式Simpson積分法(Adaptive Simpson Quadrature) quadl: 適應式Lobatto積分法(Adaptive Lobatto Quadrature) 範例: a = quad('x.^2 + 2*x + 1', -1, 1) a = quad('exp(-x)', -2, 3) 一維內插: interp1 利用多項式進行內插運算 yi = interp1(x, y, x1, method) x: 原始資料x座標 y: 原始資料y座標 xi: 要進行內插的x座標 method: 使用的方法 'nearest': 鄰近點 'linear': 線性 'spline': 片段式三次spline 'pchip' 或 'cubic': 保持型狀的片段式三次 xi必須落在x的範圍內 否則應使用 yi = interp1(x, y, xi, method, 'extrap') 一維內插: interp1 範例: x = 0:1:4*pi; y = sin(x).*exp(-x/5); xi = 0:0.1:4*pi; y1 = interp1(x, y, xi, 'nearest'); y2 = interp1(x, y, xi, 'linear'); y3 = interp1(x, y, xi, 'pchip'); y4 = interp1(x, y, xi, 'spline'); plot(x, y, 'o', xi, y1, xi, y2, xi, y3, xi, y4); legend('Original', 'Nearest', 'Linear', 'Pchip', 'Spline');