三対角方程式と循環三対角方程式の数値解法(完全なコード付き)

1.三対角方程式の数値解法(トーマスアルゴリズムまたは「キャッチアップ法」)

ここに写真の説明を挿入
ここに写真の説明を挿入

%{
    
    
Function: solve_tridiagonal_matrix_equation
Description: 求解三对角矩阵方程A(a, b, c) * x = d
Input: 三对角线向量a,b,c, 向量d,向量维数n
Output: 三对角矩阵方程的解向量x,求解结果状态sta(sta = 0表示求解失败,sta = 1表示求解成功)
Author: Marc Pony(marc_pony@163.com)
%}
function [x, sta] = solve_tridiagonal_matrix_equation(a, b, c, d, n)
sta = 0;
x = zeros(n, 1);

if n < 2
    return;
end

if abs(b(1)) > 1.0e-12
    %Forward Elimination
    for k = 2 : 1 : n
        if abs(b(k - 1)) < 1.0e-10
            return;
        end
        m = a(k) / b(k - 1);
        b(k) = b(k) - m * c(k - 1);
        d(k) = d(k) - m * d(k - 1);
    end
    
    % Backward substitution
    x(n) = d(n) / b(n);
    for k = n - 1 : -1 : 1
        x(k) = (d(k) - c(k) * x(k + 1)) / b(k);
    end
else
    x(2) = d(1) / c(1);
    
    nn = n - 1;
    xx = zeros(nn, 1);
    aa = zeros(nn, 1);
    bb = zeros(nn, 1);
    cc = zeros(nn, 1);
    dd = zeros(nn, 1);
    
    aa(2) = 0.0;
    aa(3 : nn) = a(4 : n);
    
    bb(1) = a(2);
    bb(2 : nn) = b(3 : n);
    
    cc(1 : nn) = c(2 : n);
    
    dd(1) = d(2) - b(2) * x(2);
    dd(2) = d(3) - a(3) * x(2);
    dd(3 : nn) = d(4 : n);
    
    %Forward Elimination
    for k = 2 : 1 : nn
        if abs(bb(k - 1)) < 1.0e-10
            return;
        end
        m = aa(k) / bb(k - 1);
        bb(k) = bb(k) - m * cc(k - 1);
        dd(k) = dd(k) - m * dd(k - 1);
    end
    
    % Backward substitution
    xx(nn) = dd(nn) / bb(nn);
    for k = nn - 1 : -1 : 1
        xx(k) = (dd(k) - cc(k) * xx(k + 1)) / bb(k);
    end
    
    x(1) = xx(1);
    x(3 : n) = xx(2 : nn);
end
sta = 1;
end
clc;
clear;

a = [0 1 4 6]';
b = [7 8 9 10]';
c = [2 3 5 0]';
d = [1 2 3 4]';
n = 4;

A = diag(a(2 : n), -1) + diag(b, 0) + diag(c(1 : n - 1), 1);
xx = A \ d

[x, sta] = solve_tridiagonal_matrix_equation(a, b, c, d, n)

  結果の例:

2.循環三対角方程式の数値解法(Sherman-Morrison式)

ここに写真の説明を挿入
ここに写真の説明を挿入

%{
    
    
Function: solve_cyclic_tridiagonal_matrix_equation
Description: 求解循环三对角矩阵方程A(a, b, c) * x = d
Input: 循环三对角线向量a,b,c, 向量d,向量维数n
Output: 循环三对角矩阵方程的解向量x,求解结果状态sta(sta = 0表示求解失败,sta = 1表示求解成功)
Author: Marc Pony(marc_pony@163.com)
%}
function [x, sta] = solve_cyclic_tridiagonal_matrix_equation(a, b, c, d, n)
sta = 0;
x = zeros(n, 1);

if n < 2
    return;
end

if abs(b(1)) < 1.0e-12
   return; 
end

bb = zeros(n, 1);
bb(2 : n - 1) = b(2 : n - 1);
bb(n) = b(n) - a(1) * c(n) / b(1);
[y, sta] = solve_tridiagonal_matrix_equation(a, bb, c, d, n);
if sta == 0
   return;  
end

u = zeros(n, 1);
u(1) = b(1);
u(n) = c(n);
[q, sta] = solve_tridiagonal_matrix_equation(a, bb, c, u, n);
if sta == 0
   return;  
end

v = zeros(n, 1);
v(1) = 1.0;
v(n) = a(1) / b(1);

x = y - ((v' * y) / (1.0 + v' * q)) * q;
sta = 1;
end
clc;
clear;

a = [5 2 1 2 5 3]';
b = [16 14 6 6 14 16]';
c = [3 5 2 1 2 3]';
d = [1 2 3 4 5 6]';
n = 6;
A = diag(a(2 : n), -1) + diag(b, 0) + diag(c(1 : n - 1), 1);
A(1, n) = a(1);
A(n, 1) = c(n);
xx = A \ d

[x, sta] = solve_cyclic_tridiagonal_matrix_equation(a, b, c, d, n)

  結果の例:

3.参考文献

自動機械およびロボットの軌道計画中章节:A.5三重対角システムの数値解法

おすすめ

転載: blog.csdn.net/maple_2014/article/details/107170005