【matlab】【数值分析】针对特殊矩阵的追赶法的matlab实现

【matlab】【数值分析】针对特殊矩阵的追赶法的matlab实现

原文链接:
点我!这就是本人的博客喵,快来看喵!

下面的追赶法算法原理不予介绍,在参考文献中有原文可参照。

考察线性方程组:
A x = y Ax=y Ax=y
其中系数矩阵A为如下形式:

  1. 常对角矩阵(Toeplitz矩阵)
    A = [ a 0 a − 1 a − 2 … … a − n + 1 a 1 a 0 a − 1 ⋱ ⋮ a 2 a 1 ⋱ ⋱ ⋱ ⋮ ⋮ ⋱ ⋱ ⋱ a − 1 a − 2 ⋮ ⋱ a 1 a 0 a − 1 a n − 1 … … a 2 a 1 a 0 ] A = \begin{bmatrix} a_{0} & a_{-1} & a_{-2} & \ldots & \ldots & a_{-n+1} \\ a_{1} & a_{0} & a_{-1} & \ddots & & \vdots \\ a_{2} & a_{1} & \ddots & \ddots & \ddots & \vdots \\ \vdots & \ddots & \ddots & \ddots & a_{-1} & a_{-2} \\ \vdots & & \ddots & a_{1} & a_{0} & a_{-1} \\ a_{n-1} & \ldots & \ldots & a_{2} & a_{1} & a_{0} \end{bmatrix} A= a0a1a2an1a1a0a1a2a1a1a2a1a0a1an+1a2a1a0
  2. 循环矩阵
    A = [ a 0 a n − 1 a n − 2 … … a 1 a 1 a 0 a n − 1 a n − 2 ⋮ a 2 a 1 a 0 a n − 1 ⋱ ⋮ ⋮ ⋱ ⋱ ⋱ a 1 a n − 2 ⋮ ⋱ a 1 a 0 a n − 1 a n − 1 a n − 2 a n − 3 … … a 0 ] A = \begin{bmatrix} a_{0} & a_{n-1} & a_{n-2} & \ldots & \ldots & a_{1} \\ a_{1} & a_{0} & a_{n-1} & a_{n-2} & & \vdots \\ a_{2} & a_{1} & a_{0} & a_{n-1} & \ddots & \vdots \\ \vdots & \ddots & \ddots & \ddots & a_{1} & a_{n-2} \\ \vdots & & \ddots & a_{1} & a_{0} & a_{n-1} \\ a_{n-1} & a_{n-2} & a_{n-3} & \ldots & \ldots & a_{0} \end{bmatrix} A= a0a1a2an1an1a0a1an2an2an1a0an3an2an1a1a1a0a1an2an1a0
    为特殊的Toeplitz矩阵。
  3. 三对角矩阵
    A = [ b 1 c 1 a 2 b 2 c 2 a 3 b 3 ⋱ ⋱ ⋱ c n − 1 a n b n ] A = \begin{bmatrix} b_{1} & c_{1} & & & \\ a_{2} & b_{2} & c_{2} & & \\ & a_{3} & b_{3} & \ddots & \\ & & \ddots & \ddots & c_{n-1}\\ & & & a_{n} & b_{n} \\ \end{bmatrix} A= b1a2c1b2a3c2b3ancn1bn
  4. 循环Toeplitz三对角线性方程组
    A = [ b 1 c 1 a 1 a 2 b 2 c 2 a 3 b 3 ⋱ ⋱ ⋱ c n − 1 c n a n b n ] A = \begin{bmatrix} b_{1} & c_{1} & & & a_{1}\\ a_{2} & b_{2} & c_{2} & & \\ & a_{3} & b_{3} & \ddots & \\ & & \ddots & \ddots & c_{n-1}\\ c_{n} & & & a_{n} & b_{n} \\ \end{bmatrix} A= b1a2cnc1b2a3c2b3ana1cn1bn
  5. 五对角矩阵
    A = [ c 1 d 1 e 1 b 2 c 2 d 2 e 2 a 3 b 3 c 3 d 3 e 3 a 4 b 4 c 4 d 4 e 4 ⋱ ⋱ ⋱ ⋱ ⋱ a n − 2 b n − 2 c n − 2 d n − 2 e n − 2 a n − 1 b n − 1 c n − 1 d n − 1 a n b n c n ] A = \begin{bmatrix} c_{1} & d_{1} & e_{1} & & & & \\ b_{2} & c_{2} & d_{2} & e_{2} & & & \\ a_{3} & b_{3} & c_{3} & d_{3} & e_{3} & & \\ & a_{4} & b_{4} & c_{4} & d_{4} & e_{4} & \\ & & \ddots & \ddots & \ddots & \ddots & \ddots \\ & & & a_{n-2} & b_{n-2} & c_{n-2} & d_{n-2} & e_{n-2} \\ & & & & a_{n-1} & b_{n-1} & c_{n-1} & d_{n-1} \\ & & & & & a_{n} & b_{n} & c_{n} \end{bmatrix} A= c1b2a3d1c2b3a4e1d2c3b4e2d3c4an2e3d4bn2an1e4cn2bn1andn2cn1bnen2dn1cn

