【数值计算】追赶法

   记录一下追赶法解特殊方程组,设有 n n n阶方程组 A x = d \mathbf{A}x=d Ax=d,其中 A \mathbf{A} A为三对角矩阵,即
A = [ b 1 c 1 a 2 b 2 c 2 ⋱ ⋱ ⋱ a n − 1 b n − 1 c n − 1 a n b n ] , d = [ d 1 d 2 ⋮ d n − 1 d n ] \mathbf{A} = \left[ \begin{array}{ccc} b_{1} & c_{1}\\ a_{2} & b_{2} & c_{2}\\ & \ddots & \ddots & \ddots\\ & & a_{n-1} & b_{n-1} & c_{n-1}\\ & & & a_{n} & b_{n}\\ \end{array} \right], \quad d = \left[ \begin{array}{ccc} d_{1}\\ d_{2}\\ \vdots\\ d_{n-1}\\ d_{n}\\ \end{array} \right] A=b1a2c1b2c2an1bn1ancn1bn,d=d1d2dn1dn
   对矩阵 A \mathbf{A} A进行克洛托分解( L U LU LU分解),得到
L = [ l 1 v 2 l 2 ⋱ ⋱ v n − 1 l n − 1 v n l n ] , U = [ 1 u 1 1 u 2 ⋱ ⋱ 1 u n − 1 1 u n ] \mathbf{L} = \left[ \begin{array}{ccc} l_{1} &\\ v_{2} & l_{2}\\ & \ddots & \ddots\\ & & v_{n-1} & l_{n-1}\\ & & & v_{n} & l_{n}\\ \end{array} \right], \quad \mathbf{U} = \left[ \begin{array}{ccc} 1 & u_{1}\\ & 1 & u_{2}\\ & & \ddots & \ddots\\ & & & 1 & u_{n-1}\\ & & & & 1 & u_{n}\\ \end{array} \right] L=l1v2l2vn1ln1vnln,U=1u11u21un11un
   因此 A x = d \mathbf{A}x=d Ax=d等价于求解 L y = d Ly=d Ly=d U x = y Ux=y Ux=y,于是可以推得追赶法算法过程如下:
   1.计算 l i l_{i} li u i u_{i} ui递推公式。
l 1 = b 1 , l i = b i − a i u i − 1 , i = 2 , 3 , 4 , … , n u 1 = c 1 / b 1 , u i = c i / l i , i = 2 , 3 , 4 , … , n l_{1} = b_{1}, \quad l_{i} = b_{i} - a_{i}u_{i-1}, \quad i=2,3,4,\dots,n\\ u_{1} = c_{1} / b_{1},\quad u_{i} = c_{i} / l{i},\quad\quad i=2,3,4,\dots,n l1=b1,li=biaiui1,i=2,3,4,,nu1=c1/b1,ui=ci/li,i=2,3,4,,n
   2.求解 L y = d Ly=d Ly=d
y 1 = d 1 / b 1 , y i = ( d i − a i y i − 1 ) / l i , i = 2 , 3 , 4 , … , n y_{1} = d_{1}/b_{1}, \quad y_{i} = (d_{i} - a_{i}y_{i-1})/l_{i}, \quad i=2,3,4,\dots,n y1=d1/b1,yi=(diaiyi1)/li,i=2,3,4,,n
   3.求解 U x = y Ux=y Ux=y
x n = y n , x i = y i − u i x i + 1 , i = n − 2 , n − 2 , … , 1 x_{n} = y_{n}, \quad x_{i} = y_{i} - u_{i}x_{i+1}, \quad i=n-2,n-2,\dots,1\\ xn=yn,xi=yiuixi+1,i=n2,n2,,1
   故可将上述算法过程转换成代码:

追赶法MATLAB程序代码

function x = tridiagsolver(a, b, c, d)
n = length(b);
l(1) = b(1);
y(1) = d(1) / l(1);
u(1) = c(1) / l(1);
for ii = 2 : n
    l(ii) = b(ii) - a(ii - 1) * u(ii - 1);
    y(ii) = (d(ii) - y(ii - 1) * a(ii - 1)) / l(ii);
    if ii <= n-1
    	u(ii) = c(ii) / l(ii);
    end
end

x(n) = y(n);
for ii = n-1 : -1 : 1
    x(ii) = y(ii) - u(ii) * x(ii + 1);
end

追赶法C++程序代码

/*************************************************************************
 void tridiagsolver(double *dst, double *a, double *b, double *c, double *d, int num)
 功能: 追赶法求解三角矩阵
 参数: 
        dst:   输出结果
        a:      稀疏矩阵最下边部分的元素
        b:     稀疏矩阵中间部分的元素
        c:     稀疏矩阵最上边部分的元素
        d:      右端向量
        num:    矩阵大小
返回值: 无
 *************************************************************************/
