1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| % 用SOR迭代法求解AX=b,X为初始向量,om为松弛因子,error为误差,t为迭代次数 function X = SOR(A,b,X,om,error,t) D = diag(diag(A));U = -triu(A,1); L = -tril(A,-1);jX = A\b;[n m] = size(A); iD = inv(D-om*L);B2= iD*(om*U + (1-om)*D); H = eig(B2);mH = norm(H,inf); for k = 1:t iD = inv(D-om*L);B2= iD*(om*U + (1-om)*D); f2 = om*iD*b;X1 = B2*X+f2; X = X1;djwcx = norm(X1-jX,inf);xdwcx = djwcx/(norm(X,inf)+eps); end if mH >= 1 disp('因为谱半径不小于1,SOR序列发散') disp('谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX和近似解X如下:') mH,D,U,L,jX, else disp('因为谱半径小于1,SOR序列收敛') if (djwcx<error)|(xdwcx<error) disp('谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX和近似解X如下:') mH,D,U,L,jX = jX', else disp('迭代次数已经超过上限t,谱半径mH,方程组的精确解jX和迭代向量X如下:') mH,D,U,L,X = X1';jX = jX' return end end % A = [5 1 -1 -2;2 8 1 3;1 -2 -4 -1;-1 3 2 7;] % b = [4;1;6;-3] % X = [0 0 0 0]' % X = SOR(A,b,X,1.15,0.001,100)
|