有时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
如何仅将域限制为实数?
答案 0 :(得分:2)
This post by MathWorks Support表示如果目标函数返回一个复数,那么fsolve(..)
会自动切换为将输入变量视为复数。
我不认为这是合乎逻辑的行为,但这就是它的运作方式。见下面的咆哮。
在问题的示例中,可能会发生这种情况,因为fsolve(..)
调用匿名函数,x(2)
在某个时刻为负值,然后函数会升至0.1
的幂,从而产生一个复杂的输出。
无论如何,上述帖子中的两条建议是
限制域名。
或调整功能不返回复数。
现在,无法记录fsolve
关于域名的帮助页面,但检查this answer,结果发现有一个函数 {{1 }},它与lsqnonlin(..)
非常相似,只是它允许我们指定变量的上限和上限。此外,它使用相同的输入格式和算法,唯一明显的区别是它不包括&#34;信任区域狗腿洞&#34;方法,fsolve(..)
。
这解决了我的问题。
使用变量变化的另一个想法也可以起作用。
&LT;咆哮&GT;
如果函数返回复数值并且我们想要找到它为零的点,我们将仅使用一个等式有效地设置输入变量的两个约束。为什么这意味着我们的搜索空间很复杂?这些问题是独立的。但fsolve(..)
试图提供帮助。一旦你知道它发生了,很容易解决这个问题。
&LT; /咆哮&GT;