我构建了一个 Modelica 模型,但是在检查模型时(这是模型下载链接),它显示了一个局部奇点,如下面的屏幕截图所示。

所以我删除了错误消息中显示的代码。
h[3]=(hout+hl)/2
Run Code Online (Sandbox Code Playgroud)
但尽管模型检查良好,但存在导致初始化失败的强烈非线性问题。
所以我尝试删除以下代码行:
h[1]=(hin+hv)/2
Run Code Online (Sandbox Code Playgroud)
并且模型不仅检查而且没有初始化问题。
我的问题是:
如何最小化Modelica模型的非线性并保证收敛?我发现这个问题存在于很多领域,尤其是在热工水力模型中,我发现处理这个问题的一种方法是使用Modelon 的 Thermao Power Library和ThermoSysPro for EDF 的方式,这两个库划分模型或连接器分为流量和体积两种。为了确保收敛,它需要使用交错网格方案,如下面的屏幕截图所示。
那么有没有另一种方法来处理热工水力模型中的非线性问题呢?关于如何处理热工水力模型中的非线性问题,是否有共同的看法?
我注意到集成脉冲输入的数值问题在Modelica中延迟了一段固定的时间(使用Wolfram System Modeler 4.3):
model PulseTest "Test FixedDelay with Pulse Input";
Modelica.Blocks.Sources.Pulse pulse(
startTime = 1,
width = 100,
period = 1/32,
amplitude = 32,
nperiod = 1
);
Modelica.Blocks.Nonlinear.FixedDelay fixedDelay( delayTime = 5 );
Modelica.Blocks.Continuous.Integrator x; // integrator for the undelayed pulse
Modelica.Blocks.Continuous.Integrator y; // integrator for the delayed pulse
equation
connect( pulse.y, fixedDelay.u );
connect( fixedDelay.y, y.u );
connect( pulse.y, x.u );
end PulseTest;
Run Code Online (Sandbox Code Playgroud)
积分脉冲周期= 1/a,幅度= a,宽度= 100%应该给出1.0.但从图中可以看出,这不是我得到的延迟脉冲:
只有未延迟的信号使用DASSL给出正确的值.将已经出现的数值积分误差周期= 1/A = 1/8和(自然)成长为一个增长.
什么是最好的补救措施?
我的问题是打开由Dymola生成的som*.mat文件.对于小型模式,有时候matlab打开创建的*.mat文件没有问题.然后我可以看到工作区中的结构.但我还有一个巨大的模拟模型,有31.536.000个数据点.对于这种模式,Matlab无法打开它.我总是得到提示
Error using load
Unable to read MAT-file C:\Users\Patrick\Desktop\DymolaWork\GridHH_SLP.mat
File may be corrupt.
Run Code Online (Sandbox Code Playgroud)
我的Matlab版本是2014a 64bit,我的Dymola版本是2014 FD001 64bit.我还尝试使用mathworks主页上提供的工具解决问题,以解决损坏的变量名称(loadfixnames/savebadnames).但这并不是很好.因为此工具无法恢复矩阵data_2.任何人都可以给我一个解决这个问题的建议.非常感谢你
我想在医学背景下使用Modelica模型中的非SI单位.我在Dymola使用Modelica.作为工程师,我更喜欢SI单位.但我的模型参数来自医学出版物,我想避免转换错误.医疗单位还简化了与医生的沟通.
例如,使用单位"mmHg"(毫米汞柱)代替"Pa"作为压力.压力变量在模型中定义如下:
type Pressure_mmHg = Real (final quantity="Pressure", final unit="mmHg")
Run Code Online (Sandbox Code Playgroud)
翻译模型进行模拟会为模型中的每个非SI变量产生以下警告(总共约300个警告):
Could not decode the unit symbol "mmHg" appearing in the unit string "mmHg"
Run Code Online (Sandbox Code Playgroud)
如果对模型的更改导致出现新警告,则几乎无法检测到.因此我需要教Modelica单位"mmHg".
我目前对该主题的了解:
- Modelica语言规范3.3,第19章单元表达式:"可以支持用户定义的单元符号." 但是该文件没有详细说明.
- 用户可以定义显示单位(Real属性"displayUnit")以在模拟GUI中使用,只要在Dymola目录的"displayunit.mos"文件中定义转换因子,如下所示:
defineUnitConversion("Pa", "mmHg", 760/101325);
Run Code Online (Sandbox Code Playgroud)
这不是一个选项,因为它会降低模型的可移植性.它必须在运行模型的每台计算机上手动执行,并且需要管理员权限(我没有).
在此先感谢您的帮助,非常感谢!
编辑(可能对将来遇到此人有帮助):
发布时的版本:Modelica标准库3.2,Dymola版本2014(64位)2013-03-25
我忘了将以下内容添加到我目前关于该主题的知识中:Physiolibrary 2.1.1定义了GUI的displayUnits.对于编码,作者使用以下技巧:
type Pressure = Modelica.SIunits.Pressure(displayUnit="mmHg", nominal=133.322387415);
Run Code Online (Sandbox Code Playgroud)
这样,Modelica将Pressure类型的变量处理为具有单位Pascal(N/m2),但是将代码中输入的每个值除以给定的标称值.
更正:
在本节中,我之前曾说过,Physiolibrary使用Real属性名义进行单位转换.不是这种情况.感谢Marek Matejak(Physiolibrary的作者)纠正我.标称属性的唯一目的是出于稳定性原因缩放数值问题.
在工作中,我使用git作为版本控制系统,使用Dymola进行建模和模拟.
我遇到的一个主要问题是,一旦我触摸或错误地移动连接(更确切地说是连接线的一部分的位置)而不改变任何参数 - 这通常在讨论或解释时通过向同事展示图表而发生 - git将此视为文件中的版本更改或更改.至少真正的变化是在一些自动生成的Modelica注释中,例如:
connect(TT_1.T, Controller.y[1]) annotation (Line(
points={{48,-20},{48,40},{-22.5,40},{-22.5,29.25}},
color={0,0,127},
smooth=Smooth.None));
Run Code Online (Sandbox Code Playgroud)
改为(比较第2行)
connect(TT_1.T, Controller.y[1]) annotation (Line(
points={{48,-20},{48,38},{-22.5,38},{-22.5,29.25}},
color={0,0,127},
smooth=Smooth.None));
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是:如何防止任何一方代码中出现这种不必要的"改变":git或Dymola?
我正在尝试编译来自大型Dymola模型的生成C代码。生成的代码与人类编写的代码不同,存在许多展开的循环,大量使用了宏,手动索引了巨大的数组,最重要的是源文件很大(> 1e6行)。
当使用O2或编译这些源文件时O3,我的编译时间变得非常高:每个文件10至30分钟。Clang和GCC都有。我不能很好地遵循生成的汇编代码,因此我不确定优化的质量。通过不生成调试信息或关闭警告可以减少编译时间,但是与关闭优化相比,这些警告很小。在运行时方面,O0和之间有明显的区别O2,所以我不能证明这样做是合理的。使用进行编译时-ftime-trace,我可以看到Clang前端负责90%以上的时间。据称,该过程不是内存瓶颈,它似乎完全受CPU限制htop。
我可以做一些预处理来改善编译时间吗?将源文件分成较小的块会提高性能,为什么?编译器是否设计为可以处理这些巨大的源文件?还有其他我应该注意的编译选项吗?
令人惊讶的是,Windows上的MSVC /O2花费的时间只是Clang和GCC的一小部分。
编译器参数示例: clang -m64 -Wno-everything -c -D_GNU_SOURCE -DMATLAB_MEX_FILE -ftime-report -DFMI2_FUNCTION_PREFIX=F2_Simulations_SteadyState_SteadyState2019MPU_ -DRT -I/opt/matlab/r2017b/extern/include -I/opt/matlab/r2017b/simulink/include -I/mnt/vagrant_shared/<path>/Source -I/mnt/vagrant_shared/<path>/export -fexceptions -fPIC -fno-omit-frame-pointer -pthread -O0 -DNDEBUG -std=c99 /mnt/vagrant_shared/<path>/some_file.c -o /mnt/vagrant_shared/<path>/some_obj.obj
平台:在虚拟机VM上运行的CentOS 7。Clang 7,GCC 4.8(由于其他要求,我坚持使用这些旧版本)。
初始化可能非常繁琐,容易导致发散。一个简单的策略是在构建整个系统的一部分时运行模拟,并使用模拟结果来修改猜测值。这是我在 Francesco Casella 的 PPT 和 Daniel Bouskela 的书中得到的内容。
我发现我可以在 Dymola 中使用一个选项,如下所示,但我想在达到稳定状态时使用结果而不是使用初始化结果。所以我想使用python脚本从.mat结果文件中提取结果,然后自动修改迭代变量。但关键的问题是,我不知道当我在我的模型中添加更多组件时,现有组件的迭代变量集会发生变化,我不知道这会导致什么样的效果。任何人对这个问题有意见,欢迎回答这个问题。
所以我的问题是我应该在哪里找到python
Wolfram system modeler has a function called "equation browser", the youtube video here(at 20:58) gives an introduction about "equation browser", I am wondering if Dymola has the same function, it would be helpful to debug nonlinear system.
Also, it is welcome for some other workaround solution, like using python to visualize the equation structures.
Modelica建模是第一原理建模,所以如何测试模型并设置一个有效的基准很重要,比如我可以随心所欲地设计一个流体网络,但是在建立动态仿真模型时,我需要知道详细的几何形状结构和参数来设置我的模型的每一部分。通常,我会建立一个具有简单能量守恒定律和质量守恒定律的稳态模型,然后根据相应的设计手册设计每一台设备,但是当我将每个动态组件放在一起时,仿真到稳态时,结果是与稳态模型或多或少不同。所以我想知道我是否应该修改我的工作流程以使动态模型与稳态模型一致。欢迎任何建议。
#dymola #modelica
我尝试在Anaconda(Python 3.6.8)上设置pyFMI
安装了pyFMI站点上列出的所有必需软件包。fmu加载没有问题,但是当我尝试模拟fmu时出现错误:
Could not find cannot import name 'radau5'
Could not find cannot import name 'dopri5'
Could not find cannot import name 'rodas'
Could not find cannot import name 'odassl'
Could not find ODEPACK functions.
Could not find RADAR5
Could not find GLIMDA.
Traceback (most recent call last):
File "assimulo\solvers\../lib/sundials_callbacks_ida_cvode.pxi", line 240, in assimulo.solvers.sundials.cv_jac
File "C:\Users\d60378\AppData\Local\Continuum\anaconda3\lib\site-packages\pyfmi\simulation\assimulo_interface.py", line 733, in j
A = self._model._get_A(add_diag=True, output_matrix=self._A)
File "src\pyfmi\fmi.pyx", line 6041, in pyfmi.fmi.FMUModelBase2._get_A
File "src\pyfmi\fmi.pyx", line 7592, in pyfmi.fmi.FMUModelME2._get_directional_proxy
File "src\pyfmi\fmi.pyx", line …Run Code Online (Sandbox Code Playgroud) dymola ×10
modelica ×9
assimulo ×1
c ×1
clang ×1
compilation ×1
fmi ×1
gcc ×1
git ×1
mat-file ×1
matlab ×1
openmodelica ×1
precision ×1
python-3.x ×1