本文将使用matlab(R2022a)(win11 64位操作系统)逐一实现上列线性方程组的追赶法。详细原理及算法分析来源于最后的参考资料,文中并不提及。

三对角

算法步骤
一、替换(*角标表示替换后的元素,下文同理)
c i ∗ = { c i b i if  i = 1 , c i b i − a i c i ∗ if  i = 2 , 3 , … , n − 1. c^{*}_{i} = \begin{cases} \frac{c_{i}}{b_{i}} & \text{if }i = 1, \\ \frac{c_{i}}{b_{i}-a_{i}c^{*}_{i}} & \text{if }i = 2,3,\ldots,n-1. \end{cases} ci={bicibiaiciciif i=1,if i=2,3,,n1.
d i ∗ = { d i b i if  i = 1 , d i − a i d i − 1 ∗ b i − a i c i − 1 ∗ if  i = 2 , 3 , … , n . d^{*}_{i} =\begin{cases} \frac{d_{i}}{b_{i}} & \text{if }i = 1, \\ \frac{d_{i}-a_{i}d^{*}_{i-1}}{b_{i}-a_{i}c^{*}_{i-1}} & \text{if }i = 2,3,\ldots,n. \end{cases} di={bidibiaici1diaidi1if i=1,if i=2,3,,n.
其中 d i ∈ y d_{i} \in y diy.

二、计算解向量(追与赶)
x n = d n ∗ , x i = d i ∗ − c i x i + 1  for  i = n − 1 , n − 2 , … , 1. x_{n} = d^{*}_{n}, x_{i} = d^{*}_{i}-c_{i}x_{i+1} \text{ for } i = n-1,n-2,\ldots,1. xn=dn,xi=dicixi+1 for i=n1,n2,,1.

代码实现

function x = Tridiagonal(a, b, c, d)
% a、b、c 分别为三对角线的下对角线、主对角线和上对角线
% d 为常数向量
n = length (d); % 矩阵维度
% 追赶法的第一步:消元
c(1) = c(1)/b(1);
d(1) = d(1)/b(1);
for i = 2 : n-1
    c(i) = c(i) / (b(i)-a(i)*c(i-1));
    d(i) = (d(i)-a(i-1)*d(i-1)) / (b(i)-a(i-1)*c(i-1));
end
d(n) = (d(n)-a(n-1)*d(n-1)) / (b(n)-a(n-1)*c(n-1));
% 追赶法的第二步:回代
x(n) = d (n);
for i = n-1:-1:1
    x(i) = d(i)-c(i)*x(i+1);
end
end

循环Toeplitz三对角

算法步骤
一、 A = L U A = LU A=LU, 其中

L = [ d 1 a 2 d 2 ⋱ ⋱ a n − 2 d n − 2 a n − 1 d n − 1 α 1 α 2 ⋯ α n − 2 α n − 1 d n ] , U = [ 1 u 1 β 1 1 u 2 β 2 ⋱ ⋱ ⋮ 1 u n − 2 β n − 2 1 β n − 1 1 ] L = \begin{bmatrix} d_1 & & & & & & \\ a_2 & d_2 & & & & & \\ & \ddots & \ddots & & & & \\ & & a_{n-2} & d_{n-2} & & & \\ & & & a_{n-1} & d_{n-1} & & \\ \alpha_1 & \alpha_2 & \cdots & \alpha_{n-2} & \alpha_{n-1} & d_n & \end{bmatrix}, \\ U = \begin{bmatrix} 1 & u_1 & & & & \beta_1 \\ & 1 & u_2 & & & \beta_2 \\ & & \ddots & \ddots & & \vdots \\ & & & 1 & u_{n-2} & \beta_{n-2} \\ & & & & 1 &\beta_{n-1}\\ & & & & & 1 \end{bmatrix} L= d1a2α1d2α2an2dn2an1αn2dn1αn1dn ,U= 1u11u21un21β1β2βn2βn11
其中
d 1 = b 1 , u 1 = c 1 / d 1 , α 1 = c n , β 1 = α 1 / d 1 , d_1 = b_1, \quad u_1 = c_1/d_1, \quad \alpha_1 = c_n, \quad \beta_1 = \alpha_1/d_1, d1=b1,u1=c1/d1,α1=cn,β1=α1/d1,
{ d i = b i − a i u i − 1 u i = c i / d i , i = 2 , 3 , … , n − 2 α i = − α i − 1 u i − 1 \begin{cases} d_i &= b_i - a_i u_{i-1} \\ u_i &= c_i/d_i , \quad i = 2,3,\dots,n-2 \\ \alpha_i &= -\alpha_{i-1}u_{i-1} \end{cases} \\ diuiαi=biaiui1=ci/di,i=2,3,,n2=αi1ui1
d n − 1 = b n − 1 − α n − 2 u n − 2 , α n − 1 = a n − α n − 2 u n − 2 , β n − 1 = ( c n − 1 − a n − 1 β n − 2 ) / d n − 1 , d n = b n − ∑ i = 1 n − 1 α i β i . d_{n-1} = b_{n-1} - \alpha_{n-2}u_{n-2}, \\ \alpha_{n-1} = a_n - \alpha_{n-2}u_{n-2}, \\ \beta_{n-1} = (c_{n-1} - a_{n-1}\beta_{n-2})/d_{n-1}, \\ d_n = b_n - \sum_{i=1}^{n-1}\alpha_i\beta_i. dn1=bn1αn2un2,αn1=anαn2un2,βn1=(cn1an1βn2)/dn1,dn=bni=1n1αiβi.
二、首先求解方程 L y = f Ly=f Ly=f
{ y 1 = f 1 / d 1 , y i = ( f i − a i y i − 1 ) / d i , i = 2 , 3 , … , n − 1 , y n = ( f n − ∑ i = 1 n − 1 α i y i ) / d n . \begin{aligned} \begin{cases} y_1 &= f_1/d_1, \\ y_i &= (f_i - a_i y_{i-1})/d_i, \quad i = 2,3,\dots,n-1, \\ y_n &= (f_n - \sum_{i=1}^{n-1}\alpha_i y_i)/d_n. \end{cases} \end{aligned} y1yiyn=f1/d1,=(fiaiyi1)/di,i=2,3,,n1,=(fni=1n1αiyi)/dn.
三、然后求解方程 U x = y Ux=y Ux=y
{ x n = y n , x n − 1 = y n − 1 − β n − 1 x n , x i = y i − u i x i + 1 − β i x n , i = n − 2 , n − 3 , … , 2 , 1. \begin{aligned} \begin{cases} x_n &= y_n, \\ x_{n-1} &= y_{n-1} - \beta_{n-1}x_n, \\ x_i &= y_i - u_ix_{i+1} - \beta_ix_n, \quad i = n-2,n-3,\dots,2,1. \end{cases} \end{aligned} xnxn1xi=yn,=yn1βn1xn,=yiuixi+1βixn,i=n2,n3,,2,1.

代码实现

function x = CTTChase(a,b,c,f)
n = length (f); % 矩阵维度
c(1) = c(1)/b(1);
alpha = zeros(n-1,1);
alpha(1) = c(n); 
beta = zeros(n-1,1);
beta(1) = alpha(1)/b(1);
for i = 2:n-2
    b(i) = b(i) - a(i)*c(i-1);
    c(i) = c(i)/b(i);
    alpha(i) = - alpha(i-1)*c(i-1);
    beta(i) = - (beta(i-1)*a(i))/b(i);
end
b(n-1) = b(n-1) - alpha(n-2)*c(n-2);
alpha(n-1) = a(n) - alpha(n-2)*c(n-2);
beta(n-1) = (c(n-1)-a(n-1)*beta(n-2))/b(n-1);
b(n) = b(n) - sum(alpha.*beta);

f(1) = f(1)/b(1);
for i = 2:n-1
    f(i) = (f(i)-a(i)*f(i-1))/b(i);
end
sum1 = 0;
for i = 1:n-1
    sum1 = sum1 + alpha(i)*f(i);
end
f(n) = (f(n)-sum1)/b(n);

x(n) = f(n);
x(n-1) = f(n) - beta(n-1)*x(n);
for i = n-2:-1:1
    x(i) = f(i) - c(i)*x(i+1) - beta(i)*x(n);
end
end

五对角

算法步骤
一、替换
b i ∗ = { b i if  i = 2 , b i − a i d i − 2 ∗ if  i = 3 , 4 , … , n . b^{*}_{i} = \begin{cases} b_{i} & \text{if }i = 2, \\ b_{i} - a_{i}d^{*}_{i-2} & \text{if }i = 3,4,\ldots,n. \end{cases} \\ bi={bibiaidi2if i=2,if i=3,4,,n.
c i ∗ = { c i if  i = 1 , c i − b i ∗ d i − 1 c i − 1 if  i = 2 , c i − a i e i − 2 ∗ − b i ∗ d i − 1 ∗ if  i = 3 , 4 , … , n . c^{*}_{i} = \begin{cases} c_{i} & \text{if }i = 1, \\ c_{i} - \frac{b^{*}_{i}d_{i-1}}{c_{i-1}} & \text{if }i = 2, \\ c_{i} - a_{i}e^{*}_{i-2} - b^{*}_{i}d^{*}_{i-1} & \text{if }i = 3,4,\ldots,n. \end{cases} \\ ci= cicici1bidi1ciaiei2bidi1if i=1,if i=2,if i=3,4,,n.
d i ∗ = { d i c i if  i = 1 , d i − b i ∗ d i − 1 ∗ c i ∗ if  i = 2 , 3 , … , n − 1. d^{*}_{i} = \begin{cases} \frac{d_{i}}{c_{i}} & \text{if }i = 1, \\ \frac{d_{i} - b^{*}_{i}d^{*}_{i-1}}{c^{*}_{i}} & \text{if }i = 2,3,\ldots,n-1. \end{cases} \\ di={cidicidibidi1if i=1,if i=2,3,,n1.
e i ∗ = e i c i ∗ i = 1 , 2 , … , n − 2. e^{*}_{i} = \frac{e_{i}}{c^{*}_{i}} \quad i = 1,2,\ldots,n-2. ei=cieii=1,2,,n2.

二、设 L y = f Ly = f Ly=f,求 y y y.
y i ∗ = { y i c i if  i = 1 , y i − b i ∗ y i − 1 c i ∗ if  i = 2 y i − a i y i − 2 ∗ − b i ∗ y i − 1 ∗ c i ∗ if  i = 3 , 4 , … , n . y^{*}_{i} = \begin{cases} \frac{y_{i}}{c_{i}} & \text{if }i = 1, \\ \frac{y_{i} - b^{*}_{i}y_{i-1}}{c^{*}_{i}} & \text{if }i = 2 \\ \frac{y_{i} - a_{i}y^{*}_{i-2} - b^{*}_{i}y^{*}_{i-1}}{c^{*}_{i}} & \text{if }i = 3,4,\ldots,n. \end{cases} yi= ciyiciyibiyi1ciyiaiyi2biyi1if i=1,if i=2if i=3,4,,n.
三、计算解向量 x x x
{ x n = y n ∗ x n − 1 = y n − 1 ∗ − d n − 1 ∗ x n x i = y i ∗ − d i ∗ x i + 1 − e i ∗ x i + 2  for  i = n − 2 , n − 3 , … , 1. \begin{cases} x_{n} = y^{*}_{n} \\ x_{n-1} = y^{*}_{n-1} - d^{*}_{n-1}x_{n} \\ x_{i} = y^{*}_{i} - d^{*}_{i}x_{i+1} - e^{*}_{i}x_{i+2} \text{ for } i = n-2,n-3,\ldots,1. \end{cases} xn=ynxn1=yn1dn1xnxi=yidixi+1eixi+2 for i=n2,n3,,1.
代码实现

function x = Pentadiagonal(a, b, c, d, e, f)
a=[0,0,a];
b=[0,b];
d=[d,0];
e=[e,0,0];
n = length (f); % 矩阵维度
alpha=zeros(n,1); %1~n
ganma=zeros(n,1);%2~n
z=zeros(n,1);%3~n

beta=zeros(n,1);%1~n-1
q=zeros(n,1);%1~n-2

alpha(1)=c(1);
beta(1)=d(1)/alpha(1);
% beta(1)=d(1)/d(2);

ganma(2)=b(2);
alpha(2)=c(2)-ganma(2)*beta(1);

for i=1:2
    q(i)=e(i)/alpha(i);
end

beta(2)=(d(2)-ganma(2)*q(1))/alpha(2);

for i=3:n
    if i<=n-2
        z(i)=a(i);
        ganma(i)=b(i)-z(i)*beta(i-2);
        alpha(i)=c(i)-z(i)*q(i-2)-ganma(i)*beta(i-1);
        q(i)=e(i)/alpha(i);
        beta(i)=(d(i)-ganma(i)*q(i-1))/alpha(i);
    elseif i<=n-1
        z(i)=a(i);
        ganma(i)=b(i)-z(i)*beta(i-2);
        alpha(i)=c(i)-z(i)*q(i-2)-ganma(i)*beta(i-1);
        beta(i)=(d(i)-ganma(i)*q(i-1))/alpha(i);
    else
        z(i)=a(i);
        ganma(i)=b(i)-z(i)*beta(i-2);
        alpha(i)=c(i)-z(i)*q(i-2)-ganma(i)*beta(i-1);
    end
end

y=zeros(n,1);
y(1)=f(1)/alpha(1);
y(2)=(f(2)-ganma(2)*y(1))/alpha(2);
for i=3:n
    y(i)=(f(i)-z(i)*y(i-2)-ganma(i)*y(i-1))/alpha(i);
end

x=zeros(n,1);
x(n)=y(n);
x(n-1)=y(n-1)-beta(n-1)*x(n);
for i=n-2:-1:1
    x(i)=y(i)-q(i)*x(i+2)-beta(i)*x(i+1);
end
end

Latex公式源码文件

下载地址:点我

觉得有帮助的话,关注汐新酱喵,关注汐新酱喵谢谢喵!

参考资料

[1] 金一庆、陈越、王冬梅,数值方法,机械工业出版社,2000
[2] 李青、王能超,解循环三对角线性方程组的追赶法,小型微型计算机系统,第23卷第11期,2002年11月
[3] 王礼广,蔡放,熊岳山,五对角线性方程组追赶法,南华大学学报(自然科学版),第22卷第1期,2008年3月

  • 38
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值