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

标签 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

如何将域名限制为仅限实数?

最佳答案

This post by MathWorks Support表示如果目标函数返回复数,则 fsolve(..)自动切换以将输入变量也视为复杂。

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

在问题的示例中,这可能会发生,因为 fsolve(..)使用 x(2) 调用匿名函数在某个时刻为负数,然后该函数将其提升为 0.1 次方,产生复杂的输出。

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

  1. 限制域。

  2. 或者调整函数以不返回复数。

现在,fsolve 上没有记录任何方法。的帮助页面限制域,但检查 this answer ,原来有一个函数 lsqnonlin(..) ,与 fsolve(..) 非常相似,除了它确实允许我们指定变量的下限和上限。此外,它使用相同的输入格式和算法,唯一明显的区别是它不包括“信任区域狗腿”方法,即 fsolve(..)确实如此。

这解决了我的问题。

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


<咆哮> 如果一个函数返回复数值,并且我们想找到一个为零的点,那么我们只需使用一个方程就可以有效地对输入变量设置两个约束。为什么这意味着我们的搜索空间很复杂?这些问题是独立的。但是fsolve(..)尽力提供帮助。一旦你知道它正在发生,就很容易解决这个问题。

关于matlab - fsolve 返回复杂的解决方案 - 如何仅限于实际搜索空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588744/

相关文章:

algorithm - 在此代码段中是否可以进行预分配?

java - Matlab to Java-如何像在MATLAB中那样在Java中绘制数据并显示图像?

math - 时间修正的 Verlet 数值积分公式

algorithm - 连接所有岛屿的最低成本是多少?

algorithm - 优化 - 最大化加权贡献的最小值

matlab - 高斯-赛德尔法超过机器数?

python - 将分布拟合到 scipy 中的计数器

matlab - 在灰度图像 MATLAB 上绘制蒙版

matlab - 在 Matlab 中创建 2D 频谱图

mathematical-optimization - 我如何最好地解决此优化问题?