CG+Jacobi/G-S iteration

function [x] = conjugate_gradient(A, b, x0, tol, max_iter)
    r = b - A * x0;
    p = r;
    for k = 1:max_iter
        alpha = (r' * r) / (p' * A * p);
        x = x0 + alpha * p;
        r_new = r - alpha * A * p;
        beta = (r_new' * r_new) / (r' * r);
        p = r_new + beta * p;
        if norm(r_new) < tol
            break;
        end
        x0 = x;
        r = r_new;
    end
end

% 设定矩阵A和向量b
A = ...; % 你的系数矩阵
b = ...; % 你的右侧向量

% 初始化迭代初值和容差
x0 = zeros(size(b));
tol = 1e-6;
max_iter_cg = n; % n为共轭梯度法的迭代步数
max_iter_gs = 1000; % 设置高斯塞德尔迭代的最大步数
max_iter_sor = 1000; % 设置实用高斯塞德尔迭代的最大步数

% 共轭梯度法
x_cg = conjugate_gradient(A, b, x0, tol, max_iter_cg);

% 高斯塞德尔迭代
x_gs = gauss_seidel(A, b, x_cg, tol, max_iter_gs);

% 实用高斯塞德尔迭代
x_sor = sor(A, b, x_cg, tol, max_iter_sor);

% 这里假设你已经有了高斯塞德尔迭代的实现,下面是一个简单的示例:
function x = gauss_seidel(A, b, x0, tol, max_iter)
    n = length(b);
    x = x0;
    for k = 1:max_iter
        for i = 1:n
            x(i) = (b(i) - A(i, 1:i-1) * x(1:i-1) - A(i, i+1:end) * x(i+1:end)) / A(i, i);
        end
        if norm(x - x0) < tol
            break;
        end
        x0 = x;
    end
end

% 实用高斯塞德尔迭代(Successive Over-Relaxation, SOR)
function x = sor(A, b, x0, tol, max_iter, omega)
    if nargin < 6
        omega = 1.2; % 可调整的松弛因子
    end
    n = length(b);
    x = x0;
    for k = 1:max_iter
        for i = 1:n
            x(i) = (1 - omega) * x0(i) + omega * (b(i) - A(i, 1:i-1) * x(1:i-1) - A(i, i+1:end) * x0(i+1:end)) / A(i, i);
        end
        if norm(x - x0) < tol
            break;
        end
        x0 = x;
    end
end

%定义Jacobi迭代函数
function [x, n] = jacobi(A, b, x0, eps)
%计算迭代矩阵
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
BJ = D\(L+U);
f = D\b;
%判断收敛性
a = max(abs(eig(BJ)));
if a >= 1
    disp('Jacobi迭代不收敛');
    return             %不再向下执行
else
    n = 1;
    x = BJ*x0 + f;
    while norm(x-x0,inf)>=eps   %无穷范数
        x0 = x;
        x = BJ*x0+f;
        n = n+1;
    end
end

A = [4 3 0; 3 4 -1; 0 -1 4];
b = [24; 30; -24];
x0 = [0; 0; 0];
eps = 1.0e-6;
[x, n] = jacobi(A,b,x0,eps);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值