回 帖 发 新 帖 刷新版面

主题:高斯—塞德尔迭代

我们传热学有一道题要用高斯—塞德尔迭代法,由于我没有学C++,老师说可以用MATLAB实现,特此求教高手!!
最好给除通用的方法和程序!!!
再次感谢大家!

回复列表 (共3个回复)

沙发


 % 设A*X=B
>> A=[10,-2,-2;-2,10,-1;-1,-2,3];
>> B=[1;0.5;1];
>> %把A分解为D,L,U
>> c=diag(A,0);%提取A的对角元素
>>D=diag(c,0);%创造出只有对角元素,其他元素全为0的三位矩阵
>> L=tril(A-D);%取出A的下三角阵并把对角元素变成0
>> U=triu(A-D);%取出A的上三角阵并把对角元素变成0

>> x=[0;0;0]; %设X初始值为0
>> y=-(D+L)\U*x+(D+L)\B; %y为下一个X
>> i=1;%迭代次数
>> while abs(y-x)>1e-5 %设定迭代条件到(y-x)<=1e-5时停止
x=y;
i=1+i;
y=-(D+L)\U*x+(D+L)\B
end

y =

   0.196666666666667
   0.130666666666667
   0.486000000000000


y =

   0.223333333333333
   0.143266666666667
   0.503288888888889


y =

   0.229311111111111
   0.146191111111111
   0.507231111111111


y =

   0.230684444444444
   0.146860000000000
   0.508134814814815


y =

   0.230998962962963
   0.147013274074074
   0.508341837037037


y =

   0.231071022222222
   0.147048388148148
   0.508389266172840


y =

   0.231087530864198
   0.147056432790123
   0.508400132148148

>> i

i =

     8
程序中D,L,U是什么样的矩阵你应该清楚吧。迭代次数是8次,第一次没有放在循环语句中,所以i是从1开始的,其迭代情况大概就是这样的,我的可能有点麻烦,但迭代过程和数值分析书上是一样的,我 也是初学者,希望大家相互交流

板凳


我试了一下,确实可以,而且我换了一个我们课本上的例题算得也差不多,多谢!!

3 楼

function [x,error,iter]=gauss_seidel(A,b,x0,max_it,tol)
%函数功能说明:  Gauss_Seidel迭代法求解线性方程组 Ax=b
%输入参数说明:
%  A --- 系数矩阵;x0---- 初始向量;b ---右端向量;iter---最大迭代次数;tol---给定精度要求;
%输出参数说明:
%  X --- 解向量; erroer --- 每次迭代的残量范数的记录;iter— 达到精度要求的实际执行的迭代次数;
%迭代格式:   x(k+1)=Gx(k)+f;  其中:A=D-L-U;  f=(D-L)^(-1)b;  G=(D-L)^(-1)U; 

if nargin==3
    tol = 1.0e-6;
    max_it  = 200;
elseif nargin<3
    error
    return
end 
D=diag(diag(A));    %求A的对角矩阵
L=-tril(A,-1);      %求A的下三角阵
U=-triu(A,1);       %求A的上三角阵
G=(D-L)\U;
f=(D-L)\b;
x=G*x0+f;
iter=1;                  %迭代次数
error(iter)=norm(x-x0,inf);
while abs(error(iter)-tol)>1e-4
    x0=x;
    x=G*x0+f;
    iter=iter+1;
    if(iter>max_it)
        disp('Warning: 达到最大迭代次数,此迭代法对于此方程组可能不收敛!');
        return;
    end
    error(iter)=norm(x-x0,inf);
end

我来回复

您尚未登录,请登录后再回复。点此登录或注册