Язык Wolfram Language

Дифференциальные уравнения в частных производных

Решение дифференциальных уравнений в частных производных с событиями в области определения

Смоделировать контролируемую термостатом термогенерацию в комнате с тремя теплоизолированными стенами и застеклённой передней стеной, подверженной внешней температуре.

In[1]:=
Click for copyable input
\[CapitalOmega] = Rectangle[{0, 0}, {3/2, 1}]; outsideTemp[t_] := 15 + 10*Sin[2 \[Pi] t/24]; kd = 0.78; Ld = 0.05; \[CapitalGamma] = NeumannValue[Ld/kd*(outsideTemp[t] - u[t, x, y]), {x == 0}];

Нагрузка на отопитель повышается и понижается под влиянием какого-либо события.

In[2]:=
Click for copyable input
heaterLoad = 26; heater[upQ_, t_, tEvent_] := If[upQ == 1, Min[20*Max[(t - tEvent), 0], 1], 1 - Min[20*Max[(t - tEvent - 1/8), 0], 1]]*heaterLoad

Дифференциальное уравнение в частных производных моделирует распространение тепла в воздухе при генерации тепла, происходящеe в круге и при потери тепла через стеклянное окно.

In[3]:=
Click for copyable input
\[Rho] = 1.225; Cp = 1005.4; With[{heating = heater[a[t], t, eventT[t]]}, pde = D[u[t, x, y], t] - \[Rho]*Cp*Laplacian[u[t, x, y], {x, y}] == If[(x - 1/2)^2 + (y - 1/2)^2 <= (2/10)^2, heating, 0] + \[CapitalGamma]];

Если термостат в позиции измеряет температуру ниже/выше порогового уровня и если дискретная переменная изменяется, обогреватель включается/выключается.

In[4]:=
Click for copyable input
triggerLow = 18; triggerHigh = 20; events = {a[0] == 1, eventT[0] == 0, WhenEvent[ u[t, 1.25, .25] < triggerLow, {eventT[t], a[t]} -> {If[a[t] == 0, t, eventT[t]], 1}], WhenEvent[ u[t, 1.25, .25] > triggerHigh, {eventT[t], a[t]} -> {If[a[t] == 1, t, eventT[t]], 0}]};

Пронаблюдать временное интегрирование дифференциального уравнения в частных производных с начальными условиями, отображающими температурy воздуха на улице.

In[5]:=
Click for copyable input
eqn = {pde, u[0, x, y] == outsideTemp[0], events}; res = Monitor[ NDSolveValue[ eqn, {u, a}, {t, 0, 2*24}, {x, y} \[Element] \[CapitalOmega], DiscreteVariables -> {eventT[t], a[t]}, EvaluationMonitor :> (monitor = Row[{"t = ", CForm[t]}])], monitor]
Out[5]=

Визуализировать температуру, измеренную термостатом, температуру на улице, и пороговый уровень для обогревателя. Обогреватель отображен на голубом фоне.

In[6]:=
Click for copyable input
hp = Plot[ 25 res[[2]][t], {t, 0, 2*24}, Filling -> Bottom, PlotStyle -> None]; Show[ Plot[{res[[1]][t, 1.25, .25], outsideTemp[t], 18, 20}, {t, 0, 2*24}], hp]
Out[6]=

Родственные примеры

de en es fr ja ko pt-br zh