最適化でのsimFunctionの使用

多くの場合、解析は単純な準静解析や過渡解析ではありません。解析の実行では、いくつかのシミュレーションが関係することがあります。シミュレーションとシミュレーションの間で、エンティティが変更されたり、アクティブ化または非アクティブ化されたりすることもあります。これらはすべて、イベント主導の高度なロジックによって管理されています。このようなモデルを最適化する方法を検討します。

その方法とは、最適化エンジンでsimFunctionを使用して、解析スクリプトを定義することです。simFunctionは、必要とする任意のロジックの中でMotionSolveコマンドを任意に組み合わせて実行できるようにするユーザーサブルーチンです。SimFunctionを指定すると、最適化エンジンでは、コストまたは感度を評価する必要がある場合は必ずSimFunctionが起動します。

simFunctionを記述する際に従う一般的な規則の一部を以下に示します。

唯一の引数: model

simFunctionにある引数はmodelの1つのみです。SimFunctionの内部では、Modelオブジェクトを使用して、シミュレーションの起動、Modelデータへのアクセス、Modelデータの変更などが可能です。

シミュレーション実行時の出力抑制

シミュレーション実行時には出力を抑制した方が良いと考えられる場合があります。これは、そのようにしないと、最適化の実行中にあまりに多くの情報が出力されることになる場合です。出力を抑制するには、output=’Off’を設定します。この設定は必須ではありません。

モデルに対する変更の取り消しと初期定義の復元

simFunctionで結果を返す前に、必ずすべての変更を元に戻します。モデルは個別の実行ごとに同一であることが必要なので、元のステージにリセットする必要があります。例えば、実行の前にpart1の質量を3kgから5kgに変更した場合、実行後には質量を3kgにリセットする必要があります。

すべての規則に従った例を以下に示します:

def simulate_function_pid(model):

  # Perform initial static
  run = model.simulate (type=’STATICS’, returnResults=True, output=’Off’)

  # Initial dynamic run to reach desired configuration
  run = model.simulate (type=’DYNAMICS’, end=10, dtout=0.01, dsa='NONE', 
          returnResults=True, output=’Off’)

  # Activate the damper force
  model.damper.active = False

  # Now perform a dynamic run, with DSA turned on
  run = model.simulate (type=’DYNAMICS’, end=100, dtout=0.01, dsa='AUTO', 
          returnResults=True, output=’Off’)

  # Return model back to original topology
  model.force.active = True

  # Return the results for live processing
  return run