实 验 报 告
实验人:
学号:
日期:
院(系):
专业(班级):
题目一:
一、实验目的
熟练运用运用所学计算机语言编写程序,实现解线性方程组的迭代法,包括
jacobi 迭代方法和 SOR 迭代法,分析迭代格式的收敛性,以及初值对迭代格式
收敛的影响。
二、实验原理
1.Jacobi 迭代法原理
设方程组 Ax=b 满足 aii ≠ 0, 将方程组变形为: x=Bx+f, 则雅可比
(Jacobi)迭代法是指
x(k+1)=Bx(k)+f
即由初始解逐步迭代即可得到方程组的解。
2.SOR 迭代法原理
为了提高精度,可以考虑运用松弛技术,将高斯-塞德尔(Gauss-Seidel)
迭代得到的值进一步加工成某种松弛值,迭代公式如下
k
)
(
j
j
i
k
1)
(
x
i
a
ii
x
i
n
(
x
i
逐次超松弛迭代法是显然 Gauss-Seidel 方法的一种加速方法,当 1 时,
a x
ij
a x
ij
(
b
i
k
1)
x
i
k
)
)
(
j
n
j
i
SOR 方法就是 Gauss-Seidel 迭代方法。
三、实验结果
Jacobi 迭代法求解
SOR 迭代法求解,W 等于 1,1.25, 1.5 时的计算结果
四、结果分析
用雅克比迭代法进行线性方程系数矩阵为希尔伯特矩阵的求解,解是发散
的,最终趋于无穷大。
用 SOR 迭代法进行线性方程系数矩阵为希尔伯特矩阵的求解,解是收敛的,
且收敛速度与矩阵的大小有关,但不是单调性的正相关或者负相关关系。
五、实验代码
主文件:Demo_Jacobi_SOR
clear all
clc
n=10;
for i=1:length(n)
H{i}=hilb(n(i));
size_H{i}=size(H{i},1);
x_true{i}=ones(1,size_H{i});
b{i}=x_true{i}*H{i};
x_ini{i}=zeros(1,size_H{i});
fprintf('The dimension is %d\n',n(i))
[x{i},k{i}]=Jacobi(H{i},b{i},x_ini{i},accuracy,x_tr
%accuracy=5*(10^-6);
accuracy=0.01;
end
%Jacobi
disp('Jacobi');
for i=1:length(n)
ue{i});
end
%SOR
disp('SOR');
w=1;
disp('SOR w=1');
for i=1:length(n)
w=1.25;
disp('SOR w=1.25');
for i=1:length(n)
end
end
fprintf('The dimension is %d\n',n(i))
[q{i},e{i}]=SOR(H{i},b{i},x_ini{i},accuracy,x_true{
i},w);
fprintf('The dimension is %d\n',n(i))
[z{i},x{i}]=SOR(H{i},b{i},x_ini{i},accuracy,x_true{
i},w);
w=1.5;
disp('SOR w=1.5');
for i=1:length(n)
fprintf('The dimension is %d\n',n(i))
[v{i},b{i}]=SOR(H{i},b{i},x_ini{i},accuracy,x_true{
i},w);
end
%[x,k]=Jacobi(A,b,x_ini,accuracy,x_true);
函数文件:Jacobi
function [x,k]=Jacobi(A,b,x_ini,accuracy,x_true)
n=size(A,1);
uint16 k;
k=1;
x{1}=x_ini;
while(norm(x_true-x{k},Inf)>=accuracy)
k=k+1;
%disp(k-1);
for i=1:1:n
temp1=0;
for j=1:1:i-1
end
temp2=0;
for j=i+1:1:n
end
if (k==200000)
break;
end
temp1=temp1+A(i,j)*x{k-1}(j);
temp2=temp2+A(i,j)*x{k-1}(j);
end
x{k}(i)=(b(i)-temp1-temp2)/A(i,i);
end
fprintf('The iteration k=%d\n',k-1);
disp('The solution is');
disp(x{k});
end
函数文件:SOR
function [x,k]=SOR(A,b,x_ini,accuracy,x_true,w)
n=size(A,1);
uint16 k;
k=1;
x{1}=x_ini;
while(norm(x_true-x{k},Inf)>accuracy)
k=k+1;
%disp(k-1);
for i=1:1:n
temp1=0;
if(i>1)
end
end
temp2=0;
for j=1:1:i-1
temp1=temp1+A(i,j)*x{k}(j);
for j=i:1:n
temp2=temp2+A(i,j)*x{k-1}(j);
end
x{k}(i)=x{k-1}(i)+w*(b(i)-temp1-temp2)/A(i,i);
end
if (k==200000)
break;
end
end
fprintf('The iteration k=%d\n',k-1);
disp('The solution is');
disp(x{k});
end
题目二:
一、实验目的
熟悉 MATLAB 的用法,并了解共轭梯度算法的原理和使用方法。
二、实验原理
共轭梯度算法的基本思想是把共轭性与最速下降方法相结合,利用已知点处
的梯度构造一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点。其
收敛速度快,避免了牛顿法需要存储和计算哈希矩阵求逆的缺点,具有二次终止
性。
三、实验内容
1、系数矩阵 A 的乘法 Amulti(m)
A 是大型稀疏矩阵,如果用传统的方法存储,将会造成空间的极大浪费;而且在
矩阵与矩阵的乘法中效率也不高。在整个求解过程中,A 始终以与列向量相乘的
形式出现,我们考虑可以将 A 与列向量的乘法写成一个函数,而不再单独存储 A。
而且这个矩阵本身具有的周期性,使函数的实现更为简便。 输入一个列向量 m,
输出 n=A*m 的结果。
2、
function [n] = Amulti(m)
h=1/20;
for i=1:19*19
%A(i,i)=1+h*h/4?
n(i)=m(i)*(1+h*h/4);
if(mod(i,19)~=1)
n(i)=n(i)+m(i-1)*(-1/4); end
if(mod(i,19)~=0)
n(i)=n(i)+m(i+1)*(-1/4); end
if(i>19)
if(i<19*18+1)
n(i)=n(i)+m(i-19)*(-1/4); end
n(i)=n(i)+m(i+19)*(-1/4); end
%A(i,i-1)=-1/4?
%A(i,i+1)=-1/4?
%A(i,i-19)=-1/4
%A(i,i+19)=-1/4
end
end
2、主程序 Dirichlet.m
需要解方程 Ax=b。A 由函数 Amulti()代替,b 则由一个二重循环产生。将 x 的初值赋为
b,开始迭代,迭代一共进行 19*19 次。最终得到解 x 和误差 r。为了将解以更直观的形式
表现出来,程序还将一维矩阵 x 转化为二维矩阵,并加入边界值,最后输出一个三维的图像。
%首先生成 b;
for i=1:19
for j=1:19
b((i-1)*19+j)=sin(i/20*j/20)*1/1600
if(i==1)
b((i-1)*19+j)= b((i-1)*19+j)+j*j/1600; end
if(i==19)
if(j==1)
b((i-1)*19+j)= b((i-1)*19+j)+j*j/1600+1/4; end
b((i-1)*19+j)= b((i-1)*19+j)+i*i/1600; end
if(j==19)
b((i-1)*19+j)= b((i-1)*19+j)+i*i/1600+1/4; end
end
end
%调整初始条件
x=b;
r=b-Amulti(x);
k=0; % k 是计步器,记录迭代进行的次数
%开始迭代,共进行 19*19 次
while(k~=19*19)
k=k+1;
if(k==1)
p=r;
else
end
q=r*r'/(r0*r0');
p=r+p0*q';
a=r*r'/(Amulti(p)*p');
x=x+p*a';
r0=r;
r=r-Amulti(p)*a';
p0=p;
end
%将一维的解 x 转化成二维的 X,并加入边界条件
for i=0:20
for j=0:20
if(i==0) X(i+1,j+1)=j*j/400; else
if(i==20) X(i+1,j+1)=j*j/400+1; else
if(j==0) X(i+1,j+1)=i*i/400; else
if(j==20) X(i+1,j+1)=i*i/400+1; else
X(i+1,j+1)=x((i-1)*19+j);
end
end
end
end
end
end
%输出三维图像
surf(0:1/20:1,0:1/20:1,X);
四、实验结果