模拟Modelica中的空间PDE - 在特定时间访问变量值

时间:2014-01-08 12:38:53

标签: modelica dymola

这个问题与我之前的一个问题有些关系,我没有得到正确的解决方案。链接: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],即离散段no的温度。 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文件进行成像,这样就像我刚才那样手动导航非常困难。

1 个答案:

答案 0 :(得分:3)

虽然您没有明确提及,但我假设您在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))

enter image description here