回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p><strong>主要目标</strong></p>
<p>区域供热管网灵敏度分析。在</p>
<p><strong>方法</strong></p>
<ol>
<li><p>使用AixLib和构建系统库的系统的Modelica模型(在Dymola中)</p></li>
<li><p>将模型导出为FMU协同仿真</p></li>
<li><p>使用SALib(敏感度分析python库)定义样本(参数扫描)</p></li>
<li><p>使用PyFMI在Python中的for循环中为所有单个样本运行模型(并并行化for循环,可能使用<a href="https://www.cnpython.com/pypi/joblib" class="inner-link">joblib</a>在多个处理器上执行模拟)</p></li>
<li><p>SALib将执行基于方差的敏感性分析(<a href="http://salib.readthedocs.io/en/latest/basics.html#an-example" rel="nofollow noreferrer">http://salib.readthedocs.io/en/latest/basics.html#an-example</a>)</p></li>
</ol>
<p><strong>第一步</strong></p>
<p>Ishigami函数的简单modelica模型(不依赖时间)。此函数通常用于测试灵敏度分析方法(<a href="https://www.sfu.ca/~ssurjano/ishigami.html" rel="nofollow noreferrer">https://www.sfu.ca/~ssurjano/ishigami.html</a>)。在</p>
<p>python代码(包括用PyFMI加载FMU和参数sweep)工作正常。在</p>
<p><strong>问题</strong></p>
<p>经过一定数量的模拟,我们得到了一个错误。错误输出看起来并不总是相同的。有时候我们</p>
<blockquote>
<p>FMUException: Error loading the binary. Could not load the DLL: Eine
DLL-Initialisierungsroutine ist fehlgeschlagen.</p>
</blockquote>
<p>转换:DLL初始化例程失败。在</p>
<p>有时我们得到:</p>
<blockquote>
<p>FMUException: Error loading the binary. Could not load the DLL: Für
diesen Befehl ist nicht genügend Speicher verfügbar.</p>
</blockquote>
<p>翻译:没有足够的内存来执行这个命令。在</p>
<p>错误发生在大约650次模拟运行之后</strong>。
如果在一个或多个循环中的一个或多个模拟都是在一个或多个循环中执行的,则为一个或多个循环执行的模拟。通过重新启动python控制台/进程,可以再次运行新的模拟。在</p>
<p><strong>工作环境:</strong></p>
<p>Windows10,Python2.7,使用pip(不是JModelica)安装的PyFMI,Jupyther笔记本电脑上的Python编码(在Mozilla Firefox上)</p>
<p>我们只有python和PyFMI的基本知识,并且正在努力解决这个错误!在</p>
<p><strong>附件</strong></p>
<p>下面你可以找到</p>
<ul>
<li><p>用于从Dymola导出协同仿真FMU的Modelica模型(使用CVode)</p></li>
<li><p>Python代码为py文件</p></li>
<li><p>输出python代码的散点图。</p></li>
</ul>
<p>我还在JModelica论坛上发了一个帖子,你可以直接下载这些文件(FMU、Jupyter笔记本等):
<a href="http://www.jmodelica.org/27925" rel="nofollow noreferrer">http://www.jmodelica.org/27925</a></p>
<p><strong>Modelica模型</strong></p>
<pre><code>model IshigamiFunction
final parameter Real a = 7;
final parameter Real b = 0.05;
parameter Real x1 = 1;
parameter Real x2 = 1;
parameter Real x3 = 1;
Real f;
equation
f = sin(x1) + a * sin(x2)^2 + b * x3^4 * sin(x1);
end IshigamiFunction;
</code></pre>
<p><strong>Python代码</strong></p>
^{pr2}$
<p><strong>从python脚本输出绘图</strong>
<a href="https://i.stack.imgur.com/XsOKD.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/XsOKD.png" alt="enter image description here"/></a></p>
<h2>更新</h2>
<p>我又做了一些测试,我发现:</p>
<p>根据FMU是从Dymola导出还是从JModelica导出,其行为不同:</p>
<p><strong>使用从Dymola导出的FMU:</strong></p>
<ul>
<li>将<code>load_fmu</code>行从for循环中取出似乎是可行的</li>
<li>即使<code>load_fmu</code>不在for循环中,有时也有
崩溃</li>
<li>在<code>model.set(...)</code>命令之前添加新行<code>model.reset()</code>
似乎工作得很好</li>
<li>无论有无模拟结果都是不同的
<code>model.reset()</code><strong>->;为什么??</strong></li>
<li><code>model.instantiate()</code>而不是{<cd3>}->;不起作用。这个
任务管理器中的内存使用量增加到大约350MB,然后
<blockquote>
<p>FMUException: Failed to instantiate the model. See the log for possibly more information.</p>
</blockquote></li>
</ul>
<p>日志级别为4的日志文件:</p>
<pre><code>FMIL: module = FMILIB, log level = 4: XML specifies FMI standard version 2.0
FMIL: module = FMILIB, log level = 4: Loading 'win32' binary with 'default' platform types
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiInstantiateModel completed
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiInstantiateSlave
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiInstantiateModel completed
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiInstantiateSlave
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetReal: x1 = -1.76101
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetReal: x2 = -2.53414
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetReal: x3 = 0.116583
FMIL: module = Model, log level = 4: [][FMU status:OK] fmi2SetupExperiment: startTime is set to 0
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiEnterSlaveInitializationMode...
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiEnterSlaveInitializationMode completed
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiExitSlaveInitializationMode...
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiExitSlaveInitializationMode completed
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetReal: x1 = -1.76101
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetReal: x2 = -2.53414
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetReal: x3 = 0.116583
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetReal: a = 7
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetReal: b = 0.05
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetReal: f = 1.29856
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.002
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.004
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.006
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiGetDerivatives
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.008
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.01
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.012
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.014
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.016
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.018
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.02
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
...
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.99
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.992
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.994
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.996
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 0.998
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiSetTime to 1
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiDoStep
FMIL: module = Model, log level = 1: [][FMU status:Fatal] The license file was not found. Use the environment variable "DYMOLA_RUNTIME_LICENSE" to specify your Dymola license file.
FMIL: module = Model, log level = 1: [][FMU status:Fatal] Instantiation failed
FMIL: module = Model, log level = 4: [][FMU status:OK] fmiFreeModelInstance
</code></pre>
<p><strong>使用从JModelica导出的FMU:</strong></p>
<ul>
<li>即使<code>load_fmu</code>在for循环中也能正常工作(但速度较慢)</li>
<li>这种经验与第5.4.2章(<a href="http://www.jmodelica.org/api-docs/usersguide/2.1/ch05s04.html#d0e1854" rel="nofollow noreferrer">http://www.jmodelica.org/api-docs/usersguide/2.1/ch05s04.html#d0e1854</a>)JModelica文档中给出的示例不符,其中<code>load_fmu</code>命令是在for循环中给出的</li>
<li>命令<code>model.reset()</code>或<code>model.instatiate()</code>在中是必需的
for循环(与Dymola FMU相反)<strong>->;为什么??</strong></li>
</ul>
<p><strong>我的问题:</strong></p>
<p>什么是正确的为什么要执行一个循环,它用不同的参数多次模拟一个FMU模型?在</p>
<p>使用^{<cd3有什么区别>}、<code>model.instatiate()</code>还是一个都没有?在</p>
<p><strong>附件</strong></p>
<p>下面是一个显示有<code>model.reset()</code>的for循环与没有它的for循环之间的区别。
<a href="https://i.stack.imgur.com/7Bk1C.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/7Bk1C.png" alt="enter image description here"/></a></p>
<p>从JModelica导出的FMU(不需要任何许可证)可以在这里下载:<a href="http://www.jmodelica.org/27925#comment-6668" rel="nofollow noreferrer">http://www.jmodelica.org/27925#comment-6668</a></p>