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

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

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

最佳答案

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

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

10-08 08:10
查看更多