void tridiagsolver(double *dst, double *a, double *b, double *c, double *d, int num)
{
    double *l = new double[num];
    double *y = new double[num];
    double *u = new double[num - 1];

    // 追过程
    l[0] = b[0];
    y[0] = d[0] / l[0];
    u[0] = c[0] / l[0];
    for (int i = 1; i < num; i++)
    {
        l[i] = b[i] - a[i-1] * u[i-1];
        y[i] = (d[i] - y[i-1] * a[i-1]) / l[i];
        if (i < num - 1)
                u[i] = c[i] / l[i];
    }

    // 赶过程
    dst[num-1] = y[num-1];
    for (int i = num-2; i >= 0; i--)
    {
        dst[i] = y[i] - u[i] * dst[i+1];
    }

    delete [] l;
    delete [] y;
    delete [] u;
}

   需要注意的是,程序中的代码和算法求解过程存在略微差异,是由于存储对三角a,b,c的数组大小不一致引起。如果输入的数组大小一致,则需要对代码进行相应修改。如图1所示的是对三角方程的求解过程。
在这里插入图片描述

图1 求解结果示意

参考文献:
   [1] 现代数值计算/同济大学计算数学教研室编著.——2版. ——北京:人民邮电出版社,2021.12冲印

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《数值计算方法丁丽娟pdf》是一本分享数值计算方法知识和应用的电子书,作者为丁丽娟老师。该书详细介绍了数值计算的各类基本算法,包括根据函数图像、数列、数据分布进行插值、微积分、方程求解、线性代数等领域的方法。此外,该书也探讨了误差分析和优化算法,旨在帮助读者理解和应用数值计算方法。在内容组织上,该书形式新颖,系统化且内容全面。作者分别从理论、实验和应用等多个角度进行阐述。特别是在数学理论的讲解上比较严谨明确,系统详尽,并配上大量的例题和练习题,能够很好地锻炼读者的理论水平。值得一提的是,书本身的排版设计和资料质量也非常不错,可以让读者有良好的阅读体验。 总而言之,该书是一本从数值计算方法的基础理论出发,逐步深入到应用问题的本书,并且适合不同层次和领域的读者阅读。不仅是数学爱好者的好读物,也是不可或缺的参考书。该书不仅能帮助学生更好地掌握数值计算的基本方法和应用,也可为研究者提供良好的参考书,提升其研究水平和能力。 ### 回答2: 《数值计算方法丁丽娟pdf》是一本介绍数值计算方法的教材,书中详细介绍了数值计算的基本概念、方法和原理。书中内容主要包括数值误差、插值与逼近、数值微积分、常微分方程数值解等内容。此外,书中还介绍了数值计算中常用的算法和编程方法,如数值稳定性分析、数值求解方法、Matlab编程等。总体来说,《数值计算方法丁丽娟pdf》既深入浅出,易于理解,又包含了一定的理论和实践内容,非常适合本科生、研究生以及从事数值计算相关工作的人员阅读和学习。另外,该书也可作为数学、工程、科学及计算机等相关专业的教材或参考书,可以帮助读者更好地掌握数值计算方法,提高数值计算的实际应用能力。 ### 回答3: 《数值计算方法丁丽娟pdf》是一本关于数值计算方法的教材,主要内容包括线性方程组的解法、插值与逼近、数值积分与数值微分、常微分方程的初值问题数值解等等。这本书对于计算数学和工程计算等相关领域的学生和从业人员都是非常有益的学习资料。 首先,本书着重讲解了线性方程组的解法,介绍了高斯消元法、追赶法以及LU分解等算法。其中,对于矩阵求逆方面的内容也做了较为详细的讲解。 其次,在插值与逼近方面,本书涉及拉格朗日插值、差分插值、牛顿插值、最小二乘法等等。同时,书中也介绍了三次样条插值以及样条逼近等更加高级的方法,对于需要进行函数逼近和数据拟合的应用场景非常有帮助。 接着,在数值积分与数值微分方面,本书讲解了梯形公式、辛普森公式、龙贝格公式等多种数值积分方法,也介绍了数值微分的多种实现方式,如差商、牛顿-科茨公式等。这些方法在科学计算、工程计算中常常需要用到。 最后,在常微分方程的初值问题数值解方面,本书讲解了欧拉法、改进的欧拉法、龙格-库塔法等常见的求解ODE的数值方法,这对于涉及到动力学模拟、控制系统设计等方面的应用十分重要。 综上所述,《数值计算方法丁丽娟pdf》是一本系统全面、易于理解的数值计算方法教材,不仅适合学生学习,也适合从事相关行业的人员作为参考资料。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值