如何解决如何使用“ fmi2GetDirectionalDerivative”?
我正在尝试从FMU中获取模型Jacobian矩阵,根据以下文献,我可以使用fmi2GetDirectionalDerivative
来做到这一点,但是我不确定我到底需要做些什么。
我的问题是:
- 我可以在Dymola或MATLAB中调用此函数吗?
- 截图或示例非常有帮助。
https://ep.liu.se/ecp/132/091/ecp17132831.pdf
解决方法
我不熟悉在MATLAB中调用DLL函数,但这是Python中的示例。 FMPy(https://github.com/CATIA-Systems/FMPy)具有这些包装程序,用于在python中运行FMU。
我已经针对我在此处编写的简单模型(How to access model jacobian from FMU or Dymola without analytical jacobian)进行了测试。在这种情况下,已知是状态或输入的值引用,未知是导数或输出的值引用。
当通过Dymola导出为模型交换FMU而不是协同仿真FMU时,我已经成功提取了Jacobian。
def get_jacobian(fmu,vr_knowns,vr_unknowns):
"""
populates jacobian from list of knowns and unknowns
can be only called after the current sim time and inputs are set
"""
jacobian = []
try:
for vr_known in vr_knowns:
for vr_unknown in vr_unknowns:
jacobian.extend(
fmu.getDirectionalDerivative(
vUnknown_ref=[vr_unknown],vKnown_ref=[vr_known],dvKnown=[1.0]
))
print_status(f'Jacobian Elements: {jacobian}')
except Exception as e:
print("[ERROR] cannot compute jacobian at current timestep")
print(f"[ERROR] {e}")
我使用此代码段使用FMPy收集状态和派生类的值引用:
# get FMU model description object
model_description = fmpy.read_model_description(
os.path.join(fmu_path,fmu_filename)
)
# collect the value references
vrs = {}
for variable in model_description.modelVariables:
vrs[variable.name] = variable.valueReference
# collect list of states and derivatives
states = []
derivatives = []
for derivative in model_description.derivatives:
derivatives.append(derivative.variable.name)
states.append(re.findall('^der\((.*)\)$',derivative.variable.name)[0])
# collect the value references for states and derivatives
vr_states = [vrs[x] for x in states]
vr_derivatives = [vrs[x] for x in derivatives]
,
在最近的2020年NAM Modelica会议上,三菱电机发表了一篇论文,可能与之相关。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。