有时,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
次方,产生复杂的输出。
无论如何,上面帖子中的两个建议是
限制域。
或者调整函数以不返回复数。
现在,fsolve
上没有记录任何方法。的帮助页面限制域,但检查 this answer ,原来有一个函数 lsqnonlin(..)
,与 fsolve(..)
非常相似,除了它确实允许我们指定变量的下限和上限。此外,它使用相同的输入格式和算法,唯一明显的区别是它不包括“信任区域狗腿”方法,即 fsolve(..)
确实如此。
这解决了我的问题。
另一个想法,即使用变量的变化,也可以工作。
<咆哮>
如果一个函数返回复数值,并且我们想找到一个为零的点,那么我们只需使用一个方程就可以有效地对输入变量设置两个约束。为什么这意味着我们的搜索空间很复杂?这些问题是独立的。但是fsolve(..)
尽力提供帮助。一旦你知道它正在发生,就很容易解决这个问题。
兰特>
关于matlab - fsolve 返回复杂的解决方案 - 如何仅限于实际搜索空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588744/