% 逐次超松驰迭代法(successive over relaxation method)迭代法 % function [x,t,it,w] = SORFunc(A,b,I,eps,w) % A: 系数矩阵 b: 载荷矩阵 I: 最大迭代次数 % w: 松弛因子(w=1 时即为 Gauss-Seidel 迭代法) % x: 解矩阵% t: 时间 % it: 迭代次数% w: 松弛因子% 迭代初值默认为 0 A1 = [8 -3 2; 4 11 -1; 6 3 12]; b1 = [20; 33; 36]; w=1.2;%松弛因子 it_max = 1000;eps=1e-6; [x6,t6,k6_cnt,w] = SORFunc(A1,b1,it_max,eps,w); disp('迭代次数:k6_cnt='); disp(k6_cnt) disp(['方程组的解:x6 = ']); disp(x6) %% function [x,n,flag]=SOR(A,b,eps,W,it_max) %sor函数为用松弛迭代法求解线性方程组 %A为线性方程组的系数矩阵%b为线性方程组的常数向量 %eps为精度要求 %W为超弛因子 %max1为最大迭代次数 %x为线性方程组的解%n为迭代次数 %flag为指标变量,flag='OK!'表示迭代收敛达到指标要求%flag='fail!'表示迭代失败 A2 = [8 -3 2; 4 11 -1; 6 3 12]; b2 = [20; 33; 36]; W=1.2;%松弛因子 it_max = 1000;eps=1e-6;%最大迭代次数 [x7,k7_cnt,flag]=SOR(A2,b2,eps,W,it_max); disp('迭代次数:k7_cnt='); disp(k7_cnt) disp(['方程组的解:x7 = ']); disp(x7) %% function [x, k] = SORFunmethod(A, b, x0, MaxIters, err, w) % 输入:A:系数矩阵 b:常数矩阵; x0:初始解; % MaxIters:最大迭代次数; % err:精度阈值; w:松弛因子; 输出: x:近似解; k:迭代次数; x0 = [0;0;0]; %调用SOR超松弛迭代法求解 A3 = [8 -3 2; 4 11 -1; 6 3 12]; b3 = [20; 33; 36]; it_max = 1000; eps=1e-6; %w松弛因子 w>1 超松弛迭代法 w=1 高斯-赛德尔迭代 w<1 低松弛迭代法 w0 = 0.6; % w1 超松弛迭代法 w2 = 1.9; % w>1 超松弛迭代法 [x8_0, k8_cnt0] = SORFunmethod(A3, b3, x0, it_max, eps, w0); [x8_1, k8_cnt1] = SORFunmethod(A3, b3, x0, it_max, eps, w1); [x8_2, k8_cnt2] = SORFunmethod(A3, b3, x0, it_max, eps, w2); disp('迭代次数:k8_cnt0='); disp(k8_cnt0) disp(['方程组的解:x8_0 = ']); disp(x8_0) disp('迭代次数:k8_cnt1='); disp(k8_cnt1) disp(['方程组的解:x8_1 = ']); disp(x8_1) disp('迭代次数:k8_cnt2='); disp(k8_cnt2) disp(['方程组的解:x8_2 = ']); disp(x8_2)
function [x,n,flag]=SOR(A,b,eps,W,it_max) %sor函数为用松弛迭代法求解线性方程组 %A为线性方程组的系数矩阵%b为线性方程组的常数向量 %eps为精度要求 %W为超弛因子 %max1为最大迭代次数 %x为线性方程组的解%n为迭代次数 %flag为指标变量,flag='OK!'表示迭代收敛达到指标要求%flag='fail!'表示迭代失败 if nargin<5 it_max=10000; end if nargin<4 W=1; end if nargin<3 eps=1e-11; end k=length(A); n=0; x=zeros(k,1); y=zeros(k,1); flag='OK!'; while (1) y=x; for i=1:k z=b(i); for j=1:k if j~=i z=z-A(i,j)*x(j); end end if abs(A(i,i))<1e-10 | n==it_max flag='fail!'; return; end z=z/A(i,i); x(i)=(1-W)*x(i)+W*z; end if norm(y-x,inf)<eps break; end n=n+1; end end
function [x,t,it,w] = SORFunc(A,b,I,eps,w) % 逐次超松驰迭代法(successive over relaxation method)迭代法 % A: 系数矩阵 b: 载荷矩阵 I: 最大迭代次数 % w: 松弛因子(w=1 时即为 Gauss-Seidel 迭代法) % x: 解矩阵% t: 时间 % it: 迭代次数% w: 松弛因子% 迭代初值默认为 0 tic%开始时间 [n,~] = size(A); x = zeros(n,1); D = diag(diag(A)); %求 A 的对角矩阵 L = -tril(A,-1); %求 A 的下三角矩阵,不带对角线 U = -triu(A,1); %求 A 的上三角矩阵 w_opt = 2/(1+sqrt(1-(vrho(D\(L+U)))^2)); % 最佳松弛因子 if nargin < 4 eps = 1e-6; w = w_opt; end if nargin < 5 w = w_opt; end Lw = (D-w*L)\((1-w)*D+w*U); f = w*((D-w*L)\b); x_exact = A\b; it = 1; for k = 1:I-1 x = Lw*x+f; if norm(x-x_exact)>eps it = it+1; end end t = toc;%结束时间 end
function [x, k] = SORFunmethod(A, b, x0, MaxIters, err, w) % 函数功能:对超松弛迭代法求解线性方程组; % function [x, k] = SORFunmethod(A, b, x0, MaxIters, err, w) % 输入:A:系数矩阵 b:常数矩阵; x0:初始解; % MaxIters:最大迭代次数; % err:精度阈值; w:松弛因子; 输出: x:近似解; k:迭代次数; n = length(x0); x1 = x0; x2 = zeros(n, 1); x3 = zeros(n, 1); r = max(abs(b - A*x1)); k = 0; while r > err for i = 1:n sum = 0; for j = 1:n if j > i sum = sum + A(i, j) * x1(j); elseif j < i sum = sum + A(i, j) * x2(j); end end x2(i) = (1 - w)*x1(i) + w*(b(i) - sum) / (A(i, i) + eps); end for i = n:-1:1 sum = 0; for j = 1:n if j > i sum = sum + A(i, j) * x3(j); elseif j < i 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 > MaxIters x = []; return; end end x = x1; %最终输出结果 end
Copyright © 2023 leiyu.cn. All Rights Reserved. 磊宇云计算 版权所有 许可证编号:B1-20233142/B2-20230630 山东磊宇云计算有限公司 鲁ICP备2020045424号
磊宇云计算致力于以最 “绿色节能” 的方式,让每一位上云的客户成为全球绿色节能和降低碳排放的贡献者