gpt4 book ai didi

python - scipy 中的有界根查找

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:49 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com