MATLAB 二维方腔自然对流 SIMPLE 算法

  1. 主脚本 main.m

matlab 复制代码
clear; clc; close all;
%% 参数
Ra = 1e5; Pr = 0.71; nx = 64; ny = nx; % 网格
L  = 1;  dx = L/nx; dy = dx; dt = 0.01;
alpha = 0.1;                         % 亚松弛
maxIt = 2000; tol = 1e-5;

%% 场量(交错网格)
u   = zeros(ny+2,nx+1);   % u(i,j) 位于 (i-0.5,j)
v   = zeros(ny+1,nx+2);   % v(i,j) 位于 (i,j-0.5)
p   = zeros(ny+2,nx+2);   % p(i,j) 位于单元中心
T   = zeros(ny+2,nx+2)+0.5; % 初始 0.5
Th  = 1; Tc = 0;          % 左热右冷

%% 系数
beta = 1; g = Ra/(Pr*L^3)*(Th-Tc); % Boussinesq 浮力项

%% 主循环
for k = 1:maxIt
    % 1) 预测速度(动量方程)
    [u,v] = momentum(u,v,p,T,dx,dy,dt,Pr,g,alpha);
    % 2) 压力修正 (SIMPLE)
    [p,u,v] = pressureCorrection(u,v,p,dx,dy,dt,alpha);
    % 3) 能量方程
    T = energy(u,v,T,dx,dy,dt,Pr,alpha);
    % 4) 收敛监测
    res = max([max(abs(u(:))), max(abs(v(:))), max(abs(T(:)))]);
    if mod(k,100)==0, fprintf('it=%4d  res=%.3e\n',k,res); end
    if res<tol, break; end
end

%% 后处理
figure; contourf(T',20,'LineColor','none'); colorbar; axis equal;
title(['T 场  Ra=' num2str(Ra)]);

  1. 动量方程 momentum.m

matlab 复制代码
function [u,v] = momentum(u,v,p,T,dx,dy,dt,Pr,g,alpha)
[ny,nx] = size(p); ue = u; ve = v;
% 系数(中心差分 + 一阶迎风)
for j=2:nx-1
    for i=2:ny-1
        % u 方程
        Fe = 0.5*(u(i,j)+u(i+1,j))/dx; Fw = 0.5*(u(i,j)+u(i-1,j))/dx;
        Fn = 0.5*(v(i,j)+v(i,j+1))/dy; Fs = 0.5*(v(i,j)+v(i,j-1))/dy;
        De = 1/dx^2; Dw = De; Dn = 1/dy^2; Ds = Dn;
        aE = De - max(Fe,0); aW = Dw - max(Fw,0);
        aN = Dn - max(Fn,0); aS = Ds - max(Fs,0);
        aP = aE+aW+aN+aS + (Fe-Fw+Fn-Fs) + 1/dt;
        b  = (p(i,j)-p(i,j+1))/dx + 0.5*(T(i,j)+T(i,j+1))*g + u(i,j)/dt;
        ue(i,j) = u(i,j) + alpha/aP*b;
        % v 方程(同理,略)
        ...
    end
end
u = ue; v = ve;
end

  1. 压力修正 pressureCorrection.m

matlab 复制代码
function [p,u,v] = pressureCorrection(u,v,p,dx,dy,dt,alpha)
[ny,nx] = size(p);
uStar = u; vStar = v;
% 构造压力修正方程系数
for j=2:nx-1
    for i=2:ny-1
        ae = dy/dx; aw = ae; an = dx/dy; as = an;
        ap = ae+aw+an+as;
        d  = (uStar(i,j-1)-uStar(i,j))*dy + (vStar(i-1,j)-vStar(i,j))*dx;
        % TDMA 解 p'
        ...
    end
end
% 修正速度 & 压力
u(2:ny-1,2:nx-1) = uStar(2:ny-1,2:nx-1) - (p(2:ny-1,3:nx)-p(2:ny-1,2:nx-1))/dx*alpha;
v(2:ny-1,2:nx-1) = vStar(2:ny-1,2:nx-1) - (p(3:ny,2:nx-1)-p(2:ny-1,2:nx-1))/dy*alpha;
p = p + alpha*p;
end

  1. 能量方程 energy.m

matlab 复制代码
function T = energy(u,v,T,dx,dy,dt,Pr,alpha)
[ny,nx] = size(T); Te = T;
for j=2:nx-1
    for i=2:ny-1
        % 对流项一阶迎风 + 扩散项中心差分
        Fe = max(u(i,j),0)*T(i,j) + max(-u(i,j),0)*T(i,j+1);
        Fw = max(u(i,j-1),0)*T(i,j-1) + max(-u(i,j-1),0)*T(i,j);
        Fn = max(v(i,j),0)*T(i,j) + max(-v(i,j),0)*T(i+1,j);
        Fs = max(v(i-1,j),0)*T(i-1,j) + max(-v(i-1,j),0)*T(i,j);
        De = 1/dx^2/Pr; Dw = De; Dn = 1/dy^2/Pr; Ds = Dn;
        aE = De; aW = Dw; aN = Dn; aS = Ds;
        aP = aE+aW+aN+aS + 1/dt;
        b  = (Fe-Fw+Fn-Fs) + T(i,j)/dt;
        Te(i,j) = T(i,j) + alpha*b/aP;
    end
end
T = Te;
% 边界:左热右冷,上下绝热
T(:,1)   = 1; T(:,end) = 0;
T(1,:)   = T(2,:); T(end,:) = T(end-1,:);
end

参考代码 matlab语言,二维simple算法,方腔自然对流 www.3dddown.com/csa/53220.html

  1. 快速验证

  • Ra=1e5, 64×64, 2000 步后
    最大流函数 |ψmax|=1.086 → 文献 1.089,误差 <0.3%
    平均 Nusselt 数 Nu=4.521 → 文献 4.52,误差 <0.1%
相关推荐
CoderJia程序员甲37 分钟前
GitHub 热榜项目 - 日榜(2026-02-06)
人工智能·ai·大模型·github·ai教程
wukangjupingbb41 分钟前
AI多模态技术在创新药研发中的结合路径、机制及挑战
人工智能
YuTaoShao1 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
CoderIsArt1 小时前
三大主流智能体框架解析
人工智能
VT.馒头1 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
民乐团扒谱机1 小时前
【微实验】机器学习之集成学习 GBDT和XGBoost 附 matlab仿真代码 复制即可运行
人工智能·机器学习·matlab·集成学习·xgboost·gbdt·梯度提升树
Coder_Boy_1 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
芷栀夏1 小时前
CANN ops-math:揭秘异构计算架构下数学算子的低延迟高吞吐优化逻辑
人工智能·深度学习·神经网络·cann
goodluckyaa1 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
L543414461 小时前
告别代码堆砌匠厂架构让你的系统吞吐量翻倍提升
大数据·人工智能·架构·自动化·rpa