fzero
非線形関数の根
説明
例
1 点から開始する根
3
の近傍で正弦関数の零点を求めることにより を計算します。
fun = @sin; % function x0 = 3; % initial point x = fzero(fun,x0)
x = 3.1416
区間から開始する根
1
と 2
の間にある余弦の零点を求めます。
fun = @cos; % function x0 = [1 2]; % initial interval x = fzero(fun,x0)
x = 1.5708
と の符号が異なることに注意してください。
ファイルで定義された関数の根
関数 f(x) = x3 – 2x – 5. の零点を求めます。
最初に、ファイル f.m
を記述します。
function y = f(x)
y = x.^3 - 2*x - 5;
MATLAB® パス上に f.m
を保存します。
2
の近傍の f(x) の零点を求めます。
fun = @f; % function x0 = 2; % initial point z = fzero(fun,x0)
z = 2.0946
f(x)
は多項式なので、roots
コマンドを使用して、同じ実数零点と零点の複素共役対を検出できます。
roots([1 0 -2 -5])
ans = 2.0946 -1.0473 + 1.1359i -1.0473 - 1.1359i
追加パラメーターをもつ関数の根
追加パラメーターをもつ関数の根を求めます。
myfun = @(x,c) cos(c*x); % parameterized function c = 2; % parameter fun = @(x) myfun(x,c); % function of x alone x = fzero(fun,0.1)
x = 0.7854
既定以外のオプション
いくつかのプロット関数を設定することによって解法プロセスをプロットします。
関数と初期点を定義します。
fun = @(x)sin(cosh(x)); x0 = 1;
プロット関数を含むオプションを設定することによって解法プロセスを調べます。
options = optimset('PlotFcns',{@optimplotx,@optimplotfval});
options
を含めて fzero
を実行します。
x = fzero(fun,x0,options)
x = 1.8115
問題の構造体を解く
問題の構造体で定義される問題を解きます。
根の探索問題をエンコードする構造体を定義します。
problem.objective = @(x)sin(cosh(x)); problem.x0 = 1; problem.solver = 'fzero'; % a required part of the structure problem.options = optimset(@fzero); % default options
問題を解きます。
x = fzero(problem)
x = 1.8115
解からの詳細情報
exp(-exp(-x)) = x
である点を求め、解法プロセスに関する情報を表示します。
fun = @(x) exp(-exp(-x)) - x; % function x0 = [0 1]; % initial interval options = optimset('Display','iter'); % show iterations [x fval exitflag output] = fzero(fun,x0,options)
Func-count x f(x) Procedure 2 1 -0.307799 initial 3 0.544459 0.0153522 interpolation 4 0.566101 0.00070708 interpolation 5 0.567143 -1.40255e-08 interpolation 6 0.567143 1.50013e-12 interpolation 7 0.567143 0 interpolation Zero found in the interval [0, 1]
x = 0.5671
fval = 0
exitflag = 1
output = struct with fields:
intervaliterations: 0
iterations: 5
funcCount: 7
algorithm: 'bisection, interpolation'
message: 'Zero found in the interval [0, 1]'
fval
= 0 は、想定どおり fun(x) = 0
であることを意味します。
入力引数
fun
— 解を求める関数
関数ハンドル | 関数名
解を求める関数。スカラー値関数のハンドルまたはそのような関数の名前として指定します。fun
は、スカラー x
を受け入れ、スカラー fun(x)
を返します。
fzero
は fun(x) = 0
を解きます。方程式 fun(x) = c(x)
を解くには、代わりに fun2(x) = fun(x) - c(x) = 0
を解きます。
関数に追加のパラメーターを含めるには、追加パラメーターをもつ関数の根の例および関数のパラメーター化の節を参照してください。
例: 'sin'
例: @myFunction
例: @(x)(x-a)^5 - 3*x + a - 1
データ型: char
| function_handle
| string
x0
— 初期値
スカラー | 2 要素ベクトル
初期値。実数スカラーまたは 2 要素実数ベクトルとして指定します。
スカラー —
fzero
はx0
から開始し、fun(x1)
がfun(x0)
の逆の符号をもつ点x1
を見つけようとします。その後、fzero
は、解に到達するまで、fun
が符号を変える区間を反復して縮小します。2 要素ベクトル —
fzero
は、fun(x0(1))
とfun(x0(2))
が逆の符号をもっているかをチェックし、それらが逆の符号をもっていない場合はエラーになります。その後、解に到達するまで、fun
が符号を変える区間を反復して縮小します。区間x0
は有限である必要があります。すなわち、±Inf
は含めません。
ヒント
区間 (2 つの要素をもつ x0
) を伴った fzero
を呼び出すと、スカラー x0
を呼び出すより高速になる場合があります。
例: 3
例: [2,17]
データ型: double
options
— 解法プロセスのオプション
構造体 (通常、optimset
で作成)
解法プロセスのオプション。構造体として指定します。optimset
を使用して構造体 options
を作成または変更します。fzero
は以下の options
構造体フィールドを使用します。
| 表示レベル:
|
| 目的関数値が正しいかどうかチェックします。
|
| 各反復で最適化関数が呼び出すユーザー定義の関数を 1 つか複数指定します (関数ハンドルか関数ハンドルの cell 配列として)。既定の設定はなし ( |
| アルゴリズムを実行しながら、進行中のさまざまな測定値をプロットします。事前定義済みのプロットから選択するか、自身で記述します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし (
カスタム プロット関数の記述については、「最適化ソルバーのプロット関数」を参照してください。 |
|
|
例: options = optimset('FunValCheck','on')
データ型: struct
出力引数
x
— 根または符号変化の場所
実数スカラー
根または符号変化の場所。スカラーとして返されます。
fval
— x
での関数値
実数スカラー
x
での関数値。スカラーとして返されます。
exitflag
— 終了条件をエンコードした整数
整数
終了条件をエンコードした整数。fzero
がその反復を停止した理由を意味します。
| 関数が解 |
| アルゴリズムが出力関数またはプロット関数によって停止されたことを示します。 |
| 符号変化を含む区間の探索中に、関数値 |
-4 | 符号変化を含む区間の探索中に、複素関数値があったことを示します。 |
-5 | アルゴリズムは、特異点に収束した可能性があります。 |
-6 |
|
output
— 根の探索プロセスに関する情報
構造体
根の探索プロセスに関する情報。構造体として返されます。構造体のフィールドは、次のとおりです。
intervaliterations | 根を含む区間を見つけるための反復数 |
iterations | 零点を見つける反復数 |
funcCount | 関数評価の回数 |
algorithm |
|
message | 終了メッセージ |
アルゴリズム
fzero
コマンドは関数ファイルです。T. Dekker が作成したこのアルゴリズムは、二分法、正割、および逆 2 次内挿法を組み合わせて使用します。いくつかの改良がなされた Algol 60 バージョンは[1]にあります。fzero
が基づいている Fortran 版は[2]にあります。
代替機能
アプリ
[最適化] ライブ エディター タスクは、fzero
のビジュアル インターフェイスを提供します。
参照
[1] Brent, R., Algorithms for Minimization Without Derivatives, Prentice-Hall, 1973.
[2] Forsythe, G. E., M. A. Malcolm, and C. B. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, 1976.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
C/C++ コード生成の場合:
入力引数
fun
は関数ハンドルでなければならず、構造体または文字ベクトルにしてはなりません。fzero
は、TolX
とFunValCheck
を除くすべてのオプションを無視します。fzero
は、4 番目の出力引数である出力構造体をサポートしません。
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
バージョン履歴
R2006a より前に導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)