2023 | 您所在的位置:网站首页 › 非线性计算不收敛 › 2023 |
2023-06-30《计算方法》- 陈丽娟 - 线性方程组的迭代解法Matlab计算方法JacobiGauss-SeidelSORSSOR定常迭代法 所谓迭代法实际上是求解一个关于映射 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 定理1
序列 ![]() 对于非奇异线性方程组 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在雅可比迭代中,如果 ![]() ![]() ![]() 矩阵分裂
设 ![]() ![]() ![]() 对于 ![]() ![]() ![]() 由上可知雅可比迭代就是取 为了加速迭代的收敛,SOR方法将G-S迭代中 ![]() ![]() 同样可以得到对应的 ![]() ![]() 其中 ![]() ![]() ![]() 注意到一开始SOR方法实际上是一个MANN迭代( 将 SOR 方法中的 ![]() ![]() 注
对于某些特殊问题, SOR 方法不收敛, 但仍然可能构造出收敛的 SSOR 方法.
一般来说, SOR 方法的渐进收敛速度对参数 从不动点理论的角度来看,上述所有的迭代格式都可以看作是 下面根据华东师范大学潘建瑜老师《矩阵计算讲义》列出矩阵下的收敛性分析,我们可以看到虽然描述的方式不一样,但是和不动点理论的结果却是相似的。 矩阵序列的收敛 设 ![]() ![]() ![]() ![]() ![]() ![]() 定理
设矩阵 定理
设 ![]() 收敛速度
设点列 ![]() ![]() ![]() ![]() ![]() 收敛性定理
对任意迭代初始向量 定义
设 ![]() ![]() 定理
考虑矩阵分裂迭代法,如果存在某个算子范数 ![]() ![]() ![]() 下面给出的算法包含求逆运算,用行迭代是否可以加速计算有待深入。 Jacobi迭代法 function [x0, xlog] = JacobiLE(x0, A, b, epsilon, maxit) if(nargin < 5) maxit = 1e3; end iter = 1; xlog = zeros(maxit,1); errors = norm(A*x0 - b); D = diag(diag(A)); LU = D - A; D = inv(D); G = D * LU; F = D * b; while iter = epsilon %x1 = G * x0 + F; x1 = x0 + D * (b - A*x0); errors = norm(A * x1 - b); xlog(iter) = errors; x0 = x1; iter = iter + 1; end xlog = xlog(1:(iter-1)); endG-S迭代法 function [x0, xlog] = GSLE(x0, A, b, epsilon, maxit) if(nargin < 5) maxit = 1e3; end iter = 1; xlog = zeros(maxit,1); errors = norm(A*x0 - b); D = diag(diag(A)); L = D - tril(A); U = D - triu(A); DL = inv(D-L); G = DL * U; F = DL * b; while iter = epsilon x1 = G * x0 + F; %x1 = x0 + D * (b - A*x0); errors = norm(A * x1 - b); xlog(iter) = errors; x0 = x1; iter = iter + 1; end xlog = xlog(1:(iter-1)); endSOR迭代法 function [x0, xlog] = SOR(x0, A, b, omega, epsilon, maxit) if(nargin < 6) maxit = 1e3; end iter = 1; xlog = zeros(maxit,1); errors = norm(A*x0 - b); D = diag(diag(A)); L = D - tril(A); U = D - triu(A); DL = inv(D-omega *L); G = DL * ((1-omega)*D+omega*U); F = omega * DL * b; while iter = epsilon x1 = G * x0 + F; %x1 = x0 + D * (b - A*x0); errors = norm(A * x1 - b); xlog(iter) = errors; x0 = x1; iter = iter + 1; end xlog = xlog(1:(iter-1)); endSSOR迭代法 function [x0, xlog] = SSOR(x0, A, b, omega, epsilon, maxit) if(nargin < 6) maxit = 1e3; end iter = 1; xlog = zeros(maxit,1); errors = norm(A*x0 - b); D = diag(diag(A)); L = D - tril(A); U = D - triu(A); DL = inv(D-omega*L); DU = inv(D-omega*U); GL = DL * ((1-omega)*D+omega*U); GU = DU * ((1-omega)*D+omega*L); FL = omega * DL * b; FU = omega * DU * b; while iter = epsilon x1 = GL * x0 + FL; x1 = GU * x1 + FU; %x1 = x0 + D * (b - A*x0); errors = norm(A * x1 - b); xlog(iter) = errors; x0 = x1; iter = iter + 1; end xlog = xlog(1:(iter-1)); end下面给出例子 clear n = 1000; x0 = rand(n,1); A = rand(n,n)*10; A = A + diag(sum(A,2)); max(abs(eig(A))); %谱半径 b = rand(n,1); epsilon = 1e-6; maxit = 1e3; [JacpbiX, JacobiXlog] = JacobiLE(x0, A, b, epsilon, maxit); plot(log10(JacobiXlog)) xlim([0 100]) hold on [GSS, GSSlog] = GSLE(x0, A, b, epsilon, maxit); plot(log10(GSSlog)) hold on omega = 1.5; [SORX, SORXlog] = SOR(x0, A, b, omega, epsilon, maxit); plot(log10(SORXlog)) hold on omega = 1.5; [SSORX, SSORXlog] = SSOR(x0, A, b, omega, epsilon, maxit); plot(log10(SSORXlog)) legend(["Jacobi" "G-S" "SOR" "SSOR"])结果如下所示
随机产生的矩阵很有可能在迭代过程中 定义
设 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 定义
设 ![]() ![]() ![]() ![]() ![]() 定理
设 |
CopyRight 2018-2019 实验室设备网 版权所有 |