私は複雑なステップを使用して、OpenMDAOの単純なコンポーネントの派生物を取得しようとしています。私は分析の派生物を持っていますが、私は複雑なステップとパフォーマンスを比較したいと思います。これは大きな設計問題の一部です。OpenMDAOコンポーネントで複雑なステップが期待通りに機能しない
import numpy as np
from openmdao.api import IndepVarComp, Component, Problem, Group
class SpatialBeamDisp(Component):
def __init__(self, ny):
super(SpatialBeamDisp, self).__init__()
self.ny = ny
self.add_param('disp_aug', val=np.zeros(((self.ny+1)*6), dtype='complex'))
self.add_output('disp', val=np.zeros((self.ny, 6), dtype='complex'))
# Comment out this line to use analytic derivatives
self.deriv_options['type'] = 'cs'
def solve_nonlinear(self, params, unknowns, resids):
# Obtain the relevant portions of disp_aug and store the reshaped
# displacements in disp
unknowns['disp'] = params['disp_aug'][:-6].reshape((self.ny, 6))
def linearize(self, params, unknowns, resids):
jac = self.alloc_jacobian()
n = self.ny * 6
jac['disp', 'disp_aug'] = np.hstack((np.eye((n)), np.zeros((n, 6))))
return jac
top = Problem()
root = top.root = Group()
n = 5
disp_aug = np.random.random(((n+1) * 6))
root.add('disp_input', IndepVarComp('disp_aug', disp_aug), promotes=['*'])
root.add('disp_', SpatialBeamDisp(n), promotes=['*'])
top.setup()
top.run_once()
top.check_partial_derivatives(compact_print=True)
self.deriv_options['type' = 'cs'
行をコメントアウトし、解析式を使用して正しいヤコビ行列を生成しながら、誤ったヤコビ行列を生成そのままこのコードを実行する:
ここで最小の例です。
私はUbuntuでOpenMDAO 1.7.3とnumpy 1.10.2を使用しています。
複雑なステップの導関数を正しく設定していませんか?もしそうなら、このコンポーネントをどのようにして複雑なステップ対応にするべきですか?
私は元のコードショーがうまくいたように感じていますが、私はリシェイプラインを取り除き、それを明示的な割り当てループに置き換えることで、この問題を解決しました。 –