我试图找到一个二维优化问题的根,形式如下(下面不是实际的方程,因为它很长,这只是问题类型的一个例子)。
def my_function(a,b):
c = exp(a) + b
d = a + 2 - exp(b)
return c, d
我想知道 a 和 b,其中 c 和 d 为零。
到目前为止,我正在使用 scipy 优化库中的 fsolve,并将种子值作为我知道接近解的值传递。这很好用,尽管有时会失败,并且我收到有关求解器的错误“在过去的 10 次迭代中没有取得很好的进展”。
我想知道是否有一种方法/一般的良好做法可以使根查找更加稳健?
否则,我想尝试有界寻根。在 1D 中,可以使用 fminbound,但我找不到可以让我为 2D 问题指定边界的函数。
感谢任何帮助。
谢谢
最佳答案
总的来说,没有通用的方法可以使根查找更加稳健——scipy.optimize 中有这么多不同的函数是有原因的!
一个技巧不是寻找 f(x) 的根,而是尝试寻找 f^2(x) 的最小值。寻找最小值通常更稳健,因为算法只需要继续下坡到底部。然而,缺点是找到的最小值可能不在 f(x)=0(即不是根)。
因此,您可以尝试 scipy.optimize.fmin_tnc,这是一个有边界的最小化器,看看会发生什么。
好的猜测总是有帮助的,但“接近”可能并不总是最好的 - 您可能会更深入地研究函数并弄清楚“接近”的景观到底是什么样子,如果“接近”(或远! ) 在不同的方向上对求解器来说可能更容易(也就是说,一个方向可能非常起伏,需要翻山越岭才能找到山谷,而另一个方向有一条通往山谷底部的美丽宽阔路径)。
关于python - 根查找偶尔会失败。 fSolve 可以给出二维优化的限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28241345/