8-3 うD

fzero 指令可用於單變數函數的求根,其使用語法如下:

x = fzero(fun, x0)

其中 fun 是欲求根的函數(以字串表示),x0 則是一個起始點或起始區間。您可以由 x0 指定一個起始點或起始區間來進行求根,fzero 指令會根據 x0 的不同而執行下列動作:

例如,若要找出 humps 在 x = 1.5 附近的根,並驗算之,可輸入如下:

Example 1: 08-一般數學函數的處理與分析/fzero01.mx = fzero(@humps, 1.5); % 求靠近 1.5 附近的根 y = humps(x); % 帶入求值 fprintf('humps(%f) = %f\n', x , y);humps(1.299550) = 0.000000

在上列中,fzero 首先找到 1.5 附近變號的兩點,即 1.26 及 1.6697,然後再據以找出 humps 的零點。

若已知 humps 在 x = -1 及 1 之間為異號,即 humps(1)*humps(-1) < 0, 則我們可以令 x0 = [-1, 1] 為起始區來找出 humps 的零點,如下:

Example 2: 08-一般數學函數的處理與分析/fzero02.mx = fzero(@humps, [-1, 1]); % 求落於區間 [-1, 1] 的根 y = humps(x); % 帶入求值 fprintf('humps(%f) = %f\n', x , y);humps(-0.131618) = 0.000000

此時 fzero 找到的是另一個零點。若要畫出以上這兩個零點,可輸入如下:

Example 3: 08-一般數學函數的處理與分析/fzero03.mfplot(@humps, [-1, 2]); grid on 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'); % 畫出第二個零點的位置

若欲顯示求解過程的中間結果,可使用 optimset 指令來設定顯示選項,再將 optimset 傳回的結構變數送入fzero,例如:

Example 4: 08-一般數學函數的處理與分析/fzero04.mopt = optimset('disp', 'iter'); % 顯示每個 iteration 的結果 a = fzero(@humps, [-1, 1], opt) Func-count x f(x) Procedure 2 -1 -5.13779 initial 3 -0.513876 -4.02235 interpolation 4 -0.513876 -4.02235 bisection 5 -0.473635 -3.83767 interpolation 6 -0.115287 0.414441 bisection 7 -0.115287 0.414441 interpolation 8 -0.132562 -0.0226907 interpolation 9 -0.131666 -0.0011492 interpolation 10 -0.131618 1.88371e-07 interpolation 11 -0.131618 -2.7935e-11 interpolation 12 -0.131618 8.88178e-16 interpolation 13 -0.131618 8.88178e-16 interpolation Zero found in the interval [-1, 1] a = -0.1316

在求零點過程中,會用到二分法(Bisection)或內插法(Interpolation),這些方法顯示在上表 Procedure 的第四個欄位中。若給定一個起始點,則 fzero 在最初的個步驟中會先找出一個適當的區間來搜尋零點。

Hint
  • optimset 通常用於設定最佳化的選項,將在下節中詳細介紹。


MATLAB程式設計:進階篇