dymola.readTrajectory-不同的采样时间

时间:2019-03-08 08:58:07

标签: python dymola

给出一个在动态建模实验室(Dymola)中触发仿真的python脚本。

我的目标是获取模拟轨迹的数据,但是要使用不同的采样间隔。例如。我希望以1秒的间隔对从0秒到1000秒的瞬态部分进行采样,并且以100秒的间隔对从1000秒到100000sec的稳态部分进行采样,而不必执行两个具有不同开始时间,停止时间和输出的仿真间隔。

触发瞬态部分的模拟的代码摘录:

[result, simulation_result] = dymola.simulateExtendedModel(problem=problem,
                                                           initialNames=["input1", "input2", "input3"],
                                                           initialValues=[input1, input2, input3],
                                                           finalNames=output_names,
                                                           outputInterval=1,
                                                           startTime=0,
                                                           stopTime=1000,
                                                           resultFile=result_filename)

trajectory_size_transient = dymola.readTrajectorySize("simulation_result_python.mat")
sim_res_transient = np.array(dymola.readTrajectory("simulation_result_python.mat",
                                                                     output_names,
                                                                     trajectory_size_transient))

用于模拟稳态的代码:

[result, simulation_result] = dymola.simulateExtendedModel(problem=problem,
                                                           initialNames=["input1", "input2", "input3"],
                                                           initialValues=[input1, input2, input3],
                                                           finalNames=output_names,
                                                           outputInterval=100,
                                                           startTime=1000,
                                                           stopTime=10000,
                                                           resultFile=result_filename)

trajectory_size_steady = dymola.readTrajectorySize("simulation_result_python.mat")
sim_res_steady = np.array(dymola.readTrajectory("simulation_result_python.mat",
                                                                     output_names,
                                                                     trajectory_size_steady))

值“ outputInterval”是将结果写入轨迹的间隔。如图所示,我必须执行两次仿真,然后将结果堆叠起来。我宁愿进行一次模拟,并使用“ outputInterval”和set两个不同的值

 startTime=0
 stopTime=10000

这样我就可以从一次模拟中得到两条轨迹。

有人知道这是否可能吗?也许还有另一种方法?

1 个答案:

答案 0 :(得分:1)

我认为以下是您所需要的。这有点麻烦,但是值得一试:

  1. 构建一个包含所需输出点的列向量,并将其存储在Dymola的工作目录中,例如使用MATLAB:
tgrid = [0,10,13.75,97]'
save tgrid.mat tgrid -v4
  1. 修改dsin.txt如下所示:
#    Method tuning parameters
double method(27,1)
       2                   # grid     type of communication time grid, defined by
                           #          = 1: equidistant points ("Increment/nInterval")
                           #          = 2: vector of grid points ("tgrid")
                           #          = 3: variable step integrator (automatically)
                           #          = 4: model (call of "increment" in Dymola, e.g.
                           #                      incr=Time > 2 then 0 else 0.1
                           #                      dummy=increment(incr))
                           #          grid = 1,3 is stopped by "StopTime"
                           #          grid = 2   is stopped by "tgrid(last)"
                           #          grid = 4   runs forever (stopped by model)
       1                   # nt       Use every NT time instant, if grid = 3
       3                   # dense    1/2/3 restart/step/interpolate GRID points
       0                   # evgrid   0/1 do not/save event points in comm. time grid

通常必须更改以下内容: (1)第3行中的标志(2)激活tgrid-向量的使用。 (2)最后一行(0)中的标志取消了事件中网格点的创建。

  1. 使用alist.exe通过命令行将tgrid向量应用于dsin.txt

"<DymolaInstallDir>\Mfiles\alist.exe" -b "<DymolaWD>\dsin.txt" "<DymolaWD>\tgrid.mat" "<DymolaWD>\dsin.mat"

这应该创建一个文件dsin.mat,其中存储了新的网格。如果重新转换模型,则不应覆盖此文件。从Dymola GUI进行模拟将忽略dsin.mat中的设置。

  1. 模拟:

DymolaWD中执行dymosim.exe -s dsin.mat,对于给定的示例,应产生以下结果:

Integration terminated successfully at T = 97
   CPU-time for integration      : 0.031 seconds
   CPU-time for one GRID interval: 10.3 milli-seconds
   Number of result points       : 4
   Number of GRID   points       : 4
   Number of (successful) steps  : 492
   Number of F-evaluations       : 19726
   Number of Jacobian-evaluations: 0
   Number of (model) time events : 0
   Number of (U) time events     : 0
   Number of state    events     : 0
   Number of step     events     : 0
   Minimum integration stepsize  : 0.000732
   Maximum integration stepsize  : 20
   Maximum integration order     : 7
Calling terminal section
... "dsfinal.txt" creating (final states)

并创建一个包含模拟结果的文件dsres.mat