Gauss-Seidel 迭代节点间距

计算科学 matlab 收敛
2021-12-20 02:32:24

我正在做一项任务,我正在确定基板上芯片的温度分布。当我减小节点间距时,结果会发生巨大变化。节点间距越小,我得到的温度就越大。然而,当节点间距非常小(如 0.00001m)时,温度几乎为 0。应该发生这种情况吗?我应该在代码中寻找什么来纠正这种情况?我正在使用 MATLAB。

好的。我想我需要添加更多信息。我认为展示我的方程式的最佳方式是展示我的代码。我对每个节点使用的方程相当有信心。我都是手工推导出来的。当我使用 0.003 的节点间距时,我会得到非常低的温度。在 0.001 的增量下,我得到了合理的温度。我认为原因是在 0.003 米处没有足够的节点产生热量。

    %**********************************************
%--------Thermo Lab Numerical Project---------|
%-----------------Paul Fjare------------------|
%**********************************************
clear; clc
%Cooling of a silicon chip mounted in a dielectric
%substrate. 

ks=5; % W/m-K
kc=50;
ksc=(ks+kc)/2;

h=500; % W/m^2-K
qgen=10^7; %W/m^3
L=.027; % meters
H=.012;
Tamb=293.15; % temperature of coolant in Kelvin
delta=.003; % meters
N=100000; %iterations
B=h*delta/ks; %dimensionless
sectionL=L/3;
sectionH=H/4;
%Determine size of matrix
cols = round(L/delta + 1)    % Columns
rows = round(H/delta + 1)    % Rows
sectioncols=round(sectionL/delta+1)
sectionrows=round(sectionH/delta+1)

% Build beginning zeros matrix from size above
T = zeros([rows,cols]);
%T=80*ones([rows,cols]);

