logo资料库

数值计算实验报告一.docx

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
实 验 报 告 实验人: 学号: 日期: 院(系): 专业(班级): 题目一: 一、实验目的 熟练运用运用所学计算机语言编写程序,实现解线性方程组的迭代法,包括 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); 四、实验结果
分享到:
收藏