2016-02-22 101 views
0

所以我從舊OpenMDAO轉換代碼到新OpenMDAO。所有輸出和部分漸變已被驗證爲正確。起初問題根本不會優化,然後我意識到舊代碼有一些組件不提供梯度,因此它們自動有限差異。所以我給這些組件添加了fd_options ['force_fd'] = True,但它仍然沒有優化到正確的值。我檢查了總衍生物,但它仍然不正確。與舊的OpenMDAO相比,每次迭代還需要相當長的時間。我可以讓我的新代碼優化到與舊的OpenMDAO代碼相同的值的唯一方法是將每個組件設置爲有限差異,即使在提供漸變的組件上也是如此。所以我對如何有限差分舊的和新的OpenMDAO之間工作的幾個問題:有限差分

  1. 當舊OpenMDAO沒有自動有限差分也只做到這一點就需要進行優化的輸出和輸入或做到了計算所有輸入和輸出的整個雅可比矩陣?當您將'force_fd'設置爲True時,新的OpenMDAO也會出現同樣的問題。
  2. 你能提供組件的雅可比的某些部分,並把它有限差分休息嗎?在舊的OpenMDAO中,除非你把missing_deriv_policy ='assume_zero',否則沒有提供任何梯度的有限差異?

回答

2
  1. 所以,老OpenMDAO尋找沒有衍生物組件組,捆紮它們一起放到這可能是有限差分在一起的基團。新的OpenMDAO沒有這樣做,所以這些組件中的每一個將分別進行有限差異化。

  2. 我們不支持着呢,老OpenMDAO沒有。儘管我們的關鍵跟蹤器確實有一個故事,所以我們最終會擁有這個功能。

我懷疑可能會發生的事情是,在經典的OpenMDAO中,有限差分組碰巧更好。考慮一個具有一個輸入和10個輸出的組件,其連接到具有10個輸入和1個輸出的第二組件。如果你將它們有限地區分開來,只需要一次執行。如果您單獨有限地區分它們,則需要執行組件1,並執行組件10的10次執行。這可能導致顯着或甚至重大的性能下降。

個人FD VS FD組也可能導致精度問題,如果存在有很大的不同比例比其他變量,這樣的1.0E-6默認FD步長也是白搭重要的投入。 (注意:添加參數或輸出時,您可以設置step_size,並且它會覆蓋該變體的默認值。)

Luckilly,新的OpenMDAO有一種方法來重新創建舊版OpenMDAO中的內容,但它不是自動的。你需要做的是看看你的模型,並找出哪些組件可以一起FD'd,然後創建一個子組,並將這些組件移動到該組。您可以在組上將fd_options['force_fd']設置爲True,並且它將組合在一起的有限差異。例如,如果您有A→B→C,中間沒有組件,且沒有組件,則可以將A,B和C移動到一個新的子組中,並將force_fd設置爲True。

如果不解決的事情,我們可能要在你的模型更深入地看。

+0

所以我認爲你是對的,但我很難實施它。代碼中有許多依賴於其他組件的組件。我很難在所有地方找到所有的有限羣體。每次我嘗試做一個有限差分組時,都會想讓我改變求解器,這樣它就可以完成一個循環。我會盡我所能,但認爲改變新的OpenMDAO做自動有限差分也是非常棒的。謝謝! – Ry10

+0

如果你的模型非常複雜,你不能容易地識別手動提供衍生產品的組件鏈,那麼你可能需要首先解決模型複雜性問題。但另一種選擇是爲所有組件實施衍生產品! –