Оценка переменных в определенное время в Modelica

У меня есть набор переменных в моем моделировании Modelica (с использованием Dymola), который работает хорошо. Теперь я хочу изобразить поведение некоторых из этих переменных, которые пронумерованы (с индексами). Я не хочу строить график зависимости переменных от времени, а от их индекса. Я планирую использовать функцию plotArray, но в этом посте меня интересует не это. Проблема в том, что все переменные равны нулю, когда я их вызываю, что действительно является их начальным значением, но я хочу достичь их значения, когда установится устойчивое состояние, скажем, когда time = 5000. Следовательно, мне нужно оценить переменные в это конкретное время.

Как мне оценить переменную в определенное время из моделирования или в конце моделирования, если на то пошло?

Изменить: после обширных поисков в Google я нашел функцию под названием val(), которая, кажется, делает то, что я хочу, но я не могу заставить ее работать с моим программным обеспечением Dymola.

Редактировать 2: Мне удалось оценить мои переменные по своему желанию, но подход, который я использовал, был (на мой взгляд) слишком утомительным. Я извлек .mat-файл из моделирования в MATLAB, где мне в конечном итоге удалось идентифицировать переменные моего желания, а затем нанести их на график в желаемое время. Что меня действительно удивило, так это очевидный хаос в отношении переменных в .mat-файле. На первый взгляд было мало согласия между порядком моих переменных в модели Modelica и тем, как они упорядочены в .mat-файле, и не было никакого именования переменных, что оставляло меня искать переменные исключительно на основе их сравнения. значение с моделированием Dymola. Я здесь просто совершенно ошибаюсь, или есть более простой способ извлечь переменные из .mat-файла?


person CloudberryCream    schedule 14.08.2013    source источник


Ответы (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 настолько большим, что некоторые значения никогда не будут заполнены.

Надеюсь, это поможет.

person Michael Tiller    schedule 19.08.2013

Вы можете использовать DymBrowse.m для загрузки переменных из файла результатов в Matlab. Он должен быть доступен в \ Program Files \ Dymola xx \ Mfiles \ dymtools. Добавьте каталог \ Mfiles ... к вашим путям Matlab.

person Josefin    schedule 19.08.2013