function[x,t,it,w]=SORFunc(A,b,I,eps,w)% 逐次超松驰迭代法(successive over relaxation method)迭代法% A: 系数矩阵 b: 载荷矩阵 I: 最大迭代次数% w: 松弛因子(w=1 时即为 Gauss-Seidel 迭代法)% x: 解矩阵% t: 时间% it: 迭代次数% w: 松弛因子% 迭代初值默认为 0
tic%开始时间[n,~]=size(A);
x =zeros(n,1);
D =diag(diag(A));%求 A 的对角矩阵
L =-tril(A,-1);%求 A 的下三角矩阵,不带对角线
U =-triu(A,1);%求 A 的上三角矩阵
w_opt =2/(1+sqrt(1-(vrho(D\(L+U)))^2));% 最佳松弛因子if nargin <4
eps =1e-6;
w = w_opt;endif nargin <5
w = w_opt;end
Lw =(D-w*L)\((1-w)*D+w*U);
f = w*((D-w*L)\b);
x_exact = A\b;
it =1;for k =1:I-1
x = Lw*x+f;ifnorm(x-x_exact)>eps
it = it+1;endend
t = toc;%结束时间end
function[x, k]=SORFunmethod(A, b, x0, MaxIters, err, w)% 函数功能:对超松弛迭代法求解线性方程组;% function [x, k] = SORFunmethod(A, b, x0, MaxIters, err, w)% 输入:A:系数矩阵 b:常数矩阵; x0:初始解;% MaxIters:最大迭代次数;% err:精度阈值; w:松弛因子; 输出: x:近似解; k:迭代次数;
n =length(x0);
x1 = x0;
x2 =zeros(n,1);
x3 =zeros(n,1);
r =max(abs(b - A*x1));
k =0;while r > err
fori=1:n
sum =0;forj=1:n
ifj>i
sum = sum +A(i,j)*x1(j);elseifj<i
sum = sum +A(i,j)*x2(j);endendx2(i)=(1- w)*x1(i)+ w*(b(i)- sum)/(A(i,i)+ eps);endfori= n:-1:1
sum =0;forj=1:n
ifj>i
sum = sum +A(i,j)*x3(j);elseifj<i
sum = sum +A(i,j)*x2(j);endendx3(i)=(1- w)*x2(i)+ w *(b(i)- sum)/A(i,i);end
r =max(abs(x3 - x1));
x1 = x3;
k = k +1;if k > MaxIters
x =[];return;endend
x = x1;%最终输出结果end