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%
相关推荐
九硕智慧建筑一体化厂家11 小时前
直流照明降损节能,智慧路灯点亮智慧城市脉络
人工智能·智慧城市
秦先生在广东11 小时前
Block Buzz:用 Nostr 协议把 AI Agent 变成真正的队友,而非自动化幽灵
人工智能
观测云11 小时前
观测云基于 AI Agent Teams 能力的场景实践
人工智能
小程故事多_8011 小时前
算力工厂与安全沙箱,企业AI规模化落地的两条核心生命线
人工智能·安全
吨吨ai11 小时前
2026年7月更新:ChatGPT、Codex、Pro、Plus 背后的 AI Determinism 问题(GPT-5.6 工程化技术分享)
人工智能·gpt·chatgpt
空中湖11 小时前
Spring AI 多模态实战:让 AI 看图、听声音、生成图片
人工智能·spring·语音识别
在水一缸11 小时前
苹果AI国行版过审背后的技术架构深度解析:端侧模型与私有云计算的融合实践
人工智能·架构·云计算·技术架构·苹果ai·端侧模型·私有云计算
乔氪智造11 小时前
我给 Agent 写的循环,一半是护栏
人工智能
武子康11 小时前
Shippy 全拆:3 个集合收缩(动作 / 状态 / 后果)+ 4 类边界(版本化行为 / Typed API / CLI / Sandbox)
人工智能·agent·aiops
QXWZ_IA11 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务