我正在研究海水状态方程(http://www.teos-10.org/)的Python版本。该库依赖于诸如p = f(t,d)
的反演方程式,如果您知道f(t,d)
和t
,但通常具有d
和t
,则可以直接计算p
。这只是一个根本的问题,该库附带了使用牛顿,二分法或布伦特方法的选项。 (特别是有关Brent方法的信息,请参见Wiki https://en.wikipedia.org/wiki/Brent%27s_method。)
但是,该库会找到t
和p
的单个值的根。我希望我的版本可用于绘制和探索状态方程,因此我想允许t
和p
的矢量(numpy数组)值。向量化牛顿法和二等分法非常简单,但是布伦特方法有很多条件,我无法理解。
关于如何向量化此方法的任何提示?更重要的是,矢量化实际上比循环遍历t
和p
数组中的值更快吗?
最佳答案
如果编写任何迭代方法的完全矢量化或面向数组的版本,则效率可能非常低。例如,您可能需要在范围的一小部分上进行大量的迭代,而您的大多数范围只能在少量的迭代中收敛。
您可以使用Brent方法在t
和d
值的粗网格上求解方程。然后,使用这些解值,例如使用双三次样条插值,可以对中间细网格值获得更接近的初始猜测。如果这些初始猜测足够接近二次收敛,则不需要在中间值上使用Brent方法。您可以使用Brent方法自适应地填充粗网格,并使用矢量化牛顿方法对最终网格进行最终填充。