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) |
1 則留言:
如果執行時出現下面錯誤是什麼意思啊?
Attempt to reference field of non-structure array.
請幫忙解答,謝謝
張貼留言