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%
相关推荐
翔云 OCR API6 小时前
API让文档信息“活”起来:通用文档识别接口-开发者文字识别API
前端·数据库·人工智能·mysql·ocr
540_5406 小时前
ADVANCE Day22_复习日
人工智能·python·机器学习
良策金宝AI6 小时前
2025年度回顾:工程AI从“能用“走向“可信“的五大里程碑
人工智能
@鱼香肉丝没有鱼6 小时前
Transformer原理—注意力机制
人工智能·深度学习·transformer·注意力机制
AAD555888996 小时前
轴体分类识别:基于Decoupled-Solo-Light模型的中心轴、铁质轴和尼龙轴自动检测与分类系统
人工智能·分类·数据挖掘
新智元6 小时前
全网破防,AI「手指难题」翻车逼疯人类!6 根手指,暴露 Transformer 致命缺陷
人工智能·openai
循着风6 小时前
环形子数组的最大和
数据结构·算法·leetcode
CoovallyAIHub6 小时前
如何让AI的数据标注“火眼金睛”?人机协同才是可靠途径
深度学习·算法·计算机视觉
wa的一声哭了6 小时前
拉格朗日插值
人工智能·线性代数·算法·机器学习·计算机视觉·自然语言处理·矩阵