FMU机器学习模型

FMU machine learning model

我通过外部 C 函数在模拟环境(在此上下文中为 OpenModelica)中部署我的机器学习模型(已训练)取得了一些成功。

但是,为了使过程标准化,我的目标是使用 FMI 标准而不是外部 C 函数。因此,我需要将我的 ML 模型包装为 FMU。

有什么办法可以做到吗?我阅读了 PyFMI,但是,它似乎只控制 Python 环境中的协同仿真,而不是将您的 ML 模型包装为 FMU。

目标是从经过训练的 ML 模型生成 FMU,然后将此 FMU 部署到模拟环境(例如 OpenModelica)中。非常感谢任何帮助。

谢谢

假设您有两个 Modelica 模型 AB

model A
 output Real x (start=1,fixed=true);
equation
  der(x) = 2*x;
end A;
model B
  input Real x;
  Real y;
  
  function myExternalFunction
    input Real x;
    output Real y;
    external "C" annotation(Library="myExternalLib");
  end myExternalFunction;

equation
  y = myExternalFunction(x);
end B;

其中 B 正在使用来自 myExternalLib.dll 的一些外部函数 myExternalFunction。这可能是一个函数,使用您训练有素的网络从某个值 x.

预测某些 y

Modelica 中的外部函数已标​​准化,请参阅 Modelica specification 3.4, Section 12.9

现在您当然可以在新的 Modelica 模型中连接这些模型

model connectedAB
  A a;
  B b;
equation
  a.x = b.x;
end connectedAB;

现在是 FMU。 Functional Mock-up Interface 是定义容器以交换动态模型的标准。

有不同的工具可用,有些可以将动态模型导出为 FMU(例如 OpenModelica、Dymola 等),有些可以导入 FMU 来模拟它们(例如 PyFMI、OMSimulator)。当然,有些工具可以做到这两点。

因此模型 AB 可以导出为 FMU。 但是,它并不打算导出单个外部函数,例如 myExternalFunction.

因此在 OpenModelica 中您可以导出 A.fmuB.fmu,创建一个新的强连接 SSP 模型并将这些 FMU 添加为子模型。在引擎盖下 OMEdit 将使用 OMSimulator 来模拟 SSP/FMUs.

即使不打算这样做,您仍然可以将外部函数导出为 FMU。只需创建一个只调用外部函数的微型模型(或多或少就像我在 B 中所做的那样)。但是你不会从中得到任何好处。