for i=1:N
    % 4 nodes conduction no heat gen
    for m = sectionrows+1:rows-1
        for n = 2:cols-1
            T(m,n) = 0.25 *(T(m,n+1) + T(m,n-1) + T(m+1,n) + T(m-1,n));
        end
    end
    %upper space between the chip and walls
        %left
        for m=2:sectionrows
            for n=2:sectioncols-1
                T(m,n)=0.25 *(T(m,n+1) + T(m,n-1) + T(m+1,n) + T(m-1,n));
            end
        end

        %right
        for m=2:sectionrows
            for n=2*sectioncols:cols-1
                T(m,n)=0.25 *(T(m,n+1) + T(m,n-1) + T(m+1,n) + T(m-1,n));
            end
        end

    %------chip------
    %top 
        for n=sectioncols+1:2*sectioncols-2
            T(1,n)=(T(m,n-1)+T(m,n+1)+2*T(m+1,n)+qgen*delta^2/kc+2*h*delta/kc)/(4+2*h*delta/kc);
        end
        %top corners
        for n=sectioncols
            T(1,n)=(ks*T(1,n-1)+kc*T(1,n+1)+ksc*T(2,n)+2*qgen*delta^2/4+2*h*delta*Tamb)/(ks+kc+ksc+2*h*delta);
        end
        for n=2*sectioncols-1
            T(1,n)=(ks*T(1,n+1)+kc*T(1,n-1)+ksc*T(2,n)+2*qgen*delta^2/4+2*h*delta*Tamb)/(ks+kc+ksc+2*h*delta);
        end


    %bottom and bottom corners 
    for m=sectionrows
        for n=sectioncols+1:2*sectioncols-2
            T(m,n)=(ks*T(m+1,n)+ksc*(T(m,n+1)+T(m,n-1))+kc*T(m-1,n)+qgen*delta^2/2)/(ks+2*ksc+kc);
        end
        %bottom corners
        for n=sectioncols
            T(m,n)=(ks*T(m,n-1)+ks*T(m+1,n)+ksc*T(m,n+1)+ksc*T(m-1,n)+qgen*delta^2/4+h*delta*Tamb)/(ks+2*ksc+ks+delta*h);
        end
        for n=2*sectioncols-1
            T(m,n)=(ks*T(m,n+1)+ks*T(m+1,n)+ksc*T(m,n-1)+ksc*T(m-1,n)+qgen*delta^2/4+h*delta*Tamb)/(ks+2*ksc+ks+delta*h);
        end
    end
    if sectionrows>2
        for m=2:sectionrows-1
            for n=sectioncols+1:2*sectioncols-2
                T(m,n) = 0.25 *(T(m,n+1) + T(m,n-1) + T(m+1,n) + T(m-1,n)+qgen*delta^2) ;
            end
        end
    end
    %chip sides
   if sectionrows>2

       for m=2:sectionrows-1
        for n=2*sectioncols-1
            T(m,n)=(ks*T(m,n+1)+ksc*(T(m+1,n)+T(m-1,n))+kc*T(m,n-1)+qgen*delta^2/2)/(ks+2*ksc+kc);
        end
        for n=sectioncols
             T(m,n)=(ks*T(m,n-1)+ksc*(T(m+1,n)+T(m-1,n))+kc*T(m,n+1)+qgen*delta^2/2)/(ks+2*ksc+kc);
        end
       end
    end
    %------end of chip-----


    %top of substrate between chip and walls
        %left
        for n=2:sectioncols-1
        T(1,n)=(T(1,n-1)+T(1,n+1)+2*T(1+1,n)+2*h*delta/ks)/(4+2*h*delta/ks);
        end
        %right
        for n=2*sectioncols:cols-1
        T(1,n)=(T(1,n-1)+T(1,n+1)+2*T(1+1,n)+2*h*delta/ks)/(4+2*h*delta/ks);
        end





    %upper left corner of substrate: node 1,1
        T(1,1)=(T(1,2)+T(2,1)+Tamb*B)/(2+B);
    %upper right corner of substrate: node 1,cols
        T(1,cols)=(T(1,cols-1)+T(2,cols)+Tamb*B)/(2+B);

    %left side of substrate
    for m=2:rows-1
        T(m,1)=(T(m-1,1)+T(m+1,1)+2*T(m,2))/4;
    end
    %right side of substrate
    for m=2:rows-1
        T(m,cols)=(T(m-1,cols)+T(m+1,cols)+2*T(m,cols-1))/4;
    end

    %lower left corner: node 5,1
    T(rows,1)=(T(rows-1,1)+T(rows,2))/2;
    %lower right corner: node 5,10
    T(rows,cols)=(T(rows-1,cols)+T(rows,cols-1))/2;


    %bottom of substrate
    for n=2:cols-1
    T(rows,n)=(T(rows,n-1)+T(rows,n+1)+2*T(rows-1,n))/4;
    end
end

 T=T; %temperature distribution in Kelvin
 TC=T-273.15 %temperature distribution in degrees Celsius

物理情况的图片如下所示。

1个回答

您的问题很难回答,因为它没有为完整答案提供足够的信息,而且标签似乎表明您正在使用 Gauss-Seidel 方法来求解线性系统,但您没有提供有关您遇到的问题的详细信息有它。

您可能在使用 Gauss-Seidel 方法时遇到困难。随着网格间距的减小,线性系统的大小会增加,这意味着 Gauss-Seidel 方法在开始收敛之前可能需要更多的迭代。如果您使用的是固定数量的迭代,那么您可以尝试增加迭代次数以确保您没有遇到问题。另一种选择是通过将 Gauss-Seidel 方法的解与使用 Matlab 的反斜杠算子的解进行比较来近似误差,该解也可以求解线性系统。如果它们不同,那么您的 Gauss-Seidel 求解器可能存在问题,或者您可能在收敛之前无法运行。

您设置的问题也可能存在问题。我怀疑您正在使用可能写成的泊松方程对温度进行建模Δu=f. 这种形式的优点是,在离散化后,您会得到一个正定系统(Gauss-Seidel 方法将收敛)。如果等式的错误一侧有负号,我建议您乘以这样的形式。当你离散化它时,你应该有一个1h2因子和一个对角线上有二的矩阵(假设为 1D)和对角线上方和下方的 -1。如果您的号码有误h等式中出现的因素,那么您的解可能会增长为h减少。

也许你可以弄清楚你的困难在哪里,并得到一个更好的答案。