Main Content

Optimization Toolbox ソルバーの複素数

一般的に、Optimization Toolbox™ ソルバーは複素数値をもつ目的関数または制約を受け入れないか、処理しません。ただし、最小二乗法ソルバー lsqcurvefitlsqnonlin および lsqlin と、fsolve ソルバーは、次の制限下においてこれらの目的関数を処理することができます。

  • 目的関数は複素関数の観点から解析的でなければなりません (詳細については Nevanlinna および Paatero [1] を参照)。たとえば、関数 f(z) = Re(z) – iIm(z) が解析的でなくても、関数 f(z) = exp(z) は解析的です。この制約は lsqlin に自動的に適用されます。

  • 範囲も含めて、制約は一切使用できません。複素数は適切に順序付けされていないため、"範囲" の意味は明確ではありません。問題に範囲がある場合、非線形最小二乗ソルバーは複素数値をもたらすステップを許可しません。

  • FunValCheck オプションを 'on' に設定しないでください。このオプションは、ソルバーで複素数値が検出されるとすぐにソルバーを停止します。

警告

問題ベースのアプローチでは、目的関数、非線形等式、または非線形不等式における複素数値をサポートしていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。

最小二乗法ソルバーと fsolve は関数値のベクトルの 2 乗ノルムを最小化しようとします。これは複素数値が存在している場合でも、理にかなっています。

非解析関数または制約をもつ場合、問題を実数部と虚数部に分割します。例については、複素数値データへのモデルの当てはめを参照してください。

最適解 (最小ノルム) を取得するには、複素数の初期点を設定してみてください。たとえば、実数の開始点を使用すると 1 + x4 = 0 を解くのに失敗します。

f = @(x)1+x^4;
x0 = 1;
x = fsolve(f,x0)
No solution found.

fsolve stopped because the problem appears regular as measured by the gradient,
but the vector of function values is not near zero as measured by the
default value of the function tolerance.

x =

   1.1176e-08

ただし、複素数の初期点 fsolve を使用すると成功します。

x0 = 1 + 1i/10;
x = fsolve(f,x0)
Equation solved.

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

x =

   0.7071 + 0.7071i

参照

[1] Nevanlinna, Rolf, and V. Paatero. Introduction to Complex Analysis. Addison-Wesley, 1969.

関連するトピック