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中的有界根查找的主要内容,如果未能解决你的问题,请参考以下文章

opengl中的有界框碰撞检测

如何确保 MS Access 中的有界表单和子表单仅在单击按钮后提交到数据库?

应用程序服务是否可以在DDD中的有界上下文中调用其他应用程序服务?

覆盖较低的有界参数

带细节的有界可拖动元素

Razor 视图的有界属性在发布后未更新