scipy.optimize 的 'root' 和 'fixed_point' 方法有什么区别
What is the difference between scipy.optimize's 'root' and 'fixed_point' methods
scipy.optimize中有两种方法,分别是root
和fixed_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) = x
和 g(x) = f(x) + x
不太可能有帮助。
方法fixed_point
迭代提供的函数,可选择进行调整,使收敛更快/更有可能。如果迭代值从固定点移动 away(repelling 固定点),这将是有问题的,尽管进行了调整,这仍可能发生。一个例子:直接求解 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
直接回答问题:区别在于使用的方法。不动点求解器非常简单,它是给定函数的迭代,通过某种加速收敛。如果那不起作用(而且通常不起作用),那就太糟糕了。求根方法更复杂,更健壮,应该优先考虑。
scipy.optimize中有两种方法,分别是root
和fixed_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) = x
和 g(x) = f(x) + x
不太可能有帮助。
方法fixed_point
迭代提供的函数,可选择进行调整,使收敛更快/更有可能。如果迭代值从固定点移动 away(repelling 固定点),这将是有问题的,尽管进行了调整,这仍可能发生。一个例子:直接求解 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
直接回答问题:区别在于使用的方法。不动点求解器非常简单,它是给定函数的迭代,通过某种加速收敛。如果那不起作用(而且通常不起作用),那就太糟糕了。求根方法更复杂,更健壮,应该优先考虑。