你知道是否有一个C库来处理FMU和运行模拟,包括一个好的解算器吗
据我所知,有:
来自QTronic的FMUSDK
来自Modelon的FMI库
两者都可以打开FMU,但只允许运行FMU与简单的Euler解算器进行联合仿真
库包括处理不连续性的良好解算器,但不在C中,包括:
来自Modelon的PyFMI:用于Python
来自托勒密的JFMY:For Java(不确定这是否包括一个好的解算器)
我认为FMUSDK并没有真正得到维护,因此FMI库可能是这两者之间的更好选择
要改进解算器,您
我有一个字符串向量,其中包含一些物质的名称vec={“H2”,“O2”},我想使用这些字符串访问包中的记录,以便
Modelica.Media.IdealGases.Common.SingleGasesData.'vec[1]'
返回H2的数据
这在Modelica中是可能的,还是我必须手动执行?我最终手动执行:
import d = Modelica.Media.IdealGases.Common.SingleGasesData;
constant Modelica.Media.IdealG
模型很简单:我想给旋转接头的旋转法兰施加一个扭矩。
但是,扭矩反作用力不应施加在回转接头的支承法兰上。
扭矩反作用力确实在其他地方平衡,而不是在旋转关节本身平衡。
一个真实世界的例子是车轮:扭矩由动力总成提供,并通过轴传递到车轮,因此扭矩反作用力不会在轮毂上感知,而是在动力总成支架上感知。
因此,上述各项似乎都不正确:
蓝色:在革命的框架上有一种不应该存在的反应。支架(白色圆圈)似乎总是平衡施加在法兰上的扭矩(灰色圆圈)),但在这种情况下没有意义
红色:在旋转帧_a上没有反应,但在1D线上没
变量现在以j=1开始,但增量错误。对于t=0.5,其值应为2,对于t=1,j=3,依此类推。。。
您可以在下图中看到错误
class abc
import Modelica.SIunits;
parameter SIunits.Time delta_t = 0.5;
constant Real a[:] = {4,2,6,-1,3,5,7,4,-3,-6};
Real x;
Integer j(start=1);
Integer k = size(a,1);
algorithm
whe
关于OpenModelica中Simulation Setp>Simulation Flags中的所有选项的功能,是否有详细的文档可供使用
OpenModelica文档确实对一些标志进行了简短的描述,但并非对所有标志都进行了简短的描述。从命令行运行omc.exe+help。它将打印带有描述文本的所有标志
我用AC库创建了一个零件,当我试图模拟模型时,出现了一个错误,上面说“modelica转换器的当前版本只能处理具有固定大小的组件数组”
不知道这是什么意思,有没有人有像这样的问题
多谢各位
考虑以下简单模型:
model M
parameter Integer n(start=3, fixed=false);
initial algorithm
n := n;
end M;
它有一个参数n,可以在模拟开始前更改。数组维度必须是参数表达式。所以你会认为以下模式是合法的:
model M2
我是Modelica的新手,几个月前刚开始做一个项目。主要使用标准Modelica发行版中包含的多体库处理多体机械系统
我需要根据在模拟过程中动态计算的坐标更改身体位置,但我找不到这样做的方法
这是计算给定系统质心位置的矢量变量:
Modelica.SIunits.Length CMG[2];
CMG[1] = ... + cos(part3rotation.angles[3]) ... + part3origin[1] ...;
CMG[2] = ...;
我想在坐标(CMG[1],CMG
我有一个局部模型,当我在Dymola中检查时,它声称有35个变量和34个未知数,而当我在OMEdit中检查完全相同的模型时,它平衡在34/34。在确定什么算作变量时,是否包括所有输入和输出
以下是我的模型:
model HeatStorage
extends PentakomoPlant.Interfaces.StorageFluidHeat;
parameter SI.Diameter D = 18.667 "Diameter";
parameter SI.Height H =
我正在Dymola中构建一个在时间和空间上演化的有限体积模型。空间离散化在方程部分进行硬编码,时间演化用一个由der(φ)组成的项来实现
当使用可变步长算法时,Dymola的时间积分在数值上总是稳定的吗?如果没有,我能做些什么吗
Dymola的Euler积分算法是显式的还是隐式的Euler方法?时间积分的稳定性将取决于你的积分器。一般来说,隐式方法要比显式方法好得多
但既然你提到了空间和时间离散化,我认为值得指出的是,对于某些类型的问题,事情可能变得相当棘手。一般来说,我认为用这种方法求解椭圆和
我有一个我正在创建的坦克模型,如下所示:
model Tank "Simple model of a tank"
parameter Real volume=1 "tank volume (m^3)";
parameter Integer num_ports=1 "Number of ports";
parameter Real static_pressure=1 "Internal Tank Pressure";
parameter Real initial_lev
我试图解决一个滞后问题。考虑迟滞效应,水分含量是历史的:考虑一块具有初始含水率W0的木材,它与PHI0的初始环境处于平衡状态;然后将块放入phi1的环境中;现在需要(w0、phi0和phi1)来确定与phi1对应的w1;然后你把块放在phi2的环境中,要确定对应于phi2的w2,你需要(w1,phi1和phi2);。。。。
在Modelica中,只能在当前时间步使用状态变量;如何同时使用phi0和phi1?不是φ的时间导数,der(φ)。确定w1时,w1和phi1的值将转移到w0和phi0。
很
我有一个精心设计的Modelica模型,其中a有一个状态机变量,当语句:
model WhenExample
type State = enumeration(first, second, third);
State state;
initial equation
state = State.first;
equation
when sample(0, 1) then
state = State.second;
end when;
when sample
问题和动机:
openmodelica中流体库的模型非常详细,需要正确设置许多参数才能使模型以可接受的结果运行。
我想为机械和工艺工程师建立一个日常工程计算的环境——没有模拟专家。
因此,我的库的组件必须预先配置,用户不应该被迫编辑图形模型背后的代码(例如重新声明介质)
想法:
将流体模型放入自己的模型中,正确配置它们,重新声明介质并提供流体接头
model flowEncapsulateFluid1
inner Modelica.Fluid.System system;
replaceable
我希望通过比较用户定义的参数和第一列的值来访问矩阵的特定行
伪代码,例如:
parameter Real userinput;
Real matrix[4,10] = [10,1,3,5; 3,1,5,9;.....];
Integer rowidentity;
for i in 1:10 loop
if matrix[1,i] = userinput then
i = rowidentity;
end if;
end for;
根据我对循环或if语句的了解,它们在等式部分之外不起
我试图建立一个参数化的库。我可以使用包和连接器作为参数
也可以使用模型作为参数。
但是,据我所知,如果在库中使用该模型来使用extend构建新模型,那么它是不允许的
我想知道库中是否包含具有内部/外部连接器样式的模型,是否允许将内部模型作为库的参数
下面是一个简单的例子来说明这个问题。TEST是库,Fish3b是应用程序。当我在库测试中运行这个示例时,它都可以工作,但是当我有一个单独的应用程序文件时,它就不能工作了
错误文本为:找不到运行JModelica 2.4的类型的类声明
package
我目前正在建造一个热回收蒸汽发生器,刚刚从热电库开始建造,并将蒸发器连接到省煤器。
尝试模拟时,OMEdit模拟器内发生错误:
在时间0处除以零,(a=-458389.9207317767)/(b=0),其中除数b表达式为:8.7598880677792*省煤器.metalTube.Am*省煤器.metalTube.rhomcm*/Real/(省煤器.metalTube.Nt)
如果我无法定义或定位导致b=0的所需变量,如何准确地排除此错误?
请让我知道你对此的看法。非常感谢您的时间和精力
我并
我构建了一个Modelica模型,但在检查模型()时,它显示了一个局部奇点,如下面的屏幕截图所示。
因此,我删除了错误消息中显示的代码
h[3]=(hout+hl)/2
但是,尽管模型检查良好,但存在一个强烈的非线性问题,导致初始化失败
因此,我尝试删除以下代码行:
h[1]=(hin+hv)/2
模型不仅进行了检查,而且没有初始化问题
我的问题是:
调试模型奇异性时,Dymola显示的错误信息可能不是模型的奇异性源?是否有一种通用的方法来找到奇异性问题的根源?或者我必须手动分析模型
我在Dymola中建立了一个具有朗肯循环的太阳能发电厂模型,尽管初始化工作正常,但在2840秒时,由于未能解决非线性方程,导致模拟停止。
如下面的屏幕截图所示,Dymola建议提供更好的开始值,但这没有任何意义,因为失败发生在模拟过程中,而不是初始化过程中。有了更好的起始值,情况根本没有改善。
我的问题是:
我应该如何处理在模拟过程中无法求解非线性方程组的问题?
我在Dymola中设置了工作目录:
但是,当我运行脚本时,临时文件将在与.mos文件相同的目录中生成,而不是在Dymola中的工作目录中生成。
我的问题是:
如何使生成的临时文件始终位于工作目录中?
Dymola的默认行为是在运行脚本时将工作目录更改为脚本目录。要防止出现这种情况,请设置标志
Advanced.ChangeToScriptDirectory=false;
Dymola的默认行为是在运行脚本时将工作目录更改为脚本目录。要防止出现这种情况,请设置标志
Advanced.Chang
我不想每次都创建文本框来显示块的名称,而是想为块创建一个可重用的模板。下面是我创建的
partial block BlockTemplate
annotation(Icon(coordinateSystem(extent = {{-100,-100},{100,100}}, preserveAspectRatio = true, initialScale = 0.1, grid = {2,2}), graphics = {Text(origin = {-0.366361,-0.51471},
我又没什么主意了,就向你求助
我相信这个问题以前一定有人回答过,但就我的一生而言,我找不到一个清晰的描述
情景:
你努力得到一个模型,所有的模型都是通过初始猜测等建立起来的,然后求解模型中所有参数的“真实”稳态(SS)条件。从这个解决方案中,我想调查事件对系统的影响
要执行这种与SS分析的偏差,最好能够简单地加载SS solution.mat文件,其中包含Dymola已经生成的所有模型参数。加载此解决方案后,在执行SS调查偏差之前,无需首先模拟模型以获得SS解决方案。我可以设想,发生这种情况的一
我使用的是Dymola 2019,必须在模型中使用+50个CombitMetable实例来加载大小大于200 MB的CSV文件(分辨率为60秒的年度天气数据)
我的模型的额外增加导致在Dymola中出现以下错误消息:
Error: The following error was detected at time: 0
Memory allocation error
FixInitials:Init: Integrator failed to start model.
如果我将大的csv文件拆分
当我使用OpenModelica检查Modelica.Thermal.HeatTransfer.Components.heatcapacer时,它告诉我heatcapacer有4个方程和4个变量。但我只能在下面列出的模型中找到4个变量的3个方程(即,T,port.T,der_T,port.Q_flow):
我通过删除der_T和上面列出的第二个方程式创建了一个名为MyHeatCapactor的新模型。该工具表明MyHeatCapacer有3个3变量的方程
这两个热电容器模型可以给我正确的答案。我
我在Dymola中构建了几个模型,它们都属于一个包,那么如何更改这个包中的显示顺序呢?
我知道我可以在文本编辑器中更改代码,但是否有一种方法允许我通过在包浏览器中拖放来完成此操作
您可以通过如下所示的鼠标右键或此处指示的键盘快捷键使用上下文菜单:
按住CTRL键并向上箭头可将其向上移动一次
按住CTRL键并向下箭头可将其向下移动一次
按住CTRL键并向上翻页,将其移动到包的开头
按住CTRL键并向下翻页,将其移动到包的末尾
拖放仅支持将模型从一个包移动到另一个包,也可以使用重命名。。。从上下文
当我在Wolfram Systemmodeler中尝试这个简单的modelica代码时:
model bug
Integer y(start = 1);
equation
when time > 0.2 then
y = 5 "y = 2";
elsewhen time > 0.4 then
y = 4 "y = 3";
elsewhen time > 0.6 then
y = 3 "y = 4";
elsewhen time >
我的Modelica中有一个模型,我使用Dymola编译这个模型。在我的模型中,我需要模拟信息“输出间隔长度”。我已经找过了,但找不到有用的信息。是否有其他可能的方法可以访问模拟信息。Modelica by design禁止访问任何数值解算器内部,因此您无法访问它。输出间隔长度也不能由模型以任何可靠的方式确定,因为解算器将采取比输出间隔更长的内部步骤,然后为结果文件插值。您可以使用带积分器的时钟系统。
有关示例,请参见Dymola中的文件-->库-->Modelica\u同步-->示例-->系统
如何在JModelica FMU中启用方向导数
我找不到有关该编译器标志的任何信息
感谢从JModelica.org生成的FMU中无法获得方向衍生工具,并且不打算添加方向衍生工具。不过,它将被添加到基于JModelica.org的商业工具OPTIMICA编译器工具包中谢谢您提供的信息!我对OPTIMICA FMI功能感兴趣。你认为它适合于实时、大规模、流动的问题吗?啊,有趣的是,JModelica.org一直是这样/功能受限的吗?
我目前正在学习化学工程,在我的学士学位论文中,我打算通过一个热端口将两个管道连接在一起,来模拟一个可以在过热器中使用的加热管道。尽管我在理解如何在Modelica中正确编写代码方面付出了很大的努力,但我的代码仍然无法正常工作,我感到非常绝望
因此,该模型基本上必须同时适用于流体水和过热蒸汽,因此在不稳定条件下仅适用于单相流。传热应该是对流的。此外,在这个模型中,我忽略了摩擦造成的压力损失
以下是我对模型应该如何工作的想法:
我正在尝试构建一个类似于MSL中的“动态管道”的模型,只是要简单一些,以
Modelica新手试图构建一个块,用于识别一组实值(向量)中的最高值
我尝试了两种版本-一种只给我最高值的索引,另一种切换相应布尔向量的值
两者都失败了。对于某些高输入值,模型工作正常(几乎),但大多数时候我都会收到一个错误消息:“在时间0.0277839..0.027778544左右检测到抖动(一行中有100个状态事件,总时间增量小于步长0.02)。这可能是性能瓶颈。有关详细信息,请使用-lv LOG_事件。过零为:indexMaxBool1.temp>indexMaxBool1.tempM
这是一个简单的想法,当下一个体积的变量x小于0时,我想在有限体积中求解相同的方程。由于modelica语言的特点,我很难实现循环。我希望有人能帮我。谢谢
model Model
parameter Real L = 10;
parameter Real r = 5;
parameter Integer N = 20;
Real x[N](each start = 0);
equation
if noEvent(x[1] >= 0 and x[1] < L) th
我正在用Modelica标准库构建一个控制系统。但是我在调整PID系统中的参数时遇到了麻烦,所以我想使用一个可以为PID系统进行自动调整的库。在谷歌上搜索了一段时间后,Modelica中似乎没有这样的库。
我的问题:有人能推荐PID系统的自动调整库吗?您应该看看Modelica IndustrialControlSystems()。它有一些自动调谐PID块
向Rene Just Nielsen致意您应该看看Modelica IndustrialControlSystems()。它有一些自动调谐P
我在我的工作中使用了Modelica,我对一个包含许多模型的系统进行了建模。我想通过使用“in”创建一个包来简化使用,这样这个包就包含了所有的模型。我想要的是打开软件包,而不是打开许多模型,这需要时间。我建议使用Modelica工具(OpenModelica、Dymola、SimulationX等)创建软件包,而不是手工操作
该工具将自动为您在.mo文件中的行中创建文件夹结构和。手动操作并没有多大乐趣
例如,您可以使用OMEdit(OpenModelica的一部分)创建包结构,如下所示:
通过
几周来,我一直在尝试从Dymola 2020导出Modelica模型,并在使用EnergyPlus 9.2运行联合仿真时不断遇到以下错误消息
警告模型1():FMIInstanteSave:回调函数步骤已完成!=NULL,但不支持异步fmiDoStep
警告模型1():fmiinstantislave:超时!=不支持0
我已经跟踪了,但还没有解决问题
以下是我们已完成的故障排除步骤列表:
将我们创建的FMU导入Dymola,并按预期运行-否
FMU本身的问题
使用示例idf-co模拟运行FMU示
我试图弄清楚在Dymola中模拟期间使用内联集成和不使用内联集成之间的区别。
以下是DASSL算法的基本过程:
我发现以下关于内联集成技术的总结:
总之,内联积分利用Dymola的符号操作,将离散化表达式插入待求解的微分代数方程(DAE)模型中,表示数值积分算法。实际上,插入的离散化表达式(代表数值积分算法)是与模型“内联”求解的,这项技术由此而得名。结果是DAE更易于数值求解,从而缩短了求解时间
至于将离散化表达式插入DAE模型中要解决的部分,我认为DASSL也会做同样的事情,如上面的屏幕截
我是openmodelica的新手,
由于我从事可靠性工程,我将使用openmodelica的主要功能是petri网建模。
我已经学习了ExtendedPetriNets库()。
但是,当我在openmodelica中打开此库时,我收到了几个错误消息,这些错误消息可分为:
找不到类或组件
在修饰符中(椭圆(范围={{-100,-100},{100,100})、类或组件范围),在中找不到类或组件椭圆
组件图标上元素行点的重复修改
[ExtendedPetriNets:569:14-569:42]:
我使用OpenModelica的realFFT库来分析PWM信号中的频率。
当我分析10 kHz以下的频率时,一切正常。
但是,一旦我将最大频率设置为10 kHz以上,我的模拟要么计算错误的结果,要么崩溃,要么说它模拟了,但没有显示结果
到目前为止,我发现:
我的采样周期为8.3us,采样数为ns=6000,最大频率为f_max=12kHz,分辨率为f_res=20Hz,这导致停止时间>=(6000-1)*8.3us-->停止时间>=0.05s(根据库)。
所以我用这个stopTime进行了模拟
我用dymola建立了一个模型,但是当转换模型时,有一个错误显示系统缺少一个方程。那么,我怎样才能找到Dymola中缺失的方程呢
Dymola已经告诉您它假设问题所在的位置。
显然,成分stodolaturalbine是错误的。从你标记的信息信息中,我们可以得出结论,有一个等式缺失,涉及实变量
所以,去那个部分,检查一下,你们是否有一个方程来表示每个实变量,并且每个实变量至少在一个方程中使用
以下是针对此类问题的一些一般提示:
仔细阅读所有错误、警告和信息消息
展开所有消息以查看Dymola发
我用的是Dymola。假设我的模型中有两个组件,我希望对共享相同类型的组件使用相同的可视大小
那么,如何根据另一个组件设置一个组件的可视大小呢?
我不打算使用注释代码,因为当有许多组件时,这可能会太麻烦
我认为使用注释将是唯一的出路。这是确定零部件位置和尺寸的地方。我想到的唯一方法是使用参数设置这些位置,如下所示(部分)
model pos_params
parameter Real pos_x1 = -10;
Modelica.Blocks.Sources.Constant cons
我有一个Modelica文件,在模拟过程中通过一个外部库*.a文件引用c代码
例如:
model CallAdd
input Real FirstInput(start=0);
input Real SecondInput(start=0);
output Real FMUOutput(start=0);
function CAdd
input Real x(start=0);
input Real y(start=0);
我有一个模型,其中我使用CombiTable1D从.txt文件检索外部输入。该文件目前由Python脚本生成,但在项目的最后阶段,它将每秒更新一次。目前,由于.txt文件是静态的,因此模拟不会出现问题。只需读取文件并根据其中写入的数据进行模拟
我想做的是模拟一个模型,直到某个时间,比如说100秒,然后让它等待一个实时事件,通过该事件,.txt文件被更新为100-200之间的下一个外部输入值。通过在接下来的100秒内获取这些新值,模拟应继续进行
因为我已经在使用OMPython,所以使用Pytho
Optimica是唯一合理的方法还是存在更直接的方法?我在早期版本中使用过OMOPtim,但它工作不可靠,不能提供一次性优化。PyFMI+Assimulo(CVodes)可以进行敏感性分析OpenModelica也有一种基于IDAS的方法。看
我正在使用OpenModelica为一个集中太阳能热发电厂建模。我为一台泵和一台冷凝器建立了一个模型,当分别进行测试时,他们成功地计算了出口条件。但是,出于测试目的,当我在闭环中连接泵和冷凝器模型时,模型将不会模拟,并且我收到以下错误:
[1] 22:16:26 Translation Error
Internal error Circular Equalities Detected for Variables:
condenser2.o.mdot
condenser2.i.mdot
-----
如何使用Dymola创建具有大参数数组的FMU?我发现,当数组大小超过100个元素时,数组将丢失modelDescription.xml文件中的causality=“parameter”和start value属性。有没有办法将最大参数数组大小从100增加到10000
Modelica模型:
model Unnamed
parameter Real smallArray[:] = fill(3.,100);
parameter Real largeArray[:] = fill(3.,1
Modelica压力锅的型号:
我想模拟液态水如何首先加热到饱和点。然后水蒸发并与空气混合。开始时,液态水的体积为1升,空气的体积为100升
方法
引入的热量只流向液态水
液态水和湿空气之间的热交换仅由蒸发质量流引起
总容积是固定的(容器容积)
忽略了墙体的热容量,墙体无热量损失
Modelica.Media.Water.液态水标准水
Modelica.Media.Air.moi适用于气相(空气和蒸汽)
目前仅基于文本的模型(无端口、无组件…)
代码
model PressureCooker
OpenModelica上的两个模拟结果都是x始终等于5。为什么?
似乎模型中的xtry应该是5。但是当时间等于3时,为什么模型try1中的x不是10呢。首先,请记住,在处理when子句时,通常谨慎地使用pre(…)运算符来明确说明所引用的值是新值还是前一值。我不知道在这种情况下是否有严格的必要(即使我知道,我也不确定Modelica工具的所有开发人员是否都使用一致的语义),但这是一个好主意,只要让代码的读者清楚就行了
另一个问题是算法的处理。通常,这些语句是按照它们在算法部分中出现的顺序执行的
流变模型通常使用三(或四)个基本元素建立,这些基本元素是:
弹簧(例如存在于Modelica.Mechanics.Translational.Components中)。其方程为f=c*(s_rel-s_rel0)
减震器(减震器)(也存在于Modelica.mechanical.Translational.Components中)。其方程为f=d*v_rel对于线性阻尼器,可以很容易地修改an以模拟非线性阻尼器:f=d*v_rel^(1/n)
滑块,据我所知,该库中不存在该滑块。。。它的方程是
我在Modelica中编写了一个代码,用于为我的硕士论文训练前馈两层神经网络。代码接收六个元素的向量(u[nin]),并提供两个元素y[nout]的输出向量。当我在dymola中翻译代码时,我收到一个错误,指出特定代码行中包含的部分的维度必须相等。一旦我删除了这一行,代码就被成功地翻译了。我真的花了很多努力试图解决这个错误,但徒劳无功!如果您能在这个问题上给予帮助,我们将不胜感激
代码如下:(请注意,导致翻译错误生成的行在代码中标记为/)
一旦我使用LogSig删除这些行,我就可以让OpenMo
我想在一个模型内设置一个默认变量名T(=xx)——将该模型拖到一个新模型中,并在那里定义变量xx。
我得到错误消息:使用未声明的变量xx
这是子模型
model test
parameter Real T = xx;
Real f;
equation
f = T + time;
end test;
这是完整的模型
model fullmodel
parameter Real xx = 12;
Test Test1;
end fullmodel;
我的问题是:在Mode
我使用Dymola平台制作PI控制器,遇到如下错误消息
这是我的一些代码,包括计算disp的阀门和控制disp量的PI控制器。
他们正在使用标志相互通信
//PI控制器///
如果标志输入==1,则//标志输入==1:停止控制/标志输入==0:重新启动控制//
控制:=0;
其他的
控制:=P_项+I_项/单位;
如果结束;
如果代码片段中出现错误,则很难判断问题的确切位置
Dymola告诉您,您创建了一个大型代数循环,覆盖顶部“未知”下列出的所有变量和下面“方程式”部分中列出的方程式。
当您使
我想读取当前日期,如果该日期超出限制,则应终止系统。下面的代码可以工作
import Modelica.Utilities.System.getTime;
model M
Integer[7] today;
constant Integer[7] limit={0,0,0,0,0,0,2021};
Real x;
equation
today = getTime();
if today[7] >
1 2 3 4 5 6 ...
下一页 最后一页 共 9 页