Come posso usare "fmi2GetDirectionalDerivative"?

Sep 17 2020

Sto cercando di ottenere il modello di matrice Jacobiana dalla FMU, secondo la seguente letteratura, potrei usare fmi2GetDirectionalDerivativeper farlo, ma non sono sicuro di cosa devo fare esattamente.

La mia domanda è:

  1. Posso chiamare questa funzione in Dymola o MATLAB?
  2. Uno screenshot o un esempio sarebbe molto utile.

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

Risposte

4 SrikanthSivaramakrishnan Sep 17 2020 at 23:21

Non ho familiarità con la chiamata di funzioni DLL in MATLAB, ma questo è un esempio in Python. FMPy (https://github.com/CATIA-Systems/FMPy) ha questi wrapper per eseguire FMU in python.

L'ho testato per un modello semplice che ho scritto qui ( Come accedere al modello jacobiano da FMU o Dymola senza jacobiano analitico ). In questo caso, i noti sono riferimenti di valore di stati o ingressi, gli incogniti sono riferimenti di valore di derivati ​​o uscite.

Ho avuto successo estraendo il Jacobian quando esportato tramite Dymola come Model Exchange FMU ma non 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}")

Uso questo frammento di codice per raccogliere i riferimenti ai valori per stati e derivati ​​utilizzando 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

C'era un documento di Mitsubishi Electric alla recente conferenza NAM Modelica 2020 che potrebbe essere correlato.