dymola.readTrajectory - 不同的采样时间
dymola.readTrajectory - different sample times
给定一个 python 脚本来触发动态建模实验室 (Dymola) 中的模拟。
我的目标是获取模拟轨迹的数据,但采样间隔不同。例如。我希望从 0 秒到 1000 秒的瞬态部分以 1 秒的间隔进行采样,从 1000 秒到 100000 秒的稳态部分以 100 秒的间隔进行采样 而不必执行两个具有不同开始时间和停止时间的模拟和输出间隔。
触发瞬态部分模拟的代码摘录:
[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
这样我就可以从一次模拟中得到两条轨迹。
有人知道这是否可行吗?或者还有其他方法吗?
我认为以下内容可以满足您的需求。这有点麻烦,但值得一试:
- 构建包含所需输出点的列向量并将其存储在 Dymola 的工作目录中,例如使用 MATLAB:
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
-vector 的使用。
(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
。
给定一个 python 脚本来触发动态建模实验室 (Dymola) 中的模拟。
我的目标是获取模拟轨迹的数据,但采样间隔不同。例如。我希望从 0 秒到 1000 秒的瞬态部分以 1 秒的间隔进行采样,从 1000 秒到 100000 秒的稳态部分以 100 秒的间隔进行采样 而不必执行两个具有不同开始时间和停止时间的模拟和输出间隔。
触发瞬态部分模拟的代码摘录:
[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
这样我就可以从一次模拟中得到两条轨迹。
有人知道这是否可行吗?或者还有其他方法吗?
我认为以下内容可以满足您的需求。这有点麻烦,但值得一试:
- 构建包含所需输出点的列向量并将其存储在 Dymola 的工作目录中,例如使用 MATLAB:
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
-vector 的使用。
(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
。