三对角矩阵求逆的算法-实现


本文实现的是论文《三对角矩阵求逆的算法》 论文作者:冉瑞生、黄延祝等人

MATLAB代码

  • 函数实现
function [A,C] = cqj_InverseMatrixOfTridiagonalMatrices(a,b,c)
% 本文实现的是论文《三对角矩阵求逆的算法》论文作者:冉瑞生、黄延祝等人
% 本文算法的计算复杂度为O(n^2)
% 应用数学和力学,第30卷,第2期 2009年2月15日出版 文章编号:1000-0887(2009)02-0238-07
% Code author:Qingjun Chang  qingjun_chang@163.com & qingjun.cn@gmail.com
% INPUT     a:下对角线 1*(n-1)
%           b:对角线 1*n
%           c:上对角线 1*(n-1)
% OUTPUT    A:原始三对角矩阵
%           C:逆矩阵
C = [];
flag = 0;
%% STEP1 input A

A = diag(a,-1)+diag(b)+diag(c,1);
a = [0 a];
%% STEP2 将A分解成A = LU
%
% $\alpha_1=b_1$
% $\tau_{i-1}=\frac{c_{i-1}}{\alpha_{i-1}},\alpha_i=b_i-a_i\tau_{i-1},$
% $\gamma_i=\frac{a_i}{\alpha_{i-1}}(i=2,\cdots,n)$
%
n = size(A,1);
alpha(1) = b(1);
if alpha(1) == 0
    fprintf('算法2.1失败!正在尝试算法2.2...\n');
    syms x
    alpha = x;
    flag = 1;
end
for i = 2:n
    t(i-1) = c(i-1)/alpha(i-1);
    alpha(i) = b(i)-a(i)*t(i-1);
    gamma(i) = a(i)/alpha(i-1);
    if alpha(i) == 0
        fprintf('算法2.1失败!正在尝试算法2.2...\n');
        syms x
        alpha = [alpha(1:i-1) x];
        t = [t x];
        gamma = [gamma x];
        flag = 1;
    end
end
if alpha(n) == 0
    fprintf('矩阵是奇异的!\n');
    return;
end
%% 算法2.2的一部分
%
% $P(x)=\Pi_{i=1}^n\alpha_i$
%
if flag
    P = 1;
    for i = 1:n
        P = P*alpha(i);
    end
    P = expand(P);
    P_poly = sym2poly(P);  % 偶尔会出现错误 提示是Not a polynomial.以后修复
    if ~P_poly(end)
        fprintf('矩阵是奇异的\n');
        return;
    end
end

%% STEP3 计算逆矩阵的最后一个元
%
% $C_{nn}=\frac{1}{\alpha_n}$
%
C = zeros(n);
if flag
    C = [C(1:end-1) x];
    C = reshape(C,n,n);
end
C(n,n) = 1/alpha(n);

%% STEP4 计算逆矩阵C的主对角线元素
%
% $C_{ii}=\frac{1}{\alpha_i}+\tau_i\gamma_{i+1}C_{i+1,i+1} (i = n-1,\cdots,2,1)$
%
for i = n-1:-1:1
    C(i,i) = 1/alpha(i)+t(i)*gamma(i+1)*C(i+1,i+1);
end

%% STEP5 计算第i行位于主对角线元素左边的元素以及位于第i列位于主对角线上方的元素
%
% $C_{ij}=-\gamma_{j+1}C_{i,j+1} (i=n,n-1,\cdots,2;j=i-1,\cdots,1)$
%
% $C_{ji}=-\tau_jC_{j+1,i} (i=n,n-1,\cdots,2;j=i-1,\cdots,1)$
%
for i = n:-1:2
    for j = i-1:-1:1
        C(i,j) = -gamma(j+1)*C(i,j+1);
    end
end
for i = n:-1:2
    for j = i-1:-1:1
        C(j,i) = -t(j)*C(j+1,i);
    end
end

%% STEP6 输出C
if flag
    C = expand(C);
    str = '@(x) [';
    for i = 1:n
        for j = 1:n
            temp = factor(C(i,j));
            str = [str ' ' char(prod(temp))];
        end
        str = [str ';'];
    end
    str = [str ']'];
    Cfun = str2func(str);
    C = Cfun(0);
    return;
end
  • 测试
a = [1 -1 -1];
b = [1 3 -1 1];
c = [1 2 1];
[A,C] = cqj_InverseMatrixOfTridiagonalMatrices(a,b,c)
  • 论文原文

三对角矩阵求逆的算法_冉瑞生.pdf

  • 文档

文档原文


如有任何疑问或建议欢迎下方留言 :-)


评论