Optimization Toolbox 求解器中的复数
通常,Optimization Toolbox™ 求解器不接受或处理具有复数值的目标函数或约束。但是,最小二乘求解器 lsqcurvefit
、lsqnonlin
和 lsqlin
以及 fsolve
求解器可以在以下限制下处理这些目标函数:
目标函数必须为复函数意义上的解析函数(有关详细信息,请参阅 Nevanlinna 和 Paatero [1])。例如,函数 f(z) = Re(z) – iIm(z) 不是解析函数,但函数 f(z) = exp(z) 是解析函数。此限制自动适用于
lsqlin
。必须没有约束,甚至是边界约束。复数不能很好地排序,因此“边界”的概念可能不适用。当存在问题边界时,非线性最小二乘求解器不允许导致复数值的步长。
不要将 FunValCheck 选项设置为
'on'
。当求解器遇到复数值时,此选项会立即停止求解器。不要使用
lsqcurvefit
或lsqnonlin
的'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.