scipy.optimize 的“root”和“fixed_point”方法有什么区别

Der*_*Weh 4 python mathematical-optimization scipy

scipy.optimize 中有两种方法,分别是rootfixed_point

我很惊讶地发现它root提供了很多方法,而fixed_point只有一种。在数学上,两者是相同的。它们将 的以下不动点g(x)与 的根相关联f(x)

[ g(x) = f(x) - x ]

如何确定使用哪个函数?

此外,这两种方法都不允许我指定定义函数的区域。有没有办法限制范围x

小智 7

总结:如果您不知道该使用什么,请使用root. fixed_point如果您的问题自然是一个定点问题g(x) = x,在这种情况下可以合理地预期迭代g 将有助于解决问题(即g具有一些非扩展行为),则该方法值得考虑。否则,使用root或其他东西。

尽管每个求根问题在数学上都等同于不动点问题,但从数值方法的角度重新表述它并不总是有益的。有时是这样,就像在牛顿方法中一样。但是琐碎的重述,替换f(x) = 0as g(x) = xwithg(x) = f(x) + x不太可能有帮助。

该方法fixed_point 迭代提供的函数,可选地进行调整,使收敛更快/更有可能。如果迭代值远离固定点(排斥固定点),这将是有问题的,尽管进行了调整,这可能会发生。一个例子:exp(x) = 1直接求解并作为 的不动点问题exp(x) - 1 + x,具有相同的起点:

import numpy as np
from scipy.optimize import fixed_point, root

root(lambda x: np.exp(x) - 1, 3)  # converges to 0 in 14 steps
fixed_point(lambda x: np.exp(x) - 1 + x, 3) # RuntimeError: Failed to converge after 500 iterations, value is 2.9999533400931266
Run Code Online (Sandbox Code Playgroud)

直接回答这个问题:不同之处在于所使用的方法。定点求解器非常简单,它是给定函数的迭代,由某种收敛加速推动。当这不起作用(并且通常不起作用)时,太糟糕了。寻根方法更复杂、更健壮,应该是首选。