scipy中的有界根查找
Posted
技术标签:
【中文标题】scipy中的有界根查找【英文标题】:Bounded root finding in scipy 【发布时间】:2015-12-25 04:11:30 【问题描述】:Scipy 提供了几个看似等效的函数,用于在给定区间内查找函数的根:
brentq(f, a, b[, args, xtol, rtol, maxiter, ...]) 求给定区间内函数的根。
brenth(f, a, b[, args, xtol, rtol, maxiter, ...]) 在 [a,b] 中求 f 的根。
ridder(f, a, b[, args, xtol, rtol, maxiter, ...]) 在区间内求函数的根。
bisect(f, a, b[, args, xtol, rtol, maxiter, ...]) 在区间内求函数的根。
(见this webpage。)
谁能提供一些指导方针来选择其中一个而不是其他?找到适合我的案例的最佳策略是简单的反复试验吗?
【问题讨论】:
【参考方案1】:brentq
brentq
声称是问题中四个函数中最好的。它的文档字符串为
这里通常被认为是最好的寻根例程。
但是,它(至少)有两个烦人的功能:
1) 它要求f(a)
与f(b)
有不同的符号。
2) 如果a
是一个非常小的正数(与1e-3
一样大),它偶尔会返回0.0
作为解——即,它返回提交范围之外的解。
brenth
brenth
分享brentq
的功能 1,如上。
ridder
ridder
分享brentq
的功能 1,如上。
bisect
bisect
共享brentq
的上述功能 1,并且比其他功能慢。
最小化方法
我意识到我可以通过获取函数f
的输出的绝对值来将求根问题转化为最小化问题。 (另一种选择是取 f
的输出的平方。)Scipy 提供了几个函数用于标量函数的有界最小化:
fminbound(func, x1, x2[, args, xtol, ...]) 标量函数的有界最小化。
brent(func[, args, brack, tol, full_output, ...]) 给定一个单变量函数和一个可能的括号区间,返回隔离到小数精度 tol 的函数的最小值。
brute(func, range[, args, Ns, full_output, ...]) 通过蛮力在给定范围内最小化函数。
fminbound
我唯一的抱怨是它很慢。它没有要求f(a)
与f(b)
具有不同符号的限制。
brent
对于其包围区间[a, b]
,brent
要求f(a)
小于f(b)
。其解不保证在[a, b]
之内。
brute
brute
当然非常慢(取决于Ns
参数的值),而且奇怪的是,它可能会返回提交范围之外的解决方案。
结论
综上所述,我使用this answer 中的方法获得了最好的结果——即,在尚未发布的 scipy 版本中使用函数least_squares
。此功能没有上述限制。
【讨论】:
以上是关于scipy中的有界根查找的主要内容,如果未能解决你的问题,请参考以下文章
如何确保 MS Access 中的有界表单和子表单仅在单击按钮后提交到数据库?