¿Cómo puedo usar 'fmi2GetDirectionalDerivative'?

Sep 17 2020

Estoy tratando de obtener el modelo de matriz jacobiana de FMU, de acuerdo con la siguiente literatura, podría usar fmi2GetDirectionalDerivativepara hacer esto, pero no estoy seguro de qué debo hacer exactamente.

Mi pregunta es:

  1. ¿Puedo llamar a esta función en Dymola o MATLAB?
  2. Una captura de pantalla o un ejemplo sería muy útil.

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

Respuestas

4 SrikanthSivaramakrishnan Sep 17 2020 at 23:21

No estoy familiarizado con las funciones de llamada DLL en MATLAB, pero este es un ejemplo en Python. FMPy (https://github.com/CATIA-Systems/FMPy) tiene estos contenedores para ejecutar FMU en python.

Probé esto para un modelo simple que escribí aquí ( Cómo acceder al modelo jacobian desde FMU o Dymola sin jacobian analítico ). En este caso, los conocidos son referencias de valor de estados o entradas, las incógnitas son referencias de valor de derivadas o salidas.

He tenido éxito al extraer el jacobiano cuando lo exporté a través de Dymola como Model Exchange FMU pero no como 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}")

Utilizo este fragmento de código para recopilar las referencias de valor para los estados y derivados que usan 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]
DagB Oct 02 2020 at 15:47

Hubo un documento de Mitsubishi Electric en la reciente Conferencia NAM Modelica 2020 que podría estar relacionado.