## Complex Numbers in Optimization Toolbox Solvers

Generally, Optimization Toolbox™ solvers do not accept or handle objective functions or constraints with
complex values. However, the least-squares solvers `lsqcurvefit`

,
`lsqnonlin`

, and `lsqlin`

, and the
`fsolve`

solver can handle these objective functions under the
following restrictions:

The objective function must be analytic in the complex function sense (for details, see Nevanlinna and Paatero [1]). For example, the function

*f*(*z*) = Re(*z*) –*i*Im(*z*) is not analytic, but the function*f*(*z*) = exp(*z*) is analytic. This restriction automatically holds for`lsqlin`

.There must be no constraints, not even bounds. Complex numbers are not well ordered, so it is not clear what “bounds” might mean. When there are problem bounds, nonlinear least-squares solvers disallow steps leading to complex values.

Do not set the

*FunValCheck*option to`'on'`

. This option immediately halts a solver when the solver encounters a complex value.Do not use the

`'interior-point'`

algorithm of`lsqcurvefit`

or`lsqnonlin`

. That algorithm is primarily for handling constraints, and has not been validated to work with complex values.

**Warning**

The problem-based approach does not support complex values in the following: an objective function, nonlinear equalities, and nonlinear inequalities. If a function calculation has a complex value, even as an intermediate value, the final result might be incorrect.

The least-squares solvers and `fsolve`

try to minimize the squared
norm of a vector of function values. This makes sense even in the presence of complex
values.

If you have a non-analytic function or constraints, split the real and imaginary parts of the problem. For an example, see Fit a Model to Complex-Valued Data.

To get the best (smallest norm) solution, try setting a complex initial point. For
example, solving 1 + *x*^{4} = 0 fails if you use a real start point:

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

However, if you use a complex initial point, `fsolve`

succeeds:

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

## References

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