Оценка переменных в определенное время в Modelica
У меня есть выбор переменных в моем моделировании Modelica (с использованием Dymola), который работает хорошо. Теперь я хочу представить поведение некоторых из этих переменных, которые пронумерованы (с индексами). Я не хочу строить график зависимости переменных от времени, а от их индекса. Я планирую использовать plotArray
функция, но это не совсем то, что мне интересно в этом посте. Проблема в том, что все переменные равны нулю, когда я их вызываю, что действительно является их начальным значением, но я хочу получить их значение, когда установилось устойчивое состояние, скажем, когда time = 5000
, Следовательно, мне нужно оценить переменные в это конкретное время.
Как мне оценить переменную в определенное время из моделирования или в конце моделирования по этому вопросу?
Изменить: После обширного поиска в Google, я пришел к функции под названием val()
, который, кажется, делает то, что я хочу, но я не могу заставить его работать с моим программным обеспечением Dymola.
Редактировать 2: Мне удалось оценить мои переменные по желанию, но подход, который я использовал, был (на мой взгляд) за утомительным. Я извлек.mat-файл из симуляции в MATLAB, где мне в итоге удалось идентифицировать переменные по моему желанию, а затем нанести их на график в нужное время. Однако, что действительно удивило меня, так это явный хаос в отношении переменных в.mat-файле. На первый взгляд, было мало согласия между тем, как мои переменные упорядочены в модели Modelica и как они упорядочены в.mat-файле, и не было именования переменных, поэтому мне пришлось искать переменные исключительно на основе сравнения их значение с помощью симуляции Димолы. Я просто полностью ошибаюсь здесь, или есть какой-то более простой способ извлечь переменные из.mat-файла?
2 ответа
Может быть, я неправильно понимаю ваш вопрос, но я подозреваю, что здесь есть простой ответ. Похоже, у вас есть массив, и вы хотите заполнить этот массив значениями определенной переменной в определенное время, а затем построить массив. Так, например, скажем, у вас была переменная x
и вы хотите записать время, которое x
пересекли определенные пороги. Достаточно простой модели, подобной этой:
model RecordVariables
Real x;
Real times[10];
initial equation
x = 11;
equation
der(x) = -x;
when x<=10.0 then
times[1] = time;
end when;
when x<=9.0 then
times[2] = time;
end when;
when x<=8.0 then
times[3] = time;
end when;
when x<=7.0 then
times[4] = time;
end when;
when x<=6.0 then
times[5] = time;
end when;
when x<=5.0 then
times[6] = time;
end when;
when x<=4.0 then
times[7] = time;
end when;
when x<=3.0 then
times[8] = time;
end when;
when x<=2.0 then
times[9] = time;
end when;
when x<=1.0 then
times[10] = time;
end when;
end RecordVariables;
Конечно, выписывая все эти when
пункты довольно утомительно. Таким образом, мы можем создать более компактную версию, например:
model RecordVariables2
Real x;
Real times[5];
Integer i;
Real next_level;
initial equation
next_level = 10.0;
x = 11;
i = 1;
algorithm
der(x) :=-x;
when x<=pre(next_level) then
times[i] :=time;
if i<size(times,1) then
i :=pre(i) + 1;
next_level :=next_level - 1.0;
end if;
end when;
end RecordVariables2;
Несколько комментариев об этом подходе. Во-первых, обратите внимание на использование pre
оператор. Это необходимо для различения значений переменных i
а также next_level
как до, так и после событий, генерируемых when
пункт. Во-вторых, вы заметите if
заявление в рамках when
пункт, который предотвращает индекс i
от того, чтобы стать достаточно большим, чтобы "переполнить" times
буфер. Это позволяет вам установить times
иметь любой размер, который вы хотите, и никогда не рискуйте таким переполнением. Обратите внимание, однако, что в этой модели вполне возможно сделать times
настолько большой, что некоторые значения никогда не будут заполнены.
Надеюсь, это поможет.
Вы можете использовать DymBrowse.m для загрузки переменных из файла результатов в Matlab. Он должен быть доступен в папке \Program Files\Dymola xx\Mfiles\dymtools. Добавьте каталог \Mfiles... в ваши пути к Matlab.