Я не знаком с вызовом функций DLL в MATLAB, но это пример на Python. FMPy (https://github.com/CATIA-Systems/FMPy) имеет эти оболочки для запуск FMU на Python.
Я тестировал это на простой модели, которую написал здесь (Как получить доступ к модельному якобиану из FMU или Димола без аналитического якобиана). В этом случае известные значения - это ссылки на значения состояний или входов, неизвестные - это ссылки на значения производных инструментов или выходов.
Мне удалось извлечь якобиан при экспорте через Dymola как Model Exchange FMU, но не Co-Simulation FMU.
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]
person
Srikanth Sivaramakrishnan
schedule
17.09.2020