Jacobi迭代法 链接到标题

def jacobi(A, b, x0, max_iter=10):
    n = len(b)
    x = x0.copy()
    x_new = np.zeros_like(x0)
    history = [x0.copy()]
    for _ in range(max_iter):
        for i in range(n):
            s = np.dot(A[i, :], x) - A[i, i] * x[i]
            x_new[i] = (b[i] - s) / A[i, i]
        x = x_new.copy()
        history.append(x.copy())
    return x, np.array(history)
function x = jacobi(A, b, k)
    % A: 系数矩阵
    % b: 常数项列向量
    % k: 最大迭代次数
    n = length(b);
    x = zeros(n, 1);
    x_new = zeros(n, 1);
    
    for iter = 1:k
        for i = 1:n
            sum = b(i);
            for j = 1:n
                if i ~= j
                    sum = sum - A(i,j) * x(j);
                end
            end
            x_new(i) = sum / A(i,i);
        end
        x = x_new;
    end
end

Gauss-Seidel迭代法 链接到标题

def gauss_seidel(A,b,x0,max_iter=10):
    n=len(b)#获取方程组的阶数
    x=x0.copy()#复制初始值
    x_new=np.zeros_like(x0)#初始化新的解
    history=[x0.copy()]#记录迭代过程
    for _ in range(max_iter):#这个带_的循环的意思是循环max_iter次,与不带_的循环不同,不需要用到循环变量
        for i in range(n):
            s=np.dot(A[i,:],x)-A[i,i]*x[i] #计算除了第i个元素之外的所有元素的乘积。
            x[i]=(b[i]-s)/A[i,i]#计算新的解
            #上面的两行代码其实是书本上端1公式2.5
        history.append(x.copy())#记录迭代过程
    return x,np.array(history)#返回最终解和迭代过程

SOR迭代法 链接到标题


def sor_solver(A, b, x_exact, omega, tol=5e-6, max_iterations=1000):
    n = len(b)
    x = np.zeros_like(b)
    iteration = 0
    iteration_process = []

    for iteration in range(max_iterations):
        x_new = np.copy(x)
        
        for i in range(n):
            sigma = 0
            for j in range(n):
                if j != i:
                    sigma += A[i, j] * x_new[j]
            x_new[i] = (1 - omega) * x[i] + (omega / A[i, i]) * (b[i] - sigma)
        
        iteration_process.append(np.copy(x_new))
        
        if np.linalg.norm(x_new - x_exact, ord=np.inf) < tol:
            break
        
        x = x_new

    return x, iteration + 1, iteration_process
function x = SOR(A, b, k, omega)
    % A: 系数矩阵
    % b: 常数项列向量
    % k: 最大迭代次数
    % omega: 松弛因子
    n = length(b);
    x = zeros(n, 1); 
    
    for iter = 1:k
        for i = 1:n
            sum1 = b(i);
            sum2 = 0;
            
            % 上三角部分
            for j = 1:i-1
                sum1 = sum1 - A(i,j) * x(j);
            end
            
            % 下三角部分
            for j = i+1:n
                sum2 = sum2 - A(i,j) * x(j);
            end
            

            x(i) = (1 - omega) * x(i) + (omega / A(i,i)) * (sum1 + sum2);
        end
    end
end