10/30/2006

8.2 非線性函數求根法(1)

除多項式之尋根外,有些函數屬於非線性型式,其尋根法自有不同。在matlab中,有fzero、fminbnd及 function_handle可以運用。茲介紹如下:

FZERO 尋找函數根之指令


fzero之語法如下:

 x = fzero(fun,x0)
 x = fzero(fun,x0,options)
 [x,fval,exitflag,output] = fzero(fun,x0,options)


通常要對任一個函數求其等於零之根,有如大海撈針,尤其函數若在零點時存在有許多根時,其所找出之根有時並不符合所望。為此,必須先給附近值或概略區間,使程式能順利找到所要的根。fzero指令之功能就是利用x0為第一個猜測值進行求根。若x0為常數,程式會先找到一個具有正負值區間但包含x0值之根。若設定根之範圍,則可改為矩陣之型式,不過所設定之範圍若其對應函數值無法產生正負符號,程式可能會給一個錯誤的信息。

在輸出參數中,除得到根x之外,其對應之函數值照理為零,但若有差異,亦可利用第二個輸出參數fval。若在設定之範圍內得到NaN或Inf時,表示無解,但也可能以複數為最後的答案。FUN之參數則代表函數名稱,包括自訂函數在內。其名稱之前則需加@之符號。例如:

>> X = fzero(@sin,3)
X =
3.1416

>>> x = fzero(@cos,[1 2])
x =
1.5708

函數也可以使用匿名函數,例如,若有一個匿名函數為 @(x) sin(3*x/5):

>> X = fzero(@(x) sin(3*x/5),5)
X =
5.2360

函數也可使用自訂函數,例如下面之自訂函數demofun:

function f=demofun(x)
f = x.^3-100;

>> x=fzero(@demofun,1)
x =
4.6416


若自訂函數有兩個以上輸入參數,則可採用匿名函數之型式,但只能針對其中一個當變數,其餘需事先設定為常數,例如:


>> x=fzero(@(x) demofun(x),1)
x =
4.6416


使用匿名函數時,其函數名稱也可使用函數握把,但不必加上@,例如:

>>f = @(x)x.^3-5*x-6;

>> z=fzero(f,3)
z =
2.6891


參數options則以optimset函數產生,主要是設定尋根的過程參數,其中包括Display, TolX, FunValCheck及OutputFcn等項目。此外,exitflag輸出參數則是執行結果之代碼,其中:





1 FZERO找到適當值
-1運算依output函數之設定停止。
-3在設定之區間,其結果為NaN或Inf。
-4找到結果為複數型式。
-5 FZERO可能接近單質點(singular point)