2015-11-23 31 views
0

我正在研究海水狀態方程的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的根。我想讓我的版本可以繪製和探索狀態方程,所以我想允許向量(numpy數組)的值爲tp。向量化牛頓和對分方法相當簡單,但布倫特方法有很多條件,我無法理解。

有關如何矢量化此方法的任何提示?更重要的是,該向量化實際上是否比循環遍歷tp數組中的值更快?

+0

我假設你不僅僅使用['scipy.optimize.brent'](http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy。 optimize.brent.html)? –

+0

這個問題的設置是用't'和'p'來爲'd'找出'g(d; t,p)= 0'的根。據我所知,我希望能夠將數組用於't'和'p'而不是標量,標準scipy.optimize不會這樣做。 –

回答

2

如果您編寫任何迭代方法的完全矢量化或面向數組的版本,它可能會非常低效。例如,您可能需要在範圍的一小部分上進行大量迭代,而大部分範圍都會收斂於少量迭代。

您可以用布倫特方法通過粗糙網格td來求解方程。然後使用這些解決方案值對中間細網格值進行更加接近的初始猜測,例如使用雙三次樣條插值。如果這些初始猜測足夠接近二次收斂,那麼在中間值上不需要布倫特方法。您可以使用布倫特方法自適應地填充粗糙網格,並使用向量化牛頓方法對最終網格進行最終填充。

+0

在這種情況下,庫對初始值有很多很好的近似值,所以我不認爲它會浪費迭代來試圖實現一致收斂。至少,我想測試一個矢量化版本,只是爲了看看它是否比循環數組慢。 –