基于MATLAB的冰块变化仿真

如图1所示,边长为5cm的冰块,初始温度为-2℃,放在25℃的环境中自然冷却,对流换热系数为10W/m²K,本文将通过matlab编程求解冰块融化的过程,计算其温度场。

图1 案例示意图

02

温度场计算

本文通过matlab分别计算t=1min、5min、10min和20min后的温度云图及瞬态温度变化过程(计算总时间30min),计算结果展示如下表:

|-----------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|
| | |
| 1min | 5min |
| | |
| 10min | 20min |

复制代码
% 参数设置
Lx = 0.05; Ly = 0.05;   % 冰块尺寸(5cm x 5cm)
nx = 31; ny = 31;         % 网格数量
dx = Lx/(nx-1); dy = Ly/(ny-1);
T_initial = -2;           % 初始温度(℃)
T_env = 25;               % 环境温度(℃)
h = 10;                   % 对流换热系数(W/m²K)

% 材料属性(冰)
rho_ice = 920;           % 密度(kg/m³)
k_ice = 2.18;            % 导热系数(W/mK)
c_ice = 2100;            % 比热容(J/kgK)
L = 334000;              % 潜热(J/kg)

% 材料属性(水)
k_water = 0.6;           % 导热系数(W/mK)
c_water = 4200;          % 比热容(J/kgK)

% 时间参数
alpha_ice = k_ice/(rho_ice*c_ice);
dt = 1 * dx^2/(4*alpha_ice); % 时间步长
total_time = 605;             % 总模拟时间(秒)
n_steps = round(total_time/dt);

% 初始化
T = T_initial * ones(nx, ny);
f = zeros(nx, ny);       % 液相分数
k = k_ice * ones(nx, ny);
c = c_ice * ones(nx, ny);

% 创建图形窗口
figure;
h_plot = pcolor(T);
shading interp;          % 双线性插值
colormap(jet(1024));     % 1024级颜色渐变
colorbar;
axis equal tight;
title('Temperature (℃)');

% 预计算常数
mass = rho_ice * dx^2;  % 每个节点的质量(假设厚度为1m)

