【问题标题】:dymola.readTrajectory - different sample timesdymola.readTrajectory - 不同的采样时间
【发布时间】:2019-03-08 08:58:07
【问题描述】:

给定一个在动态建模实验室 (Dymola) 中触发模拟的 Python 脚本。

我的目标是获取模拟轨迹的数据,但采样间隔不同。例如。我希望从 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”值进行一个模拟并设置

 startTime=0
 stopTime=10000

这样我就可以从一个模拟中获得两条轨迹

有人知道这是否可能吗?或者也许有其他方法?

【问题讨论】:

    标签: python dymola


    【解决方案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-vector 的使用。 (2) 最后一行中的标志 (0) 禁用在事件中创建网格点。

    1. 通过命令行使用alist.exetgrid-vector 应用于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

    【讨论】:

    • 会试一试,会告诉你:)
    猜你喜欢
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2010-11-04
    • 2021-12-31
    • 2015-04-10
    • 2021-04-03
    • 2020-12-28
    • 2014-09-17
    相关资源
    最近更新 更多