Jak mogę użyć „fmi2GetDirectionalDerivative”?

Sep 17 2020

Próbuję uzyskać modelową matrycę jakobian z FMU, zgodnie z poniższą literaturą mógłbym fmi2GetDirectionalDerivativeto zrobić, ale nie jestem pewien, co dokładnie muszę zrobić.

Moje pytanie brzmi:

  1. Czy mógłbym wywołać tę funkcję w Dymoli lub MATLABie?
  2. Zrzut ekranu lub przykład byłby bardzo pomocny.

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

Odpowiedzi

4 SrikanthSivaramakrishnan Sep 17 2020 at 23:21

Nie jestem zaznajomiony z wywoływaniem funkcji DLL w MATLAB-ie, ale to jest przykład w Pythonie. FMPy (https://github.com/CATIA-Systems/FMPy) ma te opakowania do uruchamiania FMU w Pythonie.

Przetestowałem to dla prostego modelu, który napisałem tutaj ( Jak uzyskać dostęp do modelu jakobian z FMU lub Dymola bez analitycznego jakobiana ). W tym przypadku znane są odniesieniami do wartości stanów lub wejść, nieznane są odniesieniami do wartości pochodnych lub wyjść.

Udało mi się wyodrębnić jakobian, gdy został wyeksportowany przez Dymola jako FMU do wymiany modeli, ale nie do ko-symulacji 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}")

Używam tego fragmentu kodu do zbierania odniesień do wartości dla stanów i pochodnych przy użyciu 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

Na niedawnej konferencji NAM Modelica 2020 pojawił się artykuł Mitsubishi Electric, który może być powiązany.