Jak mogę użyć „fmi2GetDirectionalDerivative”?
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:
- Czy mógłbym wywołać tę funkcję w Dymoli lub MATLABie?
- Zrzut ekranu lub przykład byłby bardzo pomocny.
https://ep.liu.se/ecp/132/091/ecp17132831.pdf
Odpowiedzi
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]
Na niedawnej konferencji NAM Modelica 2020 pojawił się artykuł Mitsubishi Electric, który może być powiązany.