二维时间隐式格式高斯-赛德尔(G-S)点迭代MATLAB程序

本文提供了一个使用MATLAB实现的二维时间隐式格式高斯-赛德尔(G-S)点迭代法程序示例。该程序用于解决数值传热学问题,通过设置边界条件和网格系数,进行迭代求解直至收敛。适用于传热学研究及教学。

二维时间隐式格式高斯-赛德尔(G-S)点迭代MATLAB程序

代码改编自计算传热学–15-高斯-赛德尔(G-S)点迭代-数值传热学
下面是代码

%GSiteration implicit time 2d
clc
clear
%%
LengthX = 3;
LengthY = 2;
Tleft = 3.5;
Tright = 5;
Tbottom = 2;
Tup = 4;
den = 100;
s = 10;
k=10;
cv = 1000;
%%
dt = 200;
N = 15;%X
M = 15;%Y
maxstep = 200;
itermax = 1000;
maxresi = 1e-7;
%%
dx =LengthX/N;
dy =LengthY/M;
ae1 = zeros(M+2,N+2);
aw1 = zeros(M+2,N+2);
an1 = zeros(M+2,N+2);
as1 = zeros(M+2,N+2);
ap0 = zeros(M+2,N+2);
ap1 = zeros(M+2,N+2);
b= zeros(M+2,N+2);
T0 =zeros(M+2,N+2);
T1 = zeros(M+2,N+2);

resi = zeros(M+2,N+2);
Tall = zeros(M+2,maxstep+1);
resiall = zeros(maxstep,1);
iterall = zeros(maxstep,1);
%% 边界条件
T0(2:M+1,2:N+1) = 3;
T0(1:M+2,1) = Tleft;
T0(1:M+2,N+2) = Tright;
T0(1,1:N+2) = Tup;
T0(M+2,1:N+2) = Tbottom;

T1(1:M+2,1) = Tleft;
T1(1:M+2,N+2) = Tright;
T1(1,1:N+2) = Tup;
T1(M+2,1:N+2) = Tbottom;
%% 网格系数计算
%内部网格计算
ae1(3:M,3:N) = k*dy/dx;
aw1(3:M,3:N) = k*dy/dx;
an1(3:M,3:N) = k*dx/dy;
as1(3:M,3:N) = k*dx/dy;
ap0(3:M,3:N) = den*cv*dx*dy/dt;
ap1(3:M,3:N) = ap0(3:M,3:N)+ae1(3:M,3:N)+aw1(3:M,3:N)+an1(3:M,3:N)+as1(3:M,3:N);
b(3:M,3:N) = s*dx*dy;
%边界网格计算
%第一个
i=2;
for j=3:N
    ae1(i,j) = k*dy/dx;
    aw1(i,j) = k*dy/dx;
    an1(i,j) = k*dx/(dy/2);
    as1(i,j) = k*dx/dy;
    ap0(i,j) = den*cv*dx*dy/dt;
    ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
    b(i,j) = s*dx*dy;
end

i=M+1;
for j=3:N
    ae1(i,j) = k*dy/dx;
    aw1(i,j) = k*dy/dx;
    an1(i,j) = k*dx/dy;
    as1(i,j) = k*dx/(dy/2);
    ap0(i,j) = den*cv*dx*dy/dt;
    ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
    b(i,j) = s*dx*dy;
end
j=2;
for i=3:M
    ae1(i,j) = k*dy/dx;
    aw1(i,j) = k*dy/(dx/2);
    an1(i,j) = k*dx/dy;
    as1(i,j) = k*dx/dy;
    ap0(i,j) = den*cv*dx*dy/dt;
    ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
    b(i,j) = s*dx*dy;
end
j=N+1;
for i=3:M
    ae1(i,j) = k*dy/(dx/2);
    aw1(i,j) = k*dy/dx;
    an1(i,j) = k*dx/dy;
    as1(i,j) = k*dx/dy;
    ap0(i,j) = den*cv*dx*dy/dt;
    ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
    b(i,j) = s*dx*dy;
end

j=2;
i=2;
ae1(i,j) = k*dy/dx;
aw1(i,j) = k*dy/(dx/2);
an1(i,j) = k*dx/(dy/2);
as1(i,j) = k*dx/dy;
ap0(i,j) = den*cv*dx*dy/dt;
ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
b(i,j) = s*dx*dy;

j=2;
i=M+1;
ae1(i,j) = k*dy/dx;
aw1(i,j) = k*dy/(dx/2);
an1(i,j) = k*dx/dy;
as1(i,j) = k*dx/(dy/2);
ap0(i,j) = den*cv*dx*dy/dt;
ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
b(i,j) = s*dx*dy;

i=2;
j=N+1;
ae1(i,j) = k*dy/(dx/2);
aw1(i,j) = k*dy/dx;
an1(i,j) = k*dx/(dy/2);
as1(i,j) = k*dx/dy;
ap0(i,j) = den*cv*dx*dy/dt;
ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
b(i,j) = s*dx*dy;

i=M+1;
j=N+1;
ae1(i,j) = k*dy/(dx/2);
aw1(i,j) = k*dy/dx;
an1(i,j) = k*dx/dy;
as1(i,j) = k*dx/(dy/2);
ap0(i,j) = den*cv*dx*dy/dt;
ap1(i,j) = ap0(i,j)+ae1(i,j)+aw1(i,j)+an1(i,j)+as1(i,j);
b(i,j) = s*dx*dy;
%%
Tall(1:M+2,1:N+2) = T0;
%% iteration
for h = 1:maxstep
    Tn0 = T0;
    for iter = 1:itermax
        for i=M+1:-1:2
            for j=2:N+1
                T1(i,j) = (ae1(i,j)*Tn0(i,j+1)+aw1(i,j)*T1(i,j-1)...
                    +an1(i,j)*Tn0(i-1,j)+as1(i,j)*T1(i+1,j)...
                    +ap0(i,j)*T0(i,j)+b(i,j))/ap1(i,j);
            end
        end
        resimax = max(max(abs(T1-Tn0)));
        if resimax<maxresi
            break;
        end
        Tn0 = T1;
    end
    resiall(h) = resimax;
    iterall(h) = iter;
    T0=T1;
    Tall((h)*(M+2)+1:(h+1)*(M+2),1:N+2) = T0;
end
% plot(linspace(0,LengthX,N),Tall(maxstep*(M+2)+2,2:N+1));
T11=zeros(maxstep,1);
for i =1:maxstep+1
    T11(i) = Tall((i-1)*(M+2)+2,2);
end
plot(dt:dt:dt*maxstep,T11(2:maxstep+1));
hold on
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值