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