(完整word版)追赶法求解三对角方程及其算例
三对角线线性方程组的解法

三对角线线性方程组的解法三对角线线性方程组的解法:方法一:高斯消元法令Ax=b表示方程组,其中A为方阵,x为未知数,b为常数向量令A = [a11, a12, ..., a1n; a21, a22, ..., a2n; ......; an1, an2, ..., ann] 其中a11, a22,…, ann是对角线元素下面具体介绍求解此样方程组的步骤:一.首先对方程组A×x=b中A的第1行第1列元素a11做部分行变换,将A的第1行的数据除以a11,结果放回A的第1行,同时有b的第1个元素b1也做部分行变换,先乘以a11,变成b1/a11,结果放回到b的第1个位置二.接着A的第1行元素和b的第1个元素已经变换为1,将它们对应行列上的其他元素做部分行变换,将A的第2行的第1列元素a21减去A的第1行第1列元素a11乘以A 的第2行其他元素,结果放回第2行,同时b的第2个元素b2做部分行变换,先减去a11乘以b1,变成(b2-a21*b1)/a11,结果放回到b的第2个位置三.类推,以此类推,按照以上步骤,对于A的第3行、第4行、 ......依次重复上述操作,将它们变换成上三角形,并且b也相应变换依次进行下去,直到A第n行,第1列元素a5n变换成1,b的第n个元素bn乘以a5n,变成bn/a5n,结果放回到b的第n个位置四.接着从A最后一行开始往前,由于A的第n行第1列元素变换成1,所以将A的第(n-1)行的第1列元素a(n-1)1减去A的第n行第1列元素a5n乘以A的第(n-1)行其他元素,结果放回第(n-1)行,同时b的第(n-1)个元素b(n-1)做部分行变换,先减去a5n乘以bn,变成(b(n-1)-a(n-1)1*bn)/a5n,结果放回到b的第(n-1)个位置五.类推,以此类推,按照以上步骤,一直往上进行变换,直到A的第2行,第1列元素a21变换成1,b的第2个元素b2乘以a21,变成b2/a21,结果放回到b的第2个位置六.接下来就可以用逐个消元的方法求解A×x=b的解x,依次从A的最后一行,开始对Ax=b进行消元:令xn=bn/a5n 令x(n-1)=(b(n-1)-a(n-1)1*xn)/a(n-1)2 令x (n-2)=(b(n-2)-a(n-2)1*x(n-1)-a(n-2)2*xn)/a(n-2)3 依次类推,直到x2=(b2-a21*x3-a22*x4-......-a2n*xn)/a21 以此类推,直到x1=(b1-a11*x2-.....- a1n*xn)/a11,即可得出方程组A×x=b的解x七.最后,由于A×x=b的解x取决于A的全部数据,所以如果A的值发生变化,那么方程组的解x也会发生变化。
三对角方程组的追赶法