% 主循环
for step = 1:n_steps
    T_old = T;
    f_old = f;
    k_old = k;
    c_old = c;

    % ========== 向量化热流计算 ========== %
    % 初始化各方向热流矩阵
    [Q_east, Q_west, Q_north, Q_south] = deal(zeros(nx, ny));
    
    % 东向热流 (i < nx)
    if nx > 1
        k_east = 2 * k_old(1:end-1,:) .* k_old(2:end,:) ./ (k_old(1:end-1,:) + k_old(2:end,:) + eps);
        Q_east(1:end-1,:) = k_east .* (T_old(2:end,:) - T_old(1:end-1,:));
    end
    
    % 西向热流 (i > 1)
    if nx > 1
        k_west = 2 * k_old(2:end,:) .* k_old(1:end-1,:) ./ (k_old(2:end,:) + k_old(1:end-1,:) + eps);
        Q_west(2:end,:) = k_west .* (T_old(1:end-1,:) - T_old(2:end,:));
    end
    
    % 北向热流 (j < ny)
    if ny > 1
        k_north = 2 * k_old(:,1:end-1) .* k_old(:,2:end) ./ (k_old(:,1:end-1) + k_old(:,2:end) + eps);
        Q_north(:,1:end-1) = k_north .* (T_old(:,2:end) - T_old(:,1:end-1));
    end
    
    % 南向热流 (j > 1)
    if ny > 1
        k_south = 2 * k_old(:,2:end) .* k_old(:,1:end-1) ./ (k_old(:,2:end) + k_old(:,1:end-1) + eps);
        Q_south(:,2:end) = k_south .* (T_old(:,1:end-1) - T_old(:,2:end));
    end
    
    % 边界对流条件
    Q_boundary = zeros(nx, ny);
    Q_boundary(1,:)   = h*(T_env - T_old(1,:))*dx;   % 西边界
    Q_boundary(end,:) = h*(T_env - T_old(end,:))*dx; % 东边界 
    Q_boundary(:,1)   = h*(T_env - T_old(:,1))*dx;   % 南边界
    Q_boundary(:,end) = h*(T_env - T_old(:,end))*dx; % 北边界
    
    % 总热流
    Q_total = Q_east + Q_west + Q_north + Q_south + Q_boundary;
    delta_Q = Q_total * dt;

    % ========== 向量化相变计算 ========== %
    T_new = T_old;
    f_new = f_old;
    
    % 计算材料属性掩膜
    is_water = f_old >= 1;
    
    % 情况1: 冰升温(T < 0)
    ice_mask = T_old < 0 & ~is_water;
    delta_T_ice = delta_Q ./ (mass * c_ice);
    T_new(ice_mask) = T_old(ice_mask) + delta_T_ice(ice_mask);
    
    % 处理过零冰节点
    over_zero = ice_mask & T_new >= 0;
    Q_used = (0 - T_old(over_zero)) * mass * c_ice;
    Q_remaining = delta_Q(over_zero) - Q_used;
    Q_remaining(Q_remaining < 0) = 0;
    delta_f = Q_remaining / (L * mass);
    
    T_new(over_zero) = 0;
    f_new(over_zero) = delta_f;
    
    % 情况2: 相变中(T == 0且f < 1)
    melting_mask = (T_old == 0) & (f_old < 1);
    delta_f_melt = delta_Q(melting_mask) / (L * mass);
    f_new(melting_mask) = f_old(melting_mask) + delta_f_melt;
    
    % 情况3: 水升温(T >= 0且f >= 1)
    water_mask = ~ice_mask & ~melting_mask;
    delta_T_water = delta_Q(water_mask) ./ (mass * c_water);
    T_new(water_mask) = T_old(water_mask) + delta_T_water(water_mask);
    
    % 处理完全融化
    full_melt = f_new > 1;
    excess = f_new(full_melt) - 1;
    T_new(full_melt) = excess * L / c_water;
    f_new(full_melt) = 1;
    
    % 更新材料属性
    k = k_water * full_melt + k_ice * ~full_melt;
    c = c_water * full_melt + c_ice * ~full_melt;
    
    % 更新场变量
    T = T_new;
    f = f_new;

    % ========== 可视化更新 ========== %
    if mod(step, 10) == 0
        set(h_plot, 'CData', T);
        title(sprintf('Time: %.2f s', step*dt));
        drawnow;
    end
end

% 显示最终结果
figure;
pcolor(T);
shading interp;
colormap(jet(1024));
colorbar;
axis equal tight;
title('Final Temperature Distribution (℃)');
xlabel('X');
ylabel('Y');
相关推荐
CiLerLinux26 分钟前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
七芒星20232 小时前
多目标识别YOLO :YOLOV3 原理
图像处理·人工智能·yolo·计算机视觉·目标跟踪·分类·聚类
楼田莉子2 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习
逻辑留白陈2 小时前
Adaboost进阶:与主流集成算法对比+工业级案例+未来方向
算法
Learn Beyond Limits3 小时前
Mean Normalization|均值归一化
人工智能·神经网络·算法·机器学习·均值算法·ai·吴恩达
ACERT3333 小时前
5.吴恩达机器学习—神经网络的基本使用
人工智能·python·神经网络·机器学习
天选之女wow3 小时前
【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
算法·leetcode·贪心算法
Gohldg3 小时前
C++算法·贪心例题讲解
c++·数学·算法·贪心算法
韩立学长3 小时前
【开题答辩实录分享】以《基于python的奶茶店分布数据分析与可视化》为例进行答辩实录分享
开发语言·python·数据分析
天若有情6733 小时前
C++空值初始化利器:empty.h使用指南
开发语言·c++