主题:高斯—塞德尔迭代
sunbear
[专家分:10] 发布于 2008-11-02 00:32:00
我们传热学有一道题要用高斯—塞德尔迭代法,由于我没有学C++,老师说可以用MATLAB实现,特此求教高手!!
最好给除通用的方法和程序!!!
再次感谢大家!
回复列表 (共3个回复)
沙发
fxlzzy [专家分:30] 发布于 2008-11-07 18:46:00
% 设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开始的,其迭代情况大概就是这样的,我的可能有点麻烦,但迭代过程和数值分析书上是一样的,我 也是初学者,希望大家相互交流
板凳
sunbear [专家分:10] 发布于 2008-11-20 23:24:00
我试了一下,确实可以,而且我换了一个我们课本上的例题算得也差不多,多谢!!
3 楼
Guassfans [专家分:4090] 发布于 2008-12-13 18:46:00
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
我来回复