2013-2014(1)专业课程实践论文题目:三对角方程组的追赶法一、算法理论在一些实际问题中,例如解常微分方程边值问题,解热传导方程以及船体数学放样中建立三次样条函数等,都会要求解系数矩阵为对角占优的三对角线方程组11112222211111n n n n n n n n n b c x f a b c x f a b c x f a b x f -----⎛⎫⎛⎫⎛⎫⎪⎪ ⎪ ⎪⎪ ⎪ ⎪⎪ ⎪= ⎪⎪⎪ ⎪⎪⎪ ⎪⎪ ⎪⎝⎭⎝⎭⎝⎭, 简记为Ax f =。
求解Ax f =:等价于解两个三角形方程组,Ly f y =求;,Ux y x =求.从而得到解三对角线方程组的追赶法公式:(1)计算{}i β的递推公式()111/,/,2,3,,1;i i i i i c b c b a i n βββ==-=- (2) 解Ly f =()()11111/,/,2,3,,;i i i i i i i y f b y f a y b a i n β--==--=(3)解Ux y =1,,1,2,2,1.n n i i i i x y x y x i n n β+==-=--我们将计算系数12112n n y y y βββ-→→→→→→ 及的过程称为追的过程, 将计算方程组的解11n n x x x -→→→ 的过程称为赶的过程。
#include <stdio.h>#include <math.h>#include<stdlib.h>#define N 20double a[N], b[N], c[N-1], f[N], r[N];int n;int i;void LUDecompose(); // LU分解void backSubs(); // 回代void main(){printf("请输入方程的维数n=");scanf("%d",&n);getchar();if(n>N||n<=0){printf("由于该维数过于犀利, 导致程序退出!");return;}printf("\n输入下三角元素\n");printf("输入%d个a值: ", n-1);for (i=1; i<n; i++)scanf("%lf", &a[i]);getchar();printf("\n输入主对角线元素\n");printf("输入%d个b值: ", n);for (i=0; i<n; i++)scanf("%lf", &b[i]);getchar();printf("\n输入上三角元素\n");printf("输入%d个c值: ", n-1);for (i=0; i<n-1; i++)scanf("%lf", &c[i]);getchar();printf("\n输入%d个方程组右端项: \n", n);for (i=0; i<n; i++)scanf("%lf", &f[i]);getchar();LUDecompose();backSubs();printf("\n线性方程组的解为: \n");for (i=0; i<n; i++)printf("x%d=%lf\n", i+1, f[i]);}void LUDecompose(){ //α被b取代, β被c取代, 以节省存储空间c[0]=c[0]/b[0];for(i=1;i<n-1;i++){r[i]=a[i];b[i]=b[i]-r[i]*c[i-1];c[i]=c[i]/b[i];}r[i]=a[i];b[i]=b[i]-r[i]*c[i-1];}void backSubs(){ // y被f取代, x也被f取代, 以节省存储空间f[0]=f[0]/b[0];for(i=1; i<n; i++)f[i]=(f[i]-r[i]*f[i-1])/b[i];f[n-1]=f[n-1];for(i=n-2;i>=0;i--)f[i]=f[i]-c[i]*f[i+1];}四、 算法实现例1.用该程序计算三对角线方程组2100012100A 012100012100012⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭---=-----, 10000b ⎛⎫⎪ ⎪⎪= ⎪ ⎪ ⎪⎝⎭计算其方程组的解。
(完整版)2.6追赶法

