【问题标题】:Vectorized version of Brent's algorithm (root-finding)布伦特算法的矢量化版本(寻根)
【发布时间】:2015-11-23 06:01:55
【问题描述】:

我正在研究海水状态方程的 Python 版本 (http://www.teos-10.org/)。该库依赖于像p = f(t,d) 这样的反演方程,如果您知道td,您可以直接计算f(t,d),但您通常有tp。这只是一个寻根问题,该库提供了使用牛顿法、二分法或布伦特法的选项。 (特别是对于布伦特方法,请参阅 wiki https://en.wikipedia.org/wiki/Brent%27s_method。)

但是,库会找到 tp 的单个值的根。我希望我的版本可以用于绘制和探索状态方程,所以我想允许tp 的向量(numpy 数组)值。将牛顿法和二等分法向量化相当简单,但布伦特法有很多我无法理解的条件。

关于如何矢量化此方法的任何提示?更重要的是,这种向量化实际上会比循环 tp 数组中的值更快吗?

【问题讨论】:

  • 我认为您不只是使用scipy.optimize.brent 是有原因的?
  • 问题的设置是根据tpd 找到g(d; t,p)=0 的根。我希望能够将数组用于tp,而不是标量,据我所知,标准 scipy.optimize 没有这样做。

标签: python numpy vectorization mathematical-optimization


【解决方案1】:

如果您编写任何迭代方法的完全向量化或面向数组的版本,它可能会变得非常低效。例如,您可能需要在一小部分范围内进行大量迭代,而大部分范围会收敛于少量迭代。

您可以使用 Brent 方法在 td 值的粗网格上求解您的方程。然后使用这些解决方案值对中间细网格值进行更接近的初始猜测,例如使用双三次样条插值。如果这些初始猜测足够接近二次收敛,则不需要对中间值使用布伦特方法。您可以使用 Brent 方法自适应地填充粗网格,并使用矢量化 Newton 方法将最终填充到更精细的网格。

【讨论】:

  • 在这种情况下,库对初始值有许多很好的近似值,所以我认为它不会浪费迭代尝试获得一致收敛。至少,我想测试一个矢量化版本,看看它是否比遍历数组慢。
猜你喜欢
  • 2010-12-30
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多