Моделирование пространственных PDE в Modelica - доступ к значениям переменных в определенное время
Этот вопрос несколько связан с моим предыдущим вопросом, где я не совсем нашел правильное решение. Ссылка: ранее SO-нить
Я решаю PDE, которые являются временным вариантом с одним пространственным измерением (например, уравнение теплопроводности - см. Ссылку ниже). Я использую числовой метод линий, то есть дискретизирую пространственные производные, получая систему ОДУ, которые легко решаются в Modelica (используя инструмент Dymola). Мои проблемы возникают, когда я моделирую систему, или когда я строю результаты, чтобы быть точным. Сами уравнения, по-видимому, решаются правильно, но я хочу выразить пространственные изменения во всех дискретизированных переменных состояния в конкретные моменты времени, а не индивидуальное изменяющееся во времени поведение каждого дискретного состояния.
Стратегия, приводящая к моим проблемам, проиллюстрирована в этом уроке на Youtube, который, кстати, не сделан мной. Как вы можете видеть в самом конце учебника, изменяющееся во времени поведение температуры строится отдельно для всех дискретных точек стержня. То, что я хотел бы, является графиком, показывающим температуру через стержень в определенное время, то есть температуру как функцию пространственной координаты. Моя стратегия достижения этой цели, с которой я борюсь, заключается в следующем: учитывая вектор состояния из N записей:
Real[N] T "Temperature";
..Я бы использовал plotArray
Функция димолы, как показано ниже.
plotArray( {i for i in 1:N}, {T[i] for i in 1:N} )
Интуитивно понятно, что это даст график, показывающий температуру как функцию пространственной координаты или число в линии дискретных единиц, если быть точным. Хотя эта команда дает результат, все T-значения на графике выглядят как 0, что, безусловно, не так. Мой вопрос: как я могу успешно получить и построить графики температур во всех дискретных точках в данный момент времени? Заранее спасибо за помощь.
Код проблемы, как указано ниже.
model conduction
parameter Real rho = 1;
parameter Real Cp = 1;
parameter Real L = 1;
parameter Real k = 1;
parameter Real Tlo = 0;
parameter Real Thi = 100;
parameter Real Tinit = 30;
parameter Integer N = 10 "Number of discrete segments";
Real T[N-1] "Temperatures";
Real deltaX = L/N;
initial equation
for i in 1:N-1 loop
T[i] = Tinit;
end for;
equation
rho*Cp*der(T[1]) = k*( T[2] - 2*T[1] + Thi) /deltaX^2;
rho*Cp*der(T[N-1]) = k*( Tlo - 2*T[N-1] + T[N-2]) /deltaX^2;
for i in 2:N-2 loop
rho*Cp*der(T[i]) = k*( T[i+1] - 2*T[i] + T[i-1]) /deltaX^2;
end for
annotation (uses(Modelica(version="3.2")));
end conduction;
Дополнительное редактирование: Моделирование ясно показывает, что, например, T[3], то есть температура дискретного сегмента нет. 3, начинается с 30 и заканчивается на 70 градусов. Однако когда я пишу T [3] в своем командном окне, я получаю T3 = 0.0 взамен. Это почему? Это лежит в основе проблемы, потому что plotArray
Функция будет работать, если мне удастся извлечь фактические значения переменных в определенное время, а не только 0,0.
Предлагаемое решение: это довольно утомительное решение для достижения того, чего я хочу, и я надеюсь, что кто-то знает лучшее решение. Когда я запускаю симуляцию в Dymola, программа генерирует.mat-файл, содержащий значения переменных во время симуляции. Я могу загрузить этот файл в MATLAB и вручную извлечь переменные по своему выбору для построения. Для решения проблемы выше я написал следующую команду:
plot( [1:9]' , data_2(2:2:18 , 10)' )
Эта команда построит график температур (поскольку они хранятся вместе с их производными в массиве data_2 в.mat-файле) относительно соответствующего числа дискретного сегмента / элемента. Я действительно надеялся сделать это внутри Dymola, то есть избегать использования MATLAB для этого. Для этой конкретной задачи количество переменных было небольшим из-за простоты этой проблемы, но я легко могу изобразить.mat-файл, который значительно сложнее перемещать вручную, как я только что сделал.
1 ответ
Хотя вы не упоминаете это явно, я предполагаю, что вы вводите plotArray
команда в командном окне Димолы. Это не будет работать напрямую, так как переменные, которые вы видите там, не включают результаты вашего моделирования: если я имитирую вашу модель, а затем введите T[:]
в командном окне Dymola, то печатный результат
T[:]
= {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}
Я не эксперт по Dymola, и единственное решение, которое я нашел (для активного хранения и загрузки желаемых результатов моделирования), довольно громоздко:
simulateModel("conduction", resultFile="conduction.mat")
n = readTrajectorySize("conduction.mat")
X = readTrajectory("conduction.mat", {"Time"}, n)
Y = readTrajectory("conduction.mat", {"T[1]", "T[2]", "T[3]"}, n)
plotArrays(X[1, :], transpose(Y))