fzero
非線形関数の根
説明
例
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
と の符号が異なることに注意してください。
関数と単精度スカラーの開始点 x0 を作成します。x0 から始まる fzero を使用して関数の根を求めます。
f = @(x)cosh(x)-2*sinh(x); x0 = single(1); [x,fval,exitflag,output] = fzero(f,x0)
x = single
0.5493
fval = single
1.1921e-07
exitflag = single
1
output = struct with fields:
intervaliterations: 9
iterations: 3
funcCount: 21
algorithm: 'bisection, interpolation'
message: 'Zero found in the interval [0.547452, 1.32]'
根を挟む 2 要素の単精度ベクトルを開始点として作成し、解および解法プロセスを比較します。
x0 = single([-1,1]); [x2,fval2,exitflag2,output2] = fzero(f,x0)
x2 = single
0.5493
fval2 = single
1.1921e-07
exitflag2 = single
1
output2 = struct with fields:
intervaliterations: 0
iterations: 5
funcCount: 7
algorithm: 'bisection, interpolation'
message: 'Zero found in the interval [-1, 1]'
結果は同じになります。fzero で使用される関数評価は、今回の方がはるかに少なくなります。
単精度の結果を、標準的な倍精度データを使用した同じ計算と比較します。
x0 = [-1,1]; [x3,fval3,exitflag3,output3] = fzero(f,x0)
x3 = 0.5493
fval3 = -2.2204e-16
exitflag3 = 1
output3 = struct with fields:
intervaliterations: 0
iterations: 7
funcCount: 9
algorithm: 'bisection, interpolation'
message: 'Zero found in the interval [-1, 1]'
倍精度データを使用すると、fzero の関数評価回数が数回ほど増加します。次数 2e–16 の関数値を次数 1e–7 の単精度値と比較すると、結果の精度がはるかに高くなっています。
関数 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.0946f(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 は、スカラー 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
初期値。実数スカラーまたは 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 を呼び出すより高速になる場合があります。
ヒント
x0 がスカラーの場合に fzero で符号変化を見つけられず、fun(x1) が fun(x0) と逆の符号になる点 x1 を特定できるときは、ベクトル [x0,x1] を初期値として渡します。
例: 3
例: [2,17]
データ型: single | double
解法プロセスのオプション。構造体として指定します。optimset を使用して構造体 options を作成または変更します。fzero は以下の options 構造体フィールドを使用します。
| 表示レベル:
|
| 目的関数値が正しいかどうかチェックします。
|
| 各反復で最適化関数が呼び出すユーザー定義の関数を 1 つか複数指定します (関数ハンドルか関数ハンドルの cell 配列として)。既定の設定はなし ( |
| アルゴリズムを実行しながら、進行中のさまざまな測定値をプロットします。事前定義済みのプロットから選択するか、自身で記述します。関数名、関数ハンドル、または、関数名か関数ハンドルの cell 配列を渡します。既定は
カスタム プロット関数の記述については、最適化ソルバーのプロット関数を参照してください。 |
|
|
例: options = optimset("FunValCheck","on")
データ型: struct
出力引数
根または符号変化の場所。スカラーとして返されます。
x での関数値。スカラーとして返されます。
終了条件をエンコードした整数。fzero がその反復を停止した理由を意味します。
| 関数が解 |
| アルゴリズムが出力関数またはプロット関数によって停止されたことを示します。 |
| 符号変化を含む区間の探索中に、関数値 |
-4 | 符号変化を含む区間の探索中に、複素関数値があったことを示します。 |
-5 | アルゴリズムは、特異点に収束した可能性があります。 |
-6 |
|
根の探索プロセスに関する情報。構造体として返されます。構造体のフィールドは、次のとおりです。
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++ コード生成の場合:
入力引数
funは関数ハンドルでなければならず、構造体または文字ベクトルにしてはなりません。fzeroは、TolXとFunValCheckを除くすべてのオプションを無視します。fzeroは、4 番目の出力引数である出力構造体をサポートしません。データはすべて倍精度でなければなりません。
使用上の注意および制限については、「C/C++ コード生成」セクションを参照してください。GPU コード生成にも同様の、使用上の注意および制限が適用されます。
fzero 関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
バージョン履歴
R2006a より前に導入fzero で、単精度の引数 x0 と単精度の関数値 fun(x) が受け入れられるようになりました。既定の終了許容誤差 TolX は single 型のデータに合わせて自動的に調整されます。
[最適化] ライブ エディター タスクは単精度データをサポートしていません。コード生成は fzero の単精度データをサポートしていません。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)