- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Scipy 提供了几个看似等价的函数来求函数在给定区间内的根:
brentq(f, a, b[, args, xtol, rtol, maxiter, ...]) Find a root of a function in given interval.
brenth(f, a, b[, args, xtol, rtol, maxiter, ...]) Find root of f in [a,b].
ridder(f, a, b[, args, xtol, rtol, maxiter, ...]) Find a root of a function in an interval.
bisect(f, a, b[, args, xtol, rtol, maxiter, ...]) Find root of a function within an interval.
(参见 this webpage 。)
任何人都可以提供一些指南来选择其中一个而不是其他吗?找到适合我的案例的最佳策略是简单的反复试验吗?
最佳答案
brentq
brentq
声称是问题中四个函数中最好的。它的文档字符串是这样的
Generally considered the best of the rootfinding routines here.
但是,它有(至少)两个烦人的特性:
1) 它要求f(a)
与f(b)
有不同的符号。
2)如果a
是一个非常小的正数(大到1e-3
),它偶尔会返回0.0
作为解-- 即,它返回提交范围之外的解决方案。
brenth
brenth
共享上面 brentq
的功能 1。
骑手
ridder
共享 brentq
的功能 1,上面。
平分
bisect
与上述 brentq
的功能 1 相同,并且比其他功能慢。
我意识到我可以通过取函数 f
输出的绝对值将我的求根问题转化为最小化问题。 (另一种选择是取 f
输出的平方。)Scipy 提供了几个用于标量函数的有界最小化的函数:
fminbound(func, x1, x2[, args, xtol, ...]) Bounded minimization for scalar functions.
brent(func[, args, brack, tol, full_output, ...]) Given a function of one-variable and a possible bracketing interval, return the minimum of the function isolated to a fractional precision of tol.
brute(func, ranges[, args, Ns, full_output, ...]) Minimize a function over a given range by brute force.
fminbound
我唯一的提示是它太慢了。它没有要求 f(a)
与 f(b)
具有不同符号的限制。
布伦特
对于其括号区间[a, b]
,brent
要求f(a)
小于f(b )
。其解不保证在[a, b]
内。
粗暴
brute
当然非常慢(取决于 Ns
参数的值),而且奇怪的是,可能会返回超出提交范围的解决方案。
综上所述,我使用 this answer 中的方法获得了最佳结果-- 即,在尚未发布的 scipy 版本中使用函数 least_squares
。此功能不受上述限制。
关于python - scipy 中的有界根查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32814173/
我是一名优秀的程序员,十分优秀!