Matlab
% ----------------------------------------------------------------------------------------------- % % ----------------------------------------------------------------------------------------------- % 习题3 A是一个五对角矩阵,R nxn,n=10,20,40时,使用J迭代法和SOR % 迭代法(w=1,1.2,1.4,1.6,1.8)解方程组Ax=0,分析收敛速度。 % ------------------------------------------------------------------------------------------------ clear for mat_n=[10,20,40] %循环3次,n=10,20,40 % -------------------------------------------------------------------------------------------- % 打印当前矩阵大小 % -------------------------------------------------------------------------------------------- disp("---------------------------------------------------------"); fprintf(" 当前矩阵大小为 %d*%d\r\n",mat_n,mat_n); % -------------------------------------------------------------------------------------------- % 构建矩阵A % -------------------------------------------------------------------------------------------- a1(1,1:mat_n)=20; A1=diag(a1,0); a2(1,1:mat_n-1)=-8; A2_1=diag(a2,1); A2_2=diag(a2,-1); a3(1,1:mat_n-2)=1; A3_1=diag(a3,2); A3_2=diag(a3,-2); A=A1+A2_1+A2_2+A3_1+A3_2; % -------------------------------------------------------------------------------------------- % 构建初始迭代值 % -------------------------------------------------------------------------------------------- x0(1:mat_n,1)=1; % -------------------------------------------------------------------------------------------- % jacobi迭代法 %Ax=0精确解是x=0 % -------------------------------------------------------------------------------------------- D = diag(diag(A)); %求A的对角矩阵 L = -tril(A,-1); %求A的下三角矩阵 U = -triu(A,1); %求A的上三角矩阵 B = D\(L+U); %由jacobi迭代法公式得来 RB1=-log(vrho(B)); %计算渐近收敛速度 fprintf(" jacobi 渐近收敛速度是 %.4f\r\n",RB1); x = B*x0; %迭代计算 n = 1; %迭代次数赋值 while norm(x,inf)>10^(-6) x0=x; %迭代赋值 x = B*x0; %迭代计算 n = n+1; %累加次数 if n>1000 %迭代次数大于1000跳出 break; end end fprintf(" jacobi迭代完毕 满足要求所需最少迭代次数为 n=%d\r\n",n); % -------------------------------------------------------------------------------------------- % SOR迭代 w是omega %Ax=0精确解是x=0 % -------------------------------------------------------------------------------------------- for w=[1,1.2,1.4,1.6,1.8] x0(1:mat_n,1)=1; %构建初始迭代值 B_sor=(D-L*w)\((1-w)*D+w*U); %与jacobi一样的DLU矩阵 x_sor = B_sor*x0; %迭代计算 RB1=-log(vrho(B_sor)); %计算渐近收敛速度 fprintf("SOR渐近收敛速度是 %.4f\r\n",RB1); n_sor = 1; %迭代次数 while norm(x_sor,inf)>10^(-6) x0=x_sor; %迭代赋值 x_sor = B_sor*x0; %迭代计算 n_sor = n_sor+1; %累加次数 if n_sor>1000 %迭代次数大于1000跳出 break; end end fprintf("SOR迭代 w=%.2f",w); fprintf(" 满足要求所需最少迭代次数为 n_sor=%d\r\n",n_sor); end clear end
结果
>> Untitled --------------------------------------------------------- 当前矩阵大小为 10*10 jacobi 渐近收敛速度是 0.1587 jacobi迭代完毕 满足要求所需最少迭代次数为 n=38 SOR渐近收敛速度是 0.8050 SOR迭代 w=1.00 满足要求所需最少迭代次数为 n_sor=21 SOR渐近收敛速度是 1.3127 SOR迭代 w=1.20 满足要求所需最少迭代次数为 n_sor=15 SOR渐近收敛速度是 0.8036 SOR迭代 w=1.40 满足要求所需最少迭代次数为 n_sor=20 SOR渐近收敛速度是 0.4555 SOR迭代 w=1.60 满足要求所需最少迭代次数为 n_sor=30 SOR渐近收敛速度是 0.2001 SOR迭代 w=1.80 满足要求所需最少迭代次数为 n_sor=61 --------------------------------------------------------- 当前矩阵大小为 20*20 jacobi 渐近收敛速度是 0.1201 jacobi迭代完毕 满足要求所需最少迭代次数为 n=60 SOR渐近收敛速度是 0.7713 SOR迭代 w=1.00 满足要求所需最少迭代次数为 n_sor=23 SOR渐近收敛速度是 1.2660 SOR迭代 w=1.20 满足要求所需最少迭代次数为 n_sor=18 SOR渐近收敛速度是 0.7874 SOR迭代 w=1.40 满足要求所需最少迭代次数为 n_sor=24 SOR渐近收敛速度是 0.4478 SOR迭代 w=1.60 满足要求所需最少迭代次数为 n_sor=35 SOR渐近收敛速度是 0.1969 SOR迭代 w=1.80 满足要求所需最少迭代次数为 n_sor=67 --------------------------------------------------------- 当前矩阵大小为 40*40 jacobi 渐近收敛速度是 0.1092 jacobi迭代完毕 满足要求所需最少迭代次数为 n=70 SOR渐近收敛速度是 0.7629 SOR迭代 w=1.00 满足要求所需最少迭代次数为 n_sor=23 SOR渐近收敛速度是 1.2517 SOR迭代 w=1.20 满足要求所需最少迭代次数为 n_sor=18 SOR渐近收敛速度是 0.7825 SOR迭代 w=1.40 满足要求所需最少迭代次数为 n_sor=27 SOR渐近收敛速度是 0.4454 SOR迭代 w=1.60 满足要求所需最少迭代次数为 n_sor=45 SOR渐近收敛速度是 0.1959 SOR迭代 w=1.80 满足要求所需最少迭代次数为 n_sor=76
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!