end
r=max(abs(x2-x1)); x1=x2; k=K+1; if k>N
disp(‘迭代失败,返回’); return; end end x=x1;
算例13:用Jacobi迭代法求解方程组:
??4x1?x2?x3?x4?1?x?4x?x?x?1?1234 ?
?x1?x2?4x3?x4?1??x1?x2?x3?4x4?1其精确解为x=[-1,-1,-1,-1]’.
解:令A=[-4,1,1,1;1,-4,1,1;1,1,-4,1;1,1,1,-4]; b=[1,1,1,1]’; x0=[0,0,0,0]’; 在命令窗口中输入:
[x,k]=Jacobimethod(A,b,x0,100,10^-5)
5.2 Gauss-Seidel迭代
用Gauss-Seidel迭代法求解线性方程组. MATLAB文件:(文件名:Gaussmethod.m) function [x,k]=Gaussmethod(A,b,x0,N,emg)
%A是线性方程组的左端矩阵 %b是右端向量 %x0是迭代初始值
%N表示迭代次数上限,若迭代次数大于N,则迭代失败 %emg表示控制精度
%用Gauss-Seidel迭代法求线性方程组A*x=b的解 %k表示迭代次数
%x表示用迭代法求得的线性方程组的近似解 n=length(A);
x1=zeros(n,1); x2=zeros(n,1); x1=x0;
r=max(abs(b-A*x1)); k=0;
while r>emg for i=1:n sum=0; for j=1:n
17
if j>i
sum=sum+A(i,j)*x1(j); elseif j
sum=sum+A(i,j)*x2(j); end end
x2(i)=(b(i)-sum)/A(i,i); end
r=max(abs(x2-x1)); x1=x2; k=K+1; if k>N
disp(‘迭代失败,返回’); return; end end x=x1;
算例14:用Gauss-Seidel迭代法求解方程组:
??4x1?x2?x3?x4?1?x?4x?x?x?1?1234 ?
?x1?x2?4x3?x4?1??x1?x2?x3?4x4?1其精确解为x=[-1,-1,-1,-1]’.
解:令A=[-4,1,1,1;1,-4,1,1;1,1,-4,1;1,1,1,-4]; b=[1,1,1,1]’; x0=[0,0,0,0]’; 在命令窗口中输入:
[x,k]=Gaussmethod(A,b,x0,100,10^-5)
5.3 超松弛迭代
用超松弛(SOR)迭代法求解线性方程组. MATLAB文件:(文件名:SORmethod.m) function [x,k]=SORmethod(A,b,x0,N,emg,w) %A是线性方程组的左端矩阵 %b是右端向量 %x0是迭代初始值
%N表示迭代次数上限,若迭代次数大于N,则迭代失败 %emg表示控制精度 %w表示松弛因子
%用SOR迭代法求线性方程组A*x=b的解 %k表示迭代次数
%x表示用迭代法求得的线性方程组的近似解 n=length(A);
18
x1=zeros(n,1); x2=zeros(n,1); x1=x0;
r=max(abs(b-A*x1)); k=0;
while r>emg for i=1:n sum=0; for j=1:n
if j>=i
sum=sum+A(i,j)*x1(j); elseif j
sum=sum+A(i,j)*x2(j); end end
x2(i)=x1(i)+w*(b(i)-sum)/A(i,i); end
r=max(abs(x2-x1)); x1=x2; k=K+1; if k>N
disp(‘迭代失败,返回’); return; end end x=x1;
算例15:用超松弛(SOR)迭代法求解方程组:
??4x1?x2?x3?x4?1?x?4x?x?x?1?1234 ?
?x1?x2?4x3?x4?1??x1?x2?x3?4x4?1其精确解为x=[-1,-1,-1,-1]’.
解:令A=[-4,1,1,1;1,-4,1,1;1,1,-4,1;1,1,1,-4]; b=[1,1,1,1]’; x0=[0,0,0,0]’; 在命令窗口中输入:
[x,k]=SORmethod(A,b,x0,100,10^-5,1)
当松弛因子为1时,超松弛迭代法等同于Gauss-Seidel迭代法.
5.4 对称超松弛迭代
用对称超松弛(SSOR)迭代法求解线性方程组. MATLAB文件:(文件名:SSORmethod.m) function [x,k]=SSORmethod(A,b,x0,N,emg,w) %A是线性方程组的左端矩阵
19
%b是右端向量 %x0是迭代初始值
%N表示迭代次数上限,若迭代次数大于N,则迭代失败 %emg表示控制精度 %w表示松弛因子
%用SSOR迭代法求线性方程组A*x=b的解 %k表示迭代次数
%x表示用迭代法求得的线性方程组的近似解 n=length(A);
x1=zeros(n,1); x2=zeros(n,1); x3=zeros(n,1); x1=x0;
r=max(abs(b-A*x1)); k=0;
while r>emg for i=1:n sum=0; for j=1:n if j>i
sum=sum+A(i,j)*x1(j); elseif j
sum=sum+A(i,j)*x2(j); end end
x2(i)=(1-w)*x1(i)+w*(b(i)-sum)/A(i,i); end
for i=n:-1:1 sum=0; for j=1:n if j>i
sum=sum+A(i,j)*x3(j); elseif j
sum=sum+A(i,j)*x2(j); end end
x3(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>N
disp(‘迭代失败,返回’); return; end end
20
相关推荐: