布伦特算法的矢量化版本(找根)

时间:2015-11-23 06:01:55

标签: python numpy vectorization mathematical-optimization

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

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

有关如何对此方法进行矢量化的提示?更重要的是,该向量化实际上是否比循环tp数组中的值更快?

1 个答案:

答案 0 :(得分:3)

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

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