给出一个在动态建模实验室(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
这样我就可以从一次模拟中得到两条轨迹。
有人知道这是否可能吗?也许还有另一种方法?
答案 0 :(得分:1)
我认为以下是您所需要的。这有点麻烦,但是值得一试:
tgrid = [0,10,13.75,97]'
save tgrid.mat tgrid -v4
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
)中的标志取消了事件中网格点的创建。
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
中的设置。
在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
。