Comment pourrais-je utiliser 'fmi2GetDirectionalDerivative'?

Sep 17 2020

J'essaie d'obtenir le modèle de matrice jacobienne de FMU, selon la littérature suivante, je pourrais l'utiliser fmi2GetDirectionalDerivativepour le faire, mais je ne suis pas sûr de ce que je dois faire exactement.

Ma question est:

  1. Puis-je appeler cette fonction dans Dymola ou MATLAB?
  2. Une capture d'écran ou un exemple serait très utile.

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

Réponses

4 SrikanthSivaramakrishnan Sep 17 2020 at 23:21

Je ne suis pas habitué à appeler des fonctions DLL dans MATLAB mais ceci est un exemple en Python. FMPy (https://github.com/CATIA-Systems/FMPy) a ces wrappers pour exécuter des FMU en python.

J'ai testé cela pour un modèle simple que j'ai écrit ici ( Comment accéder au modèle jacobien depuis FMU ou Dymola sans jacobien analytique ). Dans ce cas, les valeurs connues sont des références de valeur d'états ou d'entrées, les inconnues sont des références de valeur de dérivés ou de sorties.

J'ai réussi à extraire le Jacobian lorsqu'il est exporté via Dymola en tant que Model Exchange FMU mais pas 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}")

J'utilise cet extrait de code pour collecter les références de valeur pour les états et les dérivés à l'aide de 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

Il y avait un article de Mitsubishi Electric lors de la récente NAM Modelica Conference 2020 qui pourrait être lié.