1. ホーム
  2. matlab

[解決済み] 1変数に対するfzeroとfsolveの差分

2022-02-17 16:06:34

質問

1変数の方程式に対してfzeroとfsolveを使うことに違いはあるのでしょうか?

どのように解決するのですか?

はい、あります。一番わかりやすい違いを挙げておきますね。

fsolve は、1変数の方程式の0を求めるのに使うことができる。しかし fzero はゼロを見つけます。 もし が x 軸を横切る。

簡単な例を挙げましょう。次のような関数を考えてみましょう。 f=x^2 . のすべての実数値に対して非負の関数です。 x . に根を持つ。 x=0 . 無名関数を次のように定義します。 f=@(x)x.^2; という2つのメソッドを使って、ルートを探してみましょう。

fsolveを使用する

options=optimset('MaxIter',1e3,'TolFun',1e-10);
fsolve(f,0.1,options)


Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the selected value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>


ans =

   1.9532e-04

ゼロではないけれど、近い。

fzeroを使用する

fzero(f,0.1)
Exiting fzero: aborting search for an interval containing a sign change
    because NaN or Inf function value encountered during search.
(Function value at -1.37296e+154 is Inf.)
Check function or try again with a different starting value.

ans =

   NaN

それは できない はゼロを見つける。

別の例として、関数 f=@(x)x.^3; に根を持ち、X 軸を横切る。 x=0 .

fsolve(f,0.1)

ans =

    0.0444

fzero(f,0.1)

ans =

  -1.2612e-16

fsolve が正確に返されるわけではありません。 0 この場合も を使っても options 上で定義したのは 0.0017fsolve . しかし fzero の答えは、機械精度の範囲内で正しいのです! 答えの違いは、非効率的なアルゴリズムのせいではありません。それは、彼らの 目的が違う .

fzero は、「ゼロを見つける」という明確な目標を持っています。シンプルですね。そこに曖昧さはない。もしそれがX軸を横切るなら、そこには があり、それを見つけることができます(リアルのみ)。交差しない場合は、泣き言を言います。

しかし fsolve の範囲はより広い。これは非線形方程式系を解くために設計されています。多くの場合、それらの方程式の厳密な解を見つけることはできず、解を答えとして受け入れる許容範囲を設定する必要があります。その結果、正確なルートを算出するために手動で設定しなければならないオプションや公差が多数存在します。確かに、より細かい制御が可能ですが、単一変数方程式のゼロを見つけるには、私はそれが苦痛であると考えています。私なら fzero その場合、(X軸を横切ると仮定して)。

この大きな違い以外にも、実装や使用するアルゴリズムに違いがあります。それについては、関数のオンラインドキュメントを参照してほしい(上のリンクを参照)。