Main Content

Optimization Toolbox 求解器中的复数

通常,Optimization Toolbox™ 求解器不接受或处理具有复数值的目标函数或约束。但是,最小二乘求解器 lsqcurvefitlsqnonlinlsqlin 以及 fsolve 求解器可以在以下限制下处理这些目标函数:

  • 目标函数必须为复函数意义上的解析函数(有关详细信息,请参阅 Nevanlinna 和 Paatero [1])。例如,函数 f(z) = Re(z) – iIm(z) 不是解析函数,但函数 f(z) = exp(z) 是解析函数。此限制自动适用于 lsqlin

  • 必须没有约束,甚至是边界约束。复数不能很好地排序,因此“边界”的概念可能不适用。当存在问题边界时,非线性最小二乘求解器不允许导致复数值的步长。

  • 不要将 FunValCheck 选项设置为 'on'。当求解器遇到复数值时,此选项会立即停止求解器。

  • 不要使用 lsqcurvefitlsqnonlin'interior-point' 算法。该算法主要用于处理约束,但尚未经过验证是否能够处理复数值。

警告

基于问题的方法不支持在目标函数、非线性等式和非线性不等式中使用复数值。如果某函数计算具有复数值,即使是作为中间值,最终结果也可能不正确。

最小二乘求解器和 fsolve 尝试最小化函数值向量的范数的平方。即使在存在复数值的情况下,这也是有意义的。

如果您有非解析函数或约束,可以将问题拆分为实部和虚部。有关示例,请参阅对复数值数据进行模型拟合

为了得到最佳(最小范数)解,请尝试设置复数的初始点。例如,如果使用实部的起点,求解 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.

相关主题