前言
本文为东三省数学建模B赛题,室温调控模型的建模以及仿真思路分享。是一个围绕偏微分方程的设立求解的数学模型。赛题连接 声明:本文所有图片均出自论文、未经允许,谢绝使用。
思路
如何建立一个室内温度的控制模型呢?当时刚看到这个赛题的时候,我首先想到的是各种物理公式,传热学,对流换热,牛顿冷却定律什么的,这些传热学的定律公式确实是非常有用的,但是还需要温度分布图,这就没办法单单只靠这些公式完成。那么存在热源的一个温室,他的温度分布用什么样的模型来搭建,偏微分方程解决了这个问题。偏微分方程在这个模型中简单来说就是是用来求热量传递的时候,在一段时间后热量如何分布的。一维的偏微分方程就是求一条线上的温度分布,二维就是求一个面上的温度分布。当然三维的偏微分方程就是求室内的温度分布。但是这里面临一个问题,三维的偏微分方程的数值解是非常难解的,为了计算的方便,可以采用二维的偏微分方程求解南北墙面的温度分布,再利用南北墙面的温度作为底面的一个边界条件来求XOY面的一个温度分布。这个就能够大概的描述整个室内的一个温度分布情况。作为有热源的情况还得单独设立热源。并且要做出许多假设,各个边界是绝热条件还是不绝热,这都是问题,具体情况具体分析。
建模假设
针对模型,我做了如下的假设:
1:暖气片可以完全转化热量,进水口温度就是暖气片温度;
2:暖气片散热方式以对流传热为主;
3:东西墙绝热,没有热量散失;
4:不考虑热辐射的影响;
5:房间初始温度与室外一致;
6:假设各个墙体内不含内热源。
偏微分方程的matlab求解
这部分我当时也有很大的困惑,不明白怎么将这个和温度联系起来,怎么和室外温度联系起来。后来我发现,是我对偏微分方程的理解不够全面,可能现在也还是。因为我不是数学专业的,这些数学原理我也不太懂。我说下我的理解:求解温度分布,简单来说就是把二维墙面的温度分布设置为一个矩阵,矩阵上的每一个点就代表墙面上一个点的温度,然后建立二维偏微分方程,求解它的数值解,就能求出在一段时间后这个墙面的温度分布矩阵。二维偏微分方程的求解用的是有限差分法,网上也有很多教程,这边对于求解就不具体说了。说下简单的步骤:
- 设出三个方向传递的A矩阵
- 设出墙面的初始温度分布矩阵
- 设定热源矩阵
- 设置边界条件
- 通过有限差分法,迭代求解偏微分方程。
- 画出图像
matlab仿真画图
给出第一问的matlab程序,可以复制粘贴运行试试。但是求解偏微分方程是给很大的计算量,通常要计算非常的久(看时间间隔怎么取的),通常我为了画出一个图,跑程序就得跑个把小时,甚至更久。
% 定义变量
C_w = 4200; % 定义水的比热容
lou_w = 1000; % 定义水的密度
V_w = 0.5; % 定义水流量
m_w = lou_w*V_w; % 定义水的质量
K_s = 50; % 暖气片传热系数
F_s = 2; % 暖气片对流换热面积
T_h = 40; % 暖气水温
T_out = 0; % 室外温度
sigma1 = 0.25; % 墙体厚度
lamda1 = 1.2; % 墙体传热系数
lamda2 = 5.7; % 玻璃传热系数
h1 = 0.9; % 内表面传热系数
h2 = 1.6; % 外表面传热系数
dx = 0.05; % 给定差分变量取值范围
Lx = 5; % 定义x轴距离
x = 0:dx:Lx; % 差分密度
Lxx = 5; % 同上
xx = 0:dx:Lxx;
dz = 0.05;
Lz = 2.8; % 同上
z = 0:dz:Lz;
dy = 0.05;
Ly = 10; % 同上
y = 0:dy:Ly;
time = 360; % *10即为实际时间
dt = 0.0001;
t = 0:dt:time;
Ax = (-2*eye(length(x))+diag(ones(1, length(x)-1), 1)+diag(ones(1, length(x)-1), -1)); % 定义X方向的A矩阵
Ay = (-2*eye(length(y))+diag(ones(1, length(y)-1), 1)+diag(ones(1, length(y)-1), -1)); % 定义Y方向上的A矩阵
Az = (-2*eye(length(z))+diag(ones(1, length(z)-1), 1)+diag(ones(1, length(z)-1), -1)); % 定义Z方向上的A矩阵
[Z, X] = meshgrid(z, x);
[Y, XX] = meshgrid(y, xx);
U0xoz = ones(length(Ax), length(Az))*0; % 定义南北墙初始温度为0℃
U0xoy = ones(length(Ax), length(Ay))*0; % 定义xoy面初始温度0℃
fxozs = ones(length(Ax), length(Az));
fxozs(20:90, 1:25) = 40; % 定义热源(仅南墙暖气作用)
fxozn = ones(length(Ax), length(Az));
fxozn(20:90, 1:25) = 30; % 定义热源(仅北墙暖气作用)
fxoy1 = 5*exp(-1/2*(((XX-2.5).^2)/1+((Y-8.75).^2)/1));
fxoy2 = 5*exp(-1/2*(((XX-2.5).^2)/1+((Y-1.25).^2)/1));
border_n = 8*exp(-1/2*(((z-1).^2)/1)); % 定义边界条件
border_nx = 10*exp(-1/2*(((x-2.5).^2)/1)); % 定义边界条件
Uxozs = U0xoz;
Uxozn = U0xoz;
Uxoy = U0xoy;
a = 0.22; % 定义散热系数
xm = zeros(1, time*10); % 控制变量的定义
xm_in_s = zeros(1, time*10);
xm_in_n = zeros(1, time*10);
xm_in_xoy = zeros(1, time*10);
temp = 1; % 控制变量的定义
temp_in_s = 1;
temp_in_n = 1;
temp_in_xoy = 1;
Q_w = 0; % 墙体导热初值设置
Q_s = 0; % 对流换热初值设置
for n = 1:length(t)-1 % 迭代时间,计算热传导偏微分方程
Uxozs = Uxozs+a^2*(1/dx^2*Ax*Uxozs+1/dz^2*Uxozs*Az+fxozs )*dt; % 南墙的温度分布
min_xoz_s = mean(Uxozs,2); % 计算南墙平均温度分布,压缩为一维向量作为xoy面的边界条件
Uxozs(:, 1) = border_nx; % 边界设置
Uxozs(:, end) = Uxozs(:,end-1);
Uxozs(1, :) = border_n;
Uxozs(end, :) = border_n;
Uxozn = Uxozn+a^2*(1/dx^2*Ax*Uxozn+1/dz^2*Uxozn*Az+fxozn)*dt; % 北墙的温度分布
min_xoz_n = mean(Uxozn,2); % 计算北墙平均温度分布,压缩为一维向量
Uxozn(:, 1) = border_nx; % 边界设置
Uxozn(:, end) = Uxozn(:,end-1);
Uxozn(1, :) = border_n;
Uxozn(end, :) = border_n;
Uxoy = Uxoy+a^2*(1/dx^2*Ax*Uxoy+1/dy^2*Uxoy*Ay+fxoy1+fxoy2)*dt; % xoy墙的温度分布
Uxoy(:, 1) =min_xoz_s; % 绝缘设置
Uxoy(:, end) = min_xoz_n;
Uxoy(1, :) = Uxoy(2, :);
Uxoy(end, :) = Uxoy(end-1, :);
min_in_s = mean(Uxozs(:)); % 南墙的均值
min_in_n = mean(Uxozn(:)); % 北墙的均值
min_in_xoy = mean(Uxoy(:)); % xoy的均值
%------------------------------------------回水温度的计算--
Q_w = ((min_in_s'-T_out)/((1/h1)+(sigma1/lamda1)+(1/h2)))*5*2.8*2*3600; % 墙体换热
Q_s = K_s*F_s*(T_h-min_in_s')*3600; % 对流换热第一个暖气片
Q_t = Q_w+Q_s; % 计算总能量
T_x = T_h-(Q_t/(C_w*m_w)); % 计算回水温度
fxozn(20:90, 1:25) = T_x; % 将回水温度设置为北墙的热源
xm(1, temp) = T_x; % 将回水温度存入向量,之后绘图
xm_in_s(1, temp_in_s) = min_in_s; % 保存数据画图
xm_in_n(1, temp_in_n) = min_in_n;
xm_in_xoy(1, temp_in_xoy) = min_in_xoy;
if mod(n,1000) == 1 % 加速画图
temp = temp + 1;
temp_in_s = temp_in_s + 1;
temp_in_n = temp_in_n + 1;
temp_in_xoy = temp_in_xoy + 1;
subplot(311);
surf(X,Z,Uxozs); % 绘制南墙温度分布
shading interp;
axis([x(1) x(end) z(1) z(end) 0 40]);
title('南墙温度分布')
xlabel('x/m');
ylabel('z/m');
zlabel('T/℃');
subplot(312);
surf(X,Z,Uxozn); % 绘制北墙温度分布
shading interp;
axis([x(1) x(end) z(1) z(end) 0 40]);
title('北墙温度分布');
xlabel('x/m');
ylabel('z/m');
zlabel('T/℃');
subplot(313);
surf(XX,Y,Uxoy); % 绘制xoy墙温度分布
shading interp;
axis([xx(1) xx(end) y(1) y(end) 0 40]);
title('xoy面温度分布');
xlabel('x/m');
ylabel('y/m');
zlabel('T/℃');
% view(2); % 改变视角方向
getframe;
end
end
% 绘图
x = 1:1:time*10;
figure(4);
plot(x, xm(1, 1:time*10));
legend('出水口温度')
title('暖气回水温度与时间的关系');
xlabel('时间/s');
ylabel('回水温度/℃');
axis([x(1) x(time*10) 0 40]);
figure(5);
plot(x, xm_in_s(1, 1:time*10));
hold on
plot(x, xm_in_n(1, 1:time*10));
hold on
plot(x, xm_in_xoy(1, 1:time*10));
legend('南墙平均温度', '北墙平均温度', '底面xoy面平均温度')
axis([x(1) x(time*10) 0 30]);
title('各个面温度随时间变化曲线');
xlabel('时间/s');
ylabel('温度/℃');
左边为十分钟左右后的三个面的温度分布,右边为一小时后的三个面的温度分布
另一个角度
心得分享
对于时间还算比较充分的东北三省联赛数学建模,时间上是完全够用的。关于分工,打数学建模一定要明确自己的定位,分工明确。在刚开始的时候可以不用那么分工明确,因为三个人都没有思路,就是一起讨论,用什么模型,用什么方法。之后有了一定的方向后再开始分工。对于这个赛题,我们最初也走了一些弯路,没有想到偏微分方程的方法,第一眼咋一看以为是道物理题,就全往物理方面想了,什么热传导,牛顿冷却定律,传热学,对流换热什么的都看了下,后来明白数学建模怎么可能没有数学方法。但是这也不算弯路,这些东西对后面建模也有重要作用。后来就开始研究偏微分方程,主要是研究怎么用上偏微分方程,然后一步步的把模型建起来。关于时间安排,留给论文排版的时间是绝对要有了,如果没有写论文的经历的话那更要有了,通常我们写的论文是非常不合格的,就单单改论文就要改很长时间。其他时间安排就看自己的进度了,论文这里是肯定要留时间的,不能写个初稿就完事了。如果到了后期,有些分工任务弄完的,比如建模代码写完的,图画完的,仿真弄完的,就可以帮着写论文的同学,帮忙把公式用word写出来,好让他直接能复制粘贴,帮忙看看语言逻辑通不通顺,错别字有没有等等。就是不能闲着,不是自己的任务做完就完事了。
如果你觉得文章对你有一点点帮助或启示的话,不妨点个赞噢😊