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

What is the difference between scipy.optimize's 'root' and 'fixed_point' methods

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

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

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

如何确定要使用的函数?

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

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

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

方法fixed_point迭代提供的函数,可选择进行调整,使收敛更快/更有可能。如果迭代值从固定点移动 awayrepelling 固定点),这将是有问题的,尽管进行了调整,这仍可能发生。一个例子:直接求解 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

直接回答问题:区别在于使用的方法。不动点求解器非常简单,它是给定函数的迭代,通过某种加速收敛。如果那不起作用(而且通常不起作用),那就太糟糕了。求根方法更复杂,更健壮,应该优先考虑。