Определение давления жидкости на разной высоте бака¶
В этом примере мы продемонстрируем одно свойство теплопроводящей жидкости, в связи с которым температура может немного отличаться на разной высоте при ее нахождении в баке.
Описание модели¶
Создадим систему, состоящую из бака, насоса который качает в него жидкость из резервуара и нескольких датчиков.
В реальной жидкости, описываемой уравнением состояния, температура на разной высоте будет незначительно отличаться из-за изменения давления в столбе жидкости (гидростатический эффект) и термодинамических свойств среды. Разберём этот вопрос строго.
Для жидкости, подчиняющейся уравнению состояния, распределение температуры и давления определяется гидростатическим законом $\frac{dP}{dh} = \rho(h) \cdot g$, уравнениями состояния $\rho = \rho(P,T)$ и $u = u(P,T)$ и несколькими дополнительными эффектами (теплового равновесия, сжатия/расширения). Здесь $P$ - давление, $T$ - температура, $h$ - высота, $\rho$ - плотность, $g$ - ускорение свободного падения, $u$ - удельная внутренняя энергия.
Нижние слои жидкости находятся под чуть большим давлением, поэтому жидкость на дне бака будет незначительно более теплой, чем на поверхности.
В реальности множество других тепловых эффектов вряд ли позволят пронаблюдать эксперимент в представленной здесь постановке. Перемешивание, тепловой эффект насоса, теплообмен через стенки бака - всё это может иметь влияние на температуру жидкости.
Запуск модели и анализ результатов¶
В нашей модели бак имеет диаметр 1 $м^2$, в него втекает жидкость, закачиваемая насосом со скоростью 1 кг/с, расчет ведется от 0 до 1000 секунд. Датчики температуры жидкости расположены на высоте 1, 2 и 3 м.
model_name = "tank_temperature_at_different_heights";
model_name in [m.name for m in engee.get_all_models()] ? engee.open(model_name) : engee.load( "$(@__DIR__)/$(model_name).engee");
res = engee.run( model_name );
За время наблюдения уровень жидкости в баке поднялся на 1м. Посмотрим, как изменялись показатели температуры на разной высоте.
gr()
using Plots.PlotMeasures
plot(
plot( res["Уровень воды"].time, res["Уровень воды"].value, label=false, title="Уровень воды, м",
xlabel="Время, с", ylabel="Высота, м" ),
plot( res["Сенсор 2м.1"].time,
[res["Сенсор 1м.1"].value res["Сенсор 2м.1"].value res["Сенсор 3м.1"].value],
label=["1м" "2м" "3м"], title="Датчики температуры", xlabel="Время, с", ylabel="Температура, К"),
size=(1000,400), titlefont=font(11), guidefont=font(10), left_margin = [10mm 0mm], bottom_margin = 30px
)
Между отметками 1м и 2м датчики показывают разные значения температуры, но масштаб отличия вряд ли можно будет изменить в реальности – за 1м температура падает на 1.41e-4 К
(десятитысячные доли градуса). Но зато мы видим, что температура на дне резервуара слегка больше, чем на поверхности.
res["Сенсор 2м.1"].value[1] - res["Сенсор 1м.1"].value[1]
Если взять один из графиков от температурного датчика и вычесть линейный тренд, можно даже увидеть очень небольшую нелинейность:
t = res["Сенсор 1м.1"].time
v = res["Сенсор 1м.1"].value
a = [t.^0 t.^1] \ v
разница = v .- (a[1] .+ a[2].*t)
plot( t, разница, label=false )
plot!( [t[1],t[end]], [разница[1],разница[end]], ls=:dash, c=:red, label=false )
plot!(title = "Нелинейный компонент измерения Т", xlabel="Время, с", ylabel="Температура, К\n(нелинейное слагаемое)",
titlefont=font(11), guidefont=font(10), left_margin = [10mm 0mm], bottom_margin = 30px)
Заключение¶
Мы показали на простом примере, как виртуальный эксперимент, сформулированный при помощи блоков из библиотеки теплопроводящая жидкость позволяет продемонстрировать некоторые теоретические эффекты, которые довольно трудно наблюдать эмпирически на учебных лабораторных установках. Но они проявятся в более сложных случаях, и это эффекты, которыми бывает опасно пренебрегать.