Как я могу использовать fmi2GetDirectionalDerivative?

Я пытаюсь получить модель матрицы Якоби из FMU, согласно следующей литературе, я мог бы использовать fmi2GetDirectionalDerivative для этого, но я не уверен, что именно мне нужно делать.

У меня вопрос:

  1. Могу ли я вызвать эту функцию в Dymola или MATLAB?
  2. Снимок экрана или пример были бы очень полезны.

https://ep.liu.se/ecp/132/091/ecp17132831.pdf

введите описание изображения здесь


person Jack    schedule 16.09.2020    source источник


Ответы (2)


Я не знаком с вызовом функций 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

На недавней конференции NAM Modelica Conference 2020 был документ от Mitsubishi Electric, который может иметь отношение.

person Dag B    schedule 02.10.2020