前言

本文为东三省数学建模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('温度/℃');

Python热传导方程 热传导方程数学建模_热力学


左边为十分钟左右后的三个面的温度分布,右边为一小时后的三个面的温度分布

Python热传导方程 热传导方程数学建模_热力学_02


另一个角度

Python热传导方程 热传导方程数学建模_数学建模_03


Python热传导方程 热传导方程数学建模_数学建模_04

心得分享

对于时间还算比较充分的东北三省联赛数学建模,时间上是完全够用的。关于分工,打数学建模一定要明确自己的定位,分工明确。在刚开始的时候可以不用那么分工明确,因为三个人都没有思路,就是一起讨论,用什么模型,用什么方法。之后有了一定的方向后再开始分工。对于这个赛题,我们最初也走了一些弯路,没有想到偏微分方程的方法,第一眼咋一看以为是道物理题,就全往物理方面想了,什么热传导,牛顿冷却定律,传热学,对流换热什么的都看了下,后来明白数学建模怎么可能没有数学方法。但是这也不算弯路,这些东西对后面建模也有重要作用。后来就开始研究偏微分方程,主要是研究怎么用上偏微分方程,然后一步步的把模型建起来。关于时间安排,留给论文排版的时间是绝对要有了,如果没有写论文的经历的话那更要有了,通常我们写的论文是非常不合格的,就单单改论文就要改很长时间。其他时间安排就看自己的进度了,论文这里是肯定要留时间的,不能写个初稿就完事了。如果到了后期,有些分工任务弄完的,比如建模代码写完的,图画完的,仿真弄完的,就可以帮着写论文的同学,帮忙把公式用word写出来,好让他直接能复制粘贴,帮忙看看语言逻辑通不通顺,错别字有没有等等。就是不能闲着,不是自己的任务做完就完事了。
如果你觉得文章对你有一点点帮助或启示的话,不妨点个赞噢😊