dymola.readTrajectory — разное время расчета

Дан скрипт 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» и установить

 startTime=0
 stopTime=10000

так что я могу получить две траектории из одной симуляции.

Кто-нибудь знает возможно ли это? Или может есть другой подход?


person Dorian IL    schedule 08.03.2019    source источник


Ответы (1)


Я думаю, что следующее делает то, что вам нужно. Это немного громоздко, но стоит попробовать:

  1. Создайте вектор-столбец, содержащий желаемые выходные точки, и сохраните его в рабочем каталоге Dymola, например. используя МАТЛАБ:
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 игнорирует настройки в 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, содержащий результаты моделирования.

person Markus A.    schedule 12.03.2019
comment
Попробуем и сообщим :) - person Dorian IL; 13.03.2019