zoukankan      html  css  js  c++  java
  • 线性方程组的迭代解法——超松弛迭代法

      1.代码

    %%超松弛迭代法(此方法适用于大型稀疏矩阵但不适合与病态方程的解
    %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度,omiga是松弛因子
    function OIM = Overrelaxation_iterative_method(M,b,X0,epsilon)
    [m,n] = size(M);
    d = diag(M);L = zeros(m,n);U = zeros(m,n);D = zeros(m,n);eps = floor(abs(log(epsilon)));
    ub = 10000;X = zeros(m,ucb);X(:,1) = X0;X_delta = X;X_end = zeros(m,1);k_end = 0;
    for i = 1:m
        for j = 1:n
            if i > j
                L(i,j) = -M(i,j);
            elseif i < j
                U(i,j) = -M(i,j);
            elseif i == j
                D(i,j) = d(i);
            end
        end
    end
    J = D\(L+U);
    MAX = Spectral_radius(J);
    Optimum_relaxation_factor = 2/(1+sqrt(1-MAX^2));
    disp('最佳松弛因子:');
    abs(Optimum_relaxation_factor)
    omiga = input('输入松弛因子:');
    L_omiga = (D-omiga*L)\((1-omiga)*D+omiga*U);
    f = omiga*((D-omiga*L)\b);
    for k = 1:ub-1
        X(:,k+1) = L_omiga*X(:,k)+f;
        X_delta(:,k) = X(:,k+1)-X(:,k);
        delta = norm(X_delta(:,k),2);
        if delta < epsilon
            break
        end
    end
    disp('迭代解及迭代次数为:');
    k
    OIM = vpa([X(:,k)'],eps);
    %%谱半径
    %%M是方阵
        function Sr = Spectral_radius(M)
            e = eig(M);
            Sr = max(e);
        end
    end
    

      2.例子

    clear all
    clc
    for i = 1:8
        for j = 1:8
            if i == j
                M(i,j) = 2.1;
            elseif i - j == 1
                M(i,j) = 1;
            elseif j - i == 1
                M(i,j) = -1;
            else
                M(i,j) = 0;
            end
        end
    end
    b = [1 2 3 4 4 3 2 1]';
    X0 = [1 1 1 1 1 1 1 1]';
    epsilon = 1e-4;
    
    S = Overrelaxation_iterative_method(M,b,X0,epsilon)
    M\b
    

      结果如下

    最佳松弛因子:
    ans =
        0.8540
    输入松弛因子:0.8
    迭代解及迭代次数为:
    k =
        11
    S =
    [ 1.07163702, 1.25042379, 1.69753618, 1.81524709, 1.50955555, 0.985313468, 0.578713811, 0.200612427]
    ans =
        1.0716
        1.2504
        1.6975
        1.8152
        1.5096
        0.9853
        0.5787
        0.2006
    

      

  • 相关阅读:
    [剑指Offer]判断一棵树为平衡二叉树(递归)
    [HDOJ]Coin Change(DP)
    01背包、完全背包
    [CodeForces_618C]Constellation
    [Codeforces_713A]Sonya and Queries
    C++位运算符
    [codeforces_597B] Restaurant(贪心)
    [LeetCode_98]Validate Binary Search Tree
    [LeetCode_96] Unique Binary Search Trees
    [LeetCode_105]Construct Binary Tree from Preorder and Inorder Traversal
  • 原文地址:https://www.cnblogs.com/guliangt/p/12119311.html
Copyright © 2011-2022 走看看