第16讲 追赶法、误差分析在实际应用问题中,经常会遇到解三对角线方程组。
例如:用三次样条函数的插值问题中得到的三转弯及三弯矩方程组,当时说可用追赶法来求解。
还有用差分法解二阶线性常微分方程边值问题,若用三点插值格式也得到解三对角线方程组,本节介绍该类方程组中的特例及该种方程组的解法:追赶法。
优点:1.计算量小。
2.方法简单,存贮量小。
3.数值稳定的(对舍入误差来说)。
1 追赶法三对角线方程组的一般表示方法:可见,对A 的分解只需求i i u l ,且按n n n l u l u l u l −→−−→−−→−−→−−→−−→−−→−--112211.....的递推过程进行,形象地称为“追”的过程⎩⎨⎧=-==-),....2(/)(/1111n i l y a f y l f y i i i i⎩⎨⎧-=-==+)1,2,.....1(1n i x u y x y x i i i inn 形象地称回代求解过程为“赶”的过程追赶法的计算量为5n-4次乘除法,可用4个 一 维数组存放{}{}{}{}i i i i f c b a ,,,。
共占用4n-2个单元,在计算过程中{}{}{}i i i y u l ,,依次覆盖掉{}{}{}i i i f c b ,,最后,{}i x 覆盖掉{}i y ,所以,追赶法具有计算量小,占用内存单元少的特点。
2、误差分析⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=-n n l u u u U 121....111⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=n nl a l a l a l L ....33221)1,...,3,2,1(-=n i ⎪⎩⎪⎨⎧+===+++11111i i i i ii i lu a b u l c l b ⎪⎩⎪⎨⎧-===+++ii i i ii i u a b l l c u b l 11111/)1,...,3,2,1(-=n i病态方程组与条件数一个线性方程组Ax=b 是由它的系数矩阵A 和它的右端项b 所确定,在实际问题中,由于各种原因,A 或b 往往有误差,从而使得解也产生误差。
追赶法(Thomas算法)

二、解三对角线性方程组的追赶法 定理1:满足引理1条件的三对角方阵A有如下形式的 唯一的克劳特分解。
p1 a2 A= pn
p2 a3 pn 1 an
1 q1 1 q2 =PQ 1 qn 1 1
其中
p1 = b1 (i = 1,2,, n 1) qi = ci pi p = b a q (i = 2,3,, n ) i i i 1 i
解三对角线方程组Ax = f可化为求解两个三角形 方程组
Py = f
Qx = y
(1) 解 Py = f
p1 a2 ( P, f ) = p2 a3 pn 1 an f1 f2 f3 pn f n
得
{
y1 = f1 / p1
yi = ( f i ai yi 1 ) / piຫໍສະໝຸດ (i = 2,3,, n )
( 2) 解 Qx = y
1 q1 1 q2 1 qn 1 1
x1 y1 x2 = y2 x y n n
得
xn = y n
xi = yi qi xi +1
i = n 1 , , 2 ,1
作业: P50 习题11
§2-4
追赶法(Thomas算法 算法) 追赶法 算法
一、对角占优矩阵
若矩阵A = ( aij )n× n 满足
|aii |> ∑|aij |
j =1 j ≠i ≠i
n
i = 1 , 2 , , n
则称A为严格对角占优矩阵.
若矩阵A = ( aij )n× n 满足
|aii | ∑|aij | ≥
j =1 j ≠i
n
i = 1 , 2 , , n
则称A为弱对角占优矩阵.
追赶法求解三对角线性方程组

追赶法求解三对角线性方程组一 实验目的利用编程方法实现追赶法求解三对角线性方程组。
二 实验内容1、 学习和理解追赶法求解三对角线性方程组的原理及方法;2、 利用MATLAB 编程实现追赶法;3、 举例进行求解,并对结果进行分。
三 实验原理设n 元线性方程组Ax=d 的系数矩阵A 为非奇异的三对角矩阵11222=(1)(n 1)()()a c b a c A a n c b n a n ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎣⎦………… 这种方程组称为三对角线性方程组。
显然,A 是上下半宽带都是1的带状矩阵。
设A 的前n-1个顺序主子式都不为零,根据定理2.5的推论,A 有唯一的Crout 分解,并且是保留带宽的。
其中L 是下三角矩阵,U 是单位上三角矩阵。
利用矩阵相乘法,可以1112212(1)1u(n 1)()()1l u m l u A LU l n m n l n ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥==⨯⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦……………得到:由上列各式可以得到L 和U 。
引入中间量y ,令yUx =,则有:已知L 和d ,可求得y 。
则可得到y 的求解表达式:11/12,3,,()(1)*y()=()[()(1)]/y d l i nm i y i li i di y i di m i y i li==-+=--…1111111/1(2)(1)(1)u (1)(11)/(1)(1)(1)l a l u c u c l mi bi i n a i m i i l i i n ci li ui ui ci li l i a i b i ui=*===≤≤+=+++≤≤-=•=+=+-+Ax LUx Ly d Ly d ====1112222(1)(n 1)(n 1)()()(n)(n)l y d m l y d l n y d m n l n y d ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⨯=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦……………由y Ux =得:111112221u(n 1)(n 1)(n 1)1(n)(n)u x y u x y x y x y ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⨯=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦………… 可得到X 的求解表达式:()()1,2,,1()()u()(1)x n y n i n n x i y i i x i ==--=-+… 从而得到Ax=d 的解x 。
追赶法求解三对角方程组

追赶法求解三对角方程组追赶法,这个名字听起来就像是一种竞赛,其实它是一种解决三对角方程组的好办法,简单得让人想笑。
想象一下,你在一个热闹的市场,身边是熙熙攘攘的人群,突然你的朋友向你喊:“嘿,快来帮我算这个方程组!”你心里想,什么方程组啊,我可不想被这复杂的数学问题给吓倒。
别担心,追赶法就像你身边的超级英雄,轻松搞定这些棘手的问题。
三对角方程组的形状其实就像个台阶,每一层都有自己的高度。
我们通常会遇到的就是那种对角线上的元素大于零,旁边的元素都比较小,这样一来,整个方程组就像是在给你发出信号:“来吧,来解决我!”在这个市场里,你得学会怎么“追赶”那些神秘的数。
追赶法的核心就是把复杂的问题变得简单,想想如果你能把一个巨大的蛋糕切成小块,那你就能轻松吃掉它。
咳咳,数学也是这样!你得确定你的三对角矩阵。
这个矩阵就像是你的地图,告诉你哪里有高地,哪里有低洼。
然后,你需要开始你的追赶之旅,逐步解决每一个未知数。
听上去是不是有点像探险?这就对了!在这个过程中,你需要运用一些聪明的小技巧,比如把当前的未知数用前一个已知数来表达,仿佛在追赶一个流动的目标。
哇,数学原来可以这么有趣,仿佛在和未知数玩捉迷藏。
我们就来谈谈如何进行具体的计算。
假设你有一个三对角矩阵,分为主对角线和两条副对角线。
你得把这个矩阵转化成一个更易处理的形式。
就像你把一堆衣服整理成一个个小堆,清晰明了。
通过一些简单的运算,你可以得到一个新的方程组。
这个时候,你会发现,原本复杂的问题似乎在慢慢迎刃而解,简直就像是阳光透过云层。
然后,进入最终的“追赶”阶段。
你得逐步代入已知的值,像是在追逐那只一直跑的兔子,直到抓到为止。
这一步可能需要一些耐心,但你可以想象自己正在追逐一场美妙的冒险,哪怕有点小曲折也没关系。
在这个过程中,你会体会到一种成就感,仿佛自己是数学界的超级英雄,成功解出了一个又一个的未知数。
好啦,最后我们来总结一下追赶法的魅力。
它不仅让复杂的三对角方程组变得简单,还让整个过程充满乐趣。
追赶法求解三对角线性方程组

追赶法求解三对角线性方程组一 实验目的利用编程方法实现追赶法求解三对角线性方程组。
二 实验内容1、 学习和理解追赶法求解三对角线性方程组的原理及方法;2、 利用MA TLAB 编程实现追赶法;3、 举例进行求解,并对结果进行分。
三 实验原理设n 元线性方程组Ax=d 的系数矩阵A 为非奇异的三对角矩阵11222=(1)(n 1)()()a c b a c A a n c b n a n ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎣⎦………… 这种方程组称为三对角线性方程组。
显然,A 是上下半宽带都是1的带状矩阵。
设A 的前n-1个顺序主子式都不为零,根据定理2.5的推论,A 有唯一的Crout 分解,并且是保留带宽的。
其中L 是下三角矩阵,U 是单位上三角矩阵。
利用矩阵相乘法,可以1112212(1)1u(n 1)()()1l u m l u A LU l n m n l n ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥==⨯⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦……………得到:由上列各式可以得到L 和U 。
引入中间量y ,令yUx =,则有:已知L 和d ,可求得y 。
则可得到y 的求解表达式:11/12,3,,()(1)*y()=()[()(1)]/y d l i nm i y i li i di y i di m i y i li==-+=--…1111111/1(2)(1)(1)u (1)(11)/(1)(1)(1)l a l u c u c l mi bi i n a i m i i l i i n ci li ui ui ci li l i a i b i ui=*===≤≤+=+++≤≤-=∙=+=+-+Ax LUx Ly d Ly d ====1112222(1)(n 1)(n 1)()()(n)(n)l y d m l y d l n y d m n l n y d ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⨯=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦……………由y Ux =得:111112221u(n 1)(n 1)(n 1)1(n)(n)u x y u x y x y x y ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⨯=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦………… 可得到X 的求解表达式:()()1,2,,1()()u()(1)x n y n i n n x i y i i x i ==--=-+… 从而得到Ax=d 的解x 。
追赶法(源自#3-4)

【附注】 解三对角方程组的追赶法设已知方程组AX D =是三对角方程组,其 矩阵形式为b c a b c a b c a b x x x x d d d d n n n n n n n n n 1122211112112100 -----⎡⎣⎢⎢⎢⎢⎢⎢⎤⎦⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎤⎦⎥⎥⎥⎥⎥⎥ (3-40) 可以证明,若系数矩阵A 满足如下条件:(1) b i ≠0(2) b a c i i i ≥++-11 ()0≤≤i n(3) b a c i i i ≥+ ()0≤≤i n则三对角方程组(3-40)用追赶法可以稳定求解。
这里的条件(2)、(3)称为“对角占优”。
考察三对角方程组具有如下特点:首尾两个 方程各只含两个未知数,其余方程各含三个未知 数,而且后一个方程包含前一个方程的两个未知 数。
追赶法的基本思想是采用依次消元的方法, 依次从前一个方程“解”出一个未知数代入到下 一个方程,谓之“追”;代到最末一个方程时, 只剩下一个未知数,于是该方程可解。
然后将所 得到的解依次回代到前面的方程,解出全部未知 数,谓之“赶”。
前后合一,故称追赶法。
为了导出追赶法的计算公式,将式(3-40)写 成方程组形式b xc xd a x b x c x d a x b x c x d a x b x c x d a x b x d i i i i i i i n n n n n n n n n n n n 111212122232111211111+=++=++=++=+=⎧⎨⎪⎪⎪⎪⎩⎪⎪⎪⎪-+------- (3-41) 由方程组(3-41)第一式解出x 1211111x b c b d x -= 令:u c b 111= ,v d b 111= (3-42)x v u x 1112=- (3-43) 将式(3-43)和(3-42)代入到方程组(3-41)第二式解 出x 2x v u x 2223=- (3-44) 其中:u c b a u 22221=- v d a v b a u 2221221=-- (3-45) 依次做下去,由方程组(3-41)第i 式解出x i x v u x i i i i =-+1 (3-46) 其中:u c b a u i i i i i =--1v d a v b a u i i i i i i i =----11 (3-47) 最后,由方程组(3-41)第n 式解出x nx d a v b a u v n n n n n n n n =--=--11(3-48) 因为最后一个方程只剩一个未知数x n ,所以只有 v n ,没有u n 。
编写用追赶法解三对角线性方程组的程序,并解下列方程组

计算方法与实习上机实验(二)实验名称:编写用追赶法解三对角线性方程组的程序,并解下列方程组:(1)⎪⎪⎩⎪⎪⎨⎧-=+-=-+--=-+-=-12,112,122,524343232121x x x x x x x x x x (2)Ax=b,其中A 10×10=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-----41141.........14114114, b 10×1=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--1515...15-15-27- 程序代码:#include<iostream>using namespace std;#include<iomanip>int main(){float a[100],b[100],c[100],x[100];int i,k,N;while(1){int ability=1; ability=0; break;}else{ a[k+1]=a[k+1]/b[k];b[k+1]=b[k+1]-a[k+1]*c[k];x[k+1]=x[k+1]-a[k+1]*x[k];//这个过程执行的是消元过程(即追赶法的追):对应于书上的βi=bi-lic(i-1),yi=di-liy(i-1)}}if(ability){x[N-1]=x[N-1]/b[N-1]; //回代法的第一项 for(i=N-2;i>=0;i--) //下标从大到小变化,是赶的过程{x[i]=(x[i]-c[i]*x[i+1])/b[i];}cout<<"此方程的解为:"<<endl;for(i=0;i<N;i++){cout<<setiosflags(ios::showpoint);cout<<"x["<<i+1<<"]="<<setiosflags(ios::fixed)<<setprecision(1)<<x[i]<<endl; //保留一位有效数字}}}return 0;}运行结果:。
解三对角方程组的追赶法

~ A LU
~ 角矩阵,且 A L DP
, unn ), P D1U , 则 P 为单位上三
A
对称,故有
A P DL A LDP
T T T
15
第二章 解线性方程组的直接方法
AT PT DLT A LDP
由Doolitle分解的唯一性,得
P L, 即
T
A P DP
T
对任意非零向量 是正定的
T
x,
T
y P1x ,
T 1 1
于是由 A
x Dx x ( P ) AP x T 1 T 1 ( P x) AP x y Ay 0
即 D 正定,所以 D 的对角元素均为正数。令
~ D diag( u11 ,, u nn )
16
第二章 解线性方程组的直接方法
(li )
(ui )
di ai di 1 di
( yi )
12
第二章 解线性方程组的直接方法
3. dn bn dn
4. 对
( xn )
i n 1, n 2,,1 (d i ci d i 1 ) bi d i
5.输出
dx
( xi )
,停机.
追赶法的基本思想与Gauss消去法及三角分解法相同, 只是由于系数中出现了大量的零,计算中可将它们撇开, 从而使得计算公式简化,也大大地减少计算量.其乘除运 算量为 5n 4
ck bk 1 c k 1
0 c n 1 a n bn
8
第二章 解线性方程组的直接方法
其中 uk bk ck 1 ak uk 1
(k 2,, n)
追赶法(Thomas算法)

二、解三对角线性方程组的追赶法 定理1:满足引理1条件的三对角方阵A有如下形式的 唯一的克劳特分解。
p1 a2 A pn
1 q1 1 q2 =PQ 1 qn 1 1
1 q1 1 q2 1 qn 1 1
x1 y 1 x y 2 2 x y n n
得
xn yn
xi yi qi xi 1
p2 a3 pn 1 an
其中
p1 b1 i 1,2,, n 1 qi ci pi p b a q i 2,3,, n i i i 1 i
解三对角线方程组 Ax f可化为求解两个三角形 方程组
Py f Qx y
(1) 解Py f
p1 a2 ( P, f ) p2 a3 pn 1 an f1 f2 f3 pn f n
得
y1 f1 / p1
yi fi ai yi 1 / pi
i 2,3,, n
(2) 解Qx y
§ 2-4
追赶法(Thomas算法)
一、对角占优矩阵
若矩阵A (aij )nn 满足
|aii | |aij |
j 1 j i
n
i 1 , 2 , , n
则称A为严格对角占优矩阵 .
若矩阵A (aij )nn 满足
|aii | |aij |
j 1 j i
n
i 1 , 2 , , n
则称A为弱对角占优矩阵 .
有一类方程组, 形式为:
MATLAB-追赶法求解三对角方程组的算法原理例题与程序

3)三对角形线性方程组123456789104100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014x x x x x x x x x x -⎡⎤⎡⎤⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎢⎥--⎢⎢⎥⎢⎢⎥-⎣⎦⎣⎦7513261214455⎡⎤⎢⎥⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥=⎢⎥-⎢⎥⎢⎥⎢⎥-⎢⎥⎥⎢⎥⎥⎢⎥⎥⎢⎥-⎣⎦*(2,1,3,0,1,2,3,0,1,1)T x =--- 二、数学原理设系数矩阵为三对角矩阵112223311100000000000000000n n n n n b c a b c a b A a b c a b ---⎛⎫ ⎪⎪ ⎪=⎪ ⎪ ⎪⎪⎪⎝⎭L L L M M MM M M L L则方程组Ax=f 称为三对角方程组。
设矩阵A 非奇异,A 有Crout 分解A=LU ,其中L 为下三角矩阵,U 为单位上三角矩阵,记11222331100001000000010000000100,00000000000001n n nn b L U γαβγββγβ--⎛⎫⎛⎫⎪ ⎪⎪ ⎪ ⎪ ⎪∂==⎪⎪ ⎪ ⎪ ⎪ ⎪⎪ ⎪⎪ ⎪∂⎝⎭⎝⎭L L L LL L M M M MM M M MM M L L LLL可先依次求出L ,U 中的元素后,令Ux=y ,先求解下三角方程组Ly=f 得出y ,再求解上三角方程组Ux=y 。
事实上,求解三对角方程组的2追赶法将矩阵三角分解的计算与求解两个三角方程组的计算放在一起,使算法更为紧凑。
其计算公式为:1111,1111,111,2,3,,,1,2,,1ii i i i i i i ii i i i i n ni i i i c f b y i n c a b a f y y x y i n n x y x βγββαβγγβαβγ--+⎧===⎪⎪=⎪⎪⎪==-=⎪⎪⎨-⎪=⎪⎪=⎪⎪=--⎪=-⎪⎩L L 对对(*)三、程序设计function x=chase(a,b,c,f)%求解线性方程组Ax=f,其中A 是三对角阵 %a 是矩阵A 的下对角线元素a(1)=0 %b 是矩阵A 的对角线元素%c 是矩阵A 的上对角线元素c(n)=0 %f 是方程组的右端向量 n=length(f);x=zeros(1,n);y=zeros(1,n); d=zeros(1,n);u= zeros(1,n); %预处理 d(1)=b(1); for i=1:n-1 u(i)=c(i)/d(i);d(i+1)=b(i+1)-a(i+1)*u(i); end%追的过程y(1)=f(1)/d(1); for i=2:ny(i)=(f(i)-a(i)*y(i-1))/d(i); end%赶的过程 x(n)=y(n); for i=n-1:-1:1x(i)=y(i)-u(i)*x(i+1); end>> a=[0,-1,-1,-1,-1,-1,-1,-1,-1,-1];>> b=[4,4,4,4,4,4,4,4,4,4];>> c=[-1,-1,-1,-1,-1,-1,-1,-1,-1,0];>> f=[7,5,-13,2,6,-12,14,-4,5,-5];>> x=chase(a,b,c,f)x =2.00001.0000-3.00000.00001.0000-2.00003.0000-0.00001.0000-1.0000四、结果分析和讨论追赶法求解的结果为x=(2,1,-3,0,1,-2,3,0,1,-1)T。
追赶法

§2 解三对角方程组的追赶法 在实际问题中,经常遇到以下形式的方程组⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧=+=++=++=++=+-------+-nn n n n n n n n n n n k k k k k k k d x b x a d x c x b x a d x c x b x a d x c x b x a d x c x b 111112111232221212111 (3.12)这种方程组的系数矩阵称为三对角矩阵⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=---n nn n n k k k b a c b a c b a c b a c b A 11122211以下针对这种方程组的特点提供一种简便有效的算法—追赶法。
追赶法实际上是高斯消去法的一种简化形式,它同样分消元与回代两个过程。
先将(3.12)第一个方程中x 1的系数化为1112111b d x b c x =+记 111111b d y b c r == (3.13)有 1211y x r x =+注意到剩下的方程中,实际上只有第二个方程中含有变量x 1,因此消元手续可以简化。
利用(3.13)可将第二个方程化为2312y x r x =+这样一步一步地顺序加工(3.12)的每个方程,设第k – 1个方程已经变成111---=+k k k k y x r x(3.14)再利用(3.14)从第k 个方程中消去x k -1,得:k k k k k k k k k a y d x c x a r b 111)(-+--=+-同除()k k k a r b 1--,得n k a r b a y d x a r b c x kk k k k k k kk k kk ,,3,21111 =--=-+--+-记kk k k k k k kk k kk a r b a y d y a r b c r 111-----=-=则有 k k k k y x r x =++1 这样做n – 1步以后,便得到:111---=+n n n n y x r x将上式与(3.12)中第11个方程联立,即可解出 x n = y n 这里nn n n n n n a r b a y d y 11----=于是,通过消元过程,所给方程组(3.12)可归结为以下更为简单的形式:⎪⎪⎪⎩⎪⎪⎪⎨⎧==+=++nn k k k k y x y x r x y x r x11211 (3.15)这种方程组称作二对角型方程组,其系数矩阵中的非零元素集中分步在主对角线和一条次主对角线上⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-11111121n k r r r r 对加工得到的方程组(3.15)自下而上逐步回代,即可依次求出x n ,x n -1,…,x 1,计算公式为:⎩⎨⎧--=-==+1,,2,11n n k x r y x y x k k k k n n (3.16)上述算法就是追赶法,它的消元过程与回代过程分别称作“追”过程与“赶”过程。
C追赶法解三对角方程组

int n;
char ch;
printf("-------本程序为追赶法解三对角方程组计算程序-------\n");
do
{
printf("请输入您要计算的三对角方程组是几阶方阵(默认最大100阶方阵):\n");
scanf("%d",&n);
l[i] = b[i] - a[i-1]*u[i-1];
}
}
for(int j=0; j<n; j++)
{
if(j==0)
{
y[j] = f[j]/(float)l[j];
}
else
{
y[j] = (f[j]-a[j-1]*y[j-1])/(float)l[j];
return 0;
}
printf("请依次输入主对角线元素,中间以空格或回车隔开:\n");
for(int i=0; i<n; i++)
{
scanf("%lf",&b[i]);
}
printf("请依次输入上次对角线元素,中间以空格或回车隔开:\n");
for(i=0; i<n-1; i++)
{
printf("x%d的值为",j+1);
printf("%lf\n",x[j]);
}
printf("是否继续下一个三对角方程组的计算? 输入‘Y’继续\n");
}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
追赶法求解三对角方程组
要求:对于给定的三对角系数矩阵和右端项,可以求
解线性代数方程组
一、 追赶法的数学理论
设系数矩阵为三对角矩阵
112223311100000000
000000
n n n n
n b c a b c a b A a b c a b ---⎛⎫ ⎪ ⎪ ⎪=
⎪ ⎪ ⎪
⎪ ⎪⎝
⎭
则方程组Ax=f 称为三对角方程组。
设矩阵A 非奇异,A 有Crout 分解A=LU ,其中L 为下三角矩阵,U 为单位上三角矩阵,记
1
122
233
1
10
00010
000
0001000
000100,00000000
00
0001n n n
n b L U γαβγββγβ--⎛⎫⎛⎫ ⎪
⎪ ⎪ ⎪ ⎪ ⎪∂==
⎪
⎪ ⎪
⎪ ⎪ ⎪
⎪ ⎪ ⎪ ⎪∂⎝
⎭
⎝
⎭
可先依次求出L ,U 中的元素后,令Ux=y ,先求解下三角方程组Ly=f 得出y ,再求解上三角方程组Ux=y 。
事实上,求解三对角方程组的2追赶法将矩阵三角分解的计算与求解两个三角方程组的计算放在一起,使算法更为紧凑。
其计算公式为:
1111,
1111
,111
,2,3,,,1,2,,1i
i i i i i i i i
i i i i i n n
i i i i c f b y i n c a b a f y y x y i n n x y x βγββαβγγβαβγ--+⎧===⎪⎪
=⎪⎪
⎪==-=
⎪⎪⎨
-⎪=⎪⎪
=⎪⎪=--⎪=-⎪⎩对对(*)
二、 追赶法的算法和流程图
1.预处理
生成方程组的系数i u 及其除数i d ,事实上,按式(*)可交替生成i d 与i u :
1d →1u →2d →…→1-n u →n d
其计算公式为
⎪⎩⎪
⎨⎧-=-===+++1,...,2,1,
,/c u b 111
i i 11n i u a b d d d i i i i i 2.追的过程
顺序生成方程组右端:
i y →2y →…→n y
据式(*)的计算公式为
n i d y a f y d f y i i i i i ,...,3,2,
/)(/1111=⎩⎨
⎧
-==-
逆序得出方程组的解i x :
n x →1-n x →…→1x
其计算公式按式为
1,2,1,1,⋯--=⎩⎨
⎧
-==+n n i x u y x y x i i i i
n n 三、 追赶法的Matlab 实现
function x=chase(a,b,c,f)
%求解线性方程组Ax=f,其中A 是三对角阵 %a 是矩阵A 的下对角线元素a(1)=0 %b 是矩阵A 的对角线元素
%c 是矩阵A 的上对角线元素c(N)=0 %f 是方程组的右端向量 N=length(f);
x=zeros(1,N);y=zeros(1,N); d=zeros(1,N);u= zeros(1,N); %预处理 d(1)=b(1); for i=1:N-1
u(i)=c(i)/d(i);
d(i+1)=b(i+1)-a(i+1)*u(i); end
y(1)=f(1)/d(1); for i=2:N
y(i)=(f(i)-a(i)*y(i-1))/d(i); end %赶的过程 x(N)=y(N); for i=N-1:-1:1
x(i)=y(i)-u(i)*x(i+1); end
四、 追赶法的算例实现
算例 用追赶法求解方程组⎥
⎥⎥⎥
⎦
⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢
⎢⎣⎡1016432153-1-21-2-31-1-2x x x x 解答
令a=[0,-1,-1,-3]; b=[2,3,2,5]; c=[-1,-2,-1,0]; f=[6,1,0,1];
在命令窗口运行语句 x=chase(a,b,c,f) 得结果为 x=
5 4 3 2。