n=50;
A=zeros([ n n]);
for i=2:n-1
A(i,i)=-4;
A(i,i+1)=1;
A(i,i-1)=1;
end
A(1,2)=1;
A(n,n-1)=1;
A(1,1)=-4;
A(n,n)=-4;
b=-2*ones([ n 1]);
b(1)=-3;
b(n)=-3;
p=1000;
eps=10^(-6);
%function [x,n]=SOR(A,b,p,eps)
%首先获取A矩阵的上三角,下三角,对角矩阵
k=size(A,1);
D=diag(diag(A));
U=triu(A,1);
L=tril(A,-1);
% w系数取值
w=[2:0.1:3];
m=size(w,2);
n=ones([1 m]);
%初始化输入值
x0=zeros([k,m]);
for i=1:m
%首先对松弛法迭代阵B进行判断是否该迭代能收敛
B=inv(D+w(i)*L)*((1-w(i))*D-w(i)*U);
%这里采用了充要条件谱半径<1来进行判断
if(max(abs(eig(B)))>1)
error('无法收敛');
end
x(:,i)=B*x0(:,i)+w(i)*inv(D+w(i)*L)*b;
while(max(abs((x(:,i)-x0(:,i))))>eps)
x0(:,i)=x(:,i);
x(:,i)=B*x0(:,i)+w(i)*inv(D+w(i)*L)*b;
n(i)=n(i)+1;
if(n(i)>p)
error('在有限次数无法取得收敛'); %若在有限次数无法取得收敛,跳出循环
end
end
end
%对求解出来的 w和k实现作图,直观化的表现出迭代次数和w取值之间的关系
scatter(w,n);
xlabel(' w 取值');
ylabel('迭代次数');
title('w取值对迭代次数的影响');