【问题标题】:Simulating spatial PDEs in Modelica - Accessing variable values at specific times在 Modelica 中模拟空间偏微分方程 - 在特定时间访问变量值
【发布时间】:2014-01-26 13:38:43
【问题描述】:

这个问题与我之前的问题有些相关,我没有完全得到正确的解决方案。链接:Earlier SO-thread

我正在求解具有一个空间维度的时变偏微分方程(例如热方程 - 请参见下面的链接)。我正在使用线的数值方法,即将空间导数离散化,从而产生一个在 Modelica 中很容易解决的 ODE 系统(使用 Dymola 工具)。准确地说,当我模拟系统或绘制结果时,我的问题就会出现。方程本身似乎得到了正确求解,但我想表达所有离散状态变量在特定时间点的空间变化,而不是每个离散状态的单个时变行为。

Youtube tutorial 说明了导致我的问题的策略,顺便说一下,这不是我制作的。正如您在本教程最后看到的那样,温度随时间变化的行为分别绘制在棒中的所有离散点上。我想要的是显示在特定时间通过棒的温度的图,即作为空间坐标函数的温度。我正在努力实现这一目标的策略是:给定一个包含 N 个条目的状态向量:

Real[N] T "Temperature";

..我会使用plotArray Dymola 函数,如下所示。

plotArray( {i for i in 1:N}, {T[i] for i in 1:N} )

直观地说,这将产生一个图,显示温度作为空间坐标的函数,或者准确地说是离散单位行中的数字。尽管此命令会产生结果,但图中的所有 T 值似乎都为 0,这绝对不是这种情况。我的问题是:如何在给定时间成功获取并绘制所有离散点的温度?提前感谢您的帮助。

问题的代码如下所示。

model conduction

   parameter Real rho = 1;
   parameter Real Cp = 1;
   parameter Real L = 1;
   parameter Real k = 1;
   parameter Real Tlo = 0;
   parameter Real Thi = 100;
   parameter Real Tinit = 30;
   parameter Integer N = 10 "Number of discrete segments";
   Real T[N-1] "Temperatures";
   Real deltaX = L/N;

initial equation 
   for i in 1:N-1 loop
     T[i] = Tinit;
   end for;

equation 

   rho*Cp*der(T[1]) = k*( T[2] - 2*T[1] + Thi) /deltaX^2;
   rho*Cp*der(T[N-1]) = k*( Tlo - 2*T[N-1] + T[N-2]) /deltaX^2;

   for i in 2:N-2 loop
     rho*Cp*der(T[i]) = k*( T[i+1] - 2*T[i] + T[i-1]) /deltaX^2;
   end for
   annotation (uses(Modelica(version="3.2")));

end conduction;

附加编辑: 模拟清楚地表明,例如 T[3],即离散段的温度。 3,从30度开始,到70度结束。但是,当我在命令窗口中写入 T[3] 时,我得到 T3 = 0.0 作为回报。这是为什么?这是问题的核心,因为如果我设法在特定时间提取实际变量值而不仅仅是 0.0,plotArray 函数就会起作用。

建议的解决方案:这是实现我想要的一个相当繁琐的解决方案,我希望有人知道更好的解决方案。当我在 Dymola 中运行模拟时,软件会生成一个 .mat 文件,其中包含整个模拟期间的变量值。我能够将此文件加载到 MATLAB 中并手动提取我选择的绘图变量。针对上面的问题,我写了如下命令:

plot( [1:9]' , data_2(2:2:18 , 10)' )

此命令将绘制温度(因为温度与它们的导数一起存储在 .mat 文件中的 data_2 数组中)与离散段/元素的相应编号。我真的希望在 Dymola 中做到这一点,即避免为此使用 MATLAB。对于这个特定的问题,由于这个问题的简单性,变量的数量很少,但我可以轻松地创建一个 .mat 文件,这比我刚刚做的手动导航要困难得多。

【问题讨论】:

  • 您的方法在原则上看起来是正确的。但是由于您没有包含模型的源代码,因此很难确定可能出了什么问题。如果可能,请包含代码,以便人们可以尝试复制您的问题并帮助您诊断问题。
  • 代码现已添加。我希望这有助于说明问题。这是一个相当简单的问题,但我计划将解决方案(即为空间变化绘制变量)也用于其他更复杂的问题。
  • C:\Program Files (x86)\Dymola 2014 FD01\Mfiles 或任何您的 Dymola 路径中有一堆 Matlab 文件。出于某种原因,这些都没有很好的记录。使用dymolaM,您可以将命令从Matlab 传递到Dymola,其他有用的命令是loaddsinsetParameterByNamedymosim
  • @matth 我已经探索了其中的一些功能,它们非常有用。例如,我尝试了名为 tload 的函数,它或多或少使我能够在 Matlab 中执行 @Florian Brucker 在下面的答案中为 Dymola 指出的相同操作。
  • 我们在 Dymola 之外进行所有后处理,例如在 MATLAB 或 Python 中。批量模拟和类似东西的控制也是如此。 Dymola 非常适合实际建模,但它目前还不能真正使用。

标签: modelica dymola


【解决方案1】:

虽然您没有明确提及,但我假设您在 Dymola 的命令窗口中输入了 plotArray 命令。这不会直接起作用,因为你在那里看到的变量不包括你的模拟结果:如果我模拟你的模型,然后在 Dymola 的命令窗口中输入T[:],那么打印的结果是

T[:]
 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}

我不是 Dymola 专家,我发现的唯一解决方案(主动存储和加载所需的模拟结果)非常麻烦:

simulateModel("conduction", resultFile="conduction.mat")
n = readTrajectorySize("conduction.mat")
X = readTrajectory("conduction.mat", {"Time"}, n)
Y = readTrajectory("conduction.mat", {"T[1]", "T[2]", "T[3]"}, n)
plotArrays(X[1, :], transpose(Y))

【讨论】:

  • 感谢您的帮助。据我从您的命令调用和数字中可以看出,您似乎已经绘制了三个单独的温度与时间的关系,这并不是我最初想要的,但您的方法(或多或少)正是我想要的。跨度>
  • 此解决方案的后续内容如下:假设我有 1000 个离散点而不是 10 个。如何以紧凑的方式制定我的 Y 矩阵以提取所有这些点?像Y = readTrajectory("conduction.mat",{"T[1]","T[3]",...,"T[999]",n) 这样写是相当乏味的。回想一下,我想将温度绘制为特定时间的空间坐标函数。
  • @fredrikg:我不知道有什么捷径,但正如我所说,我不是 Dymola 专家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2011-07-02
  • 1970-01-01
相关资源
最近更新 更多