Matlab fsolve返回复杂的解决方案-如何仅限于实际搜索空间?

Matlab fsolve返回复杂的解决方案-如何仅限于实际搜索空间?,matlab,mathematical-optimization,numerical-methods,complex-numbers,least-squares,Matlab,Mathematical Optimization,Numerical Methods,Complex Numbers,Least Squares,有时,F解决方案。。函数返回一个虚部非零的解。它的帮助页面中没有讨论如何选择搜索空间是复数还是实数。这显然是一个很大的区别,因为如果我们允许变量具有复杂的值,我们将给它两倍的自由度 让我陷入困境的具体例子是: >> fsolve@x[-expx1*x2^0.9+expx1.*1+x2.^0.9-1-1e-7。。。 expx1*x2^0.9*0.9*x1/x2^0.1],[10 1] 方程已解,可能不准确。 按默认值测量,函数值的向量接近于零 功能公差的定义。然而,最后一步是无效的。 ans= 1

有时,F解决方案。。函数返回一个虚部非零的解。它的帮助页面中没有讨论如何选择搜索空间是复数还是实数。这显然是一个很大的区别,因为如果我们允许变量具有复杂的值,我们将给它两倍的自由度

让我陷入困境的具体例子是:

>> fsolve@x[-expx1*x2^0.9+expx1.*1+x2.^0.9-1-1e-7。。。 expx1*x2^0.9*0.9*x1/x2^0.1],[10 1] 方程已解,可能不准确。 按默认值测量,函数值的向量接近于零 功能公差的定义。然而,最后一步是无效的。 ans= 18.3396+0.2529i-1.0000-0.0000i 如何将域限制为仅实数?

表示,如果目标函数返回复数,则F将解决。。自动切换以将输入变量也视为复杂变量

我不认为这是合乎逻辑的行为,但这就是它的工作方式。见下文

在问题的示例中,这可能是因为F解决了。。调用匿名函数,其中x2在某个点为负,然后该函数将其提升到0.1的幂,生成复杂的输出

无论如何,上面帖子中的两条建议是

约束域

或者调整函数,使其不返回复数

现在,在fsolve的帮助页面上没有关于域边界的说明,但是通过检查,发现有一个函数lsqnonlin..,它与fsolve..非常相似,只是它允许我们指定变量的下限和上限。此外,它使用相同的输入格式和算法,唯一显著的区别是它不包括fsolve.的信赖域折线法。。是的

这解决了我的问题

另一个想法,使用变量的变化,也可以工作

如果一个函数返回复杂的值,并且我们想要找到一个它为零的点,那么我们将有效地使用一个等式对输入变量设置两个约束。为什么这意味着我们的搜索空间是复杂的?这些问题是独立的。但是F解决了。。努力帮助别人。一旦你知道这件事正在发生,你就很容易摆脱它。