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

时间:2014-08-31 03:41:42

标签: matlab mathematical-optimization numerical-methods complex-numbers least-squares

有时Matlab中的fsolve(..)函数会返回一个非零虚部的解。在其帮助页面中没有讨论如何选择搜索空间是复值还是实值。显然存在很大的差异,因为如果我们允许变量采用复杂的值,我们会给它两倍的自由度。

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

>> fsolve(@(x) [-exp(x(1)*x(2)^0.9)+exp(x(1).*(1+x(2)).^0.9) - (1-1e-7), ...
                 exp(x(1)*x(2)^0.9)*0.9*x(1)/x(2)^(0.1)], [10 1])

Equation solved, inaccuracy possible.

The vector of function values is near zero, as measured by the default value
of the function tolerance. However, the last step was ineffective.

<stopping criteria details>


ans =

  18.3396 + 0.2529i  -1.0000 - 0.0000i

如何仅将域限制为实数?

1 个答案:

答案 0 :(得分:2)

This post by MathWorks Support表示如果目标函数返回一个复数,那么fsolve(..)会自动切换为将输入变量视为复数。

我不认为这是合乎逻辑的行为,但这就是它的运作方式。见下面的咆哮。

在问题的示例中,可能会发生这种情况,因为fsolve(..)调用匿名函数,x(2)在某个时刻为负值,然后函数会升至0.1的幂,从而产生一个复杂的输出。

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

  1. 限制域名。

  2. 或调整功能不返回复数。

  3. 现在,无法记录fsolve关于域名的帮助页面,但检查this answer,结果发现有一个函数 {{1 }},它与lsqnonlin(..)非常相似,只是它允许我们指定变量的上限和上限。此外,它使用相同的输入格式和算法,唯一明显的区别是它不包括&#34;信任区域狗腿洞&#34;方法,fsolve(..)

    这解决了我的问题。

    使用变量变化的另一个想法也可以起作用。


    &LT;咆哮&GT;  如果函数返回复数值并且我们想要找到它为零的点,我们将仅使用一个等式有效地设置输入变量的两个约束。为什么这意味着我们的搜索空间很复杂?这些问题是独立的。但fsolve(..)试图提供帮助。一旦你知道它发生了,很容易解决这个问题。 &LT; /咆哮&GT;