直接法解线性方程组 高斯(guass)与追赶法

合集下载

解线性方程组的直接方法

解线性方程组的直接方法

解线性方程组的直接方法一、高斯消元法高斯消元法是解线性方程组最常用的方法之一、它通过一系列的消元操作,将线性方程组转化为阶梯型方程组,从而求解未知数的值。

1.确定线性方程组的阶数和未知数的个数。

设线性方程组中有n个未知数。

2.将线性方程组写成增广矩阵的形式。

增广矩阵是一个n行n+1列的矩阵,其中前n列是线性方程组的系数矩阵,第n+1列是等号右边的常数。

3.通过初等行变换(交换行、数乘行、行加行)将增广矩阵化为阶梯型矩阵。

具体步骤如下:a.首先,找到第一个非零元素所在的列,将它所在的行视为第一行。

b.将第一行的第一个非零元素(主元)变成1,称为主元素。

c.将主元所在列的其他元素(次元素)变为0,使得主元所在列的其他元素只有主元素是非零的。

d.再找到第一个非零元素所在的列,将它所在的行视为第二行,并重复上述步骤,直到将增广矩阵化为阶梯型矩阵。

4.根据阶梯型矩阵求解未知数的值。

具体步骤如下:a.从最后一行开始,依次求解每个未知数。

首先,将最后一行中非零元素所在的列作为含有该未知数的方程,将该未知数的系数设为1b.将含有该未知数的方程中其他未知数的系数设为0,并对其他方程进行相应的变换,使得该未知数所在列的其他元素都为0。

c.重复上述步骤,直到求解出所有未知数的值。

高斯消元法的优点是简单易懂、容易实现,但当线性方程组的系数矩阵接近奇异矩阵时,计算精度可能会降低。

二、矩阵求逆法矩阵求逆法是解线性方程组的另一种直接方法。

它通过对系数矩阵求逆,然后与常数矩阵相乘,得到未知数的值。

1.确定线性方程组的阶数和未知数的个数。

设线性方程组中有n个未知数。

2.将线性方程组写成矩阵方程的形式,即Ax=b,其中A是一个n阶方阵,x和b分别是n维列向量。

3.求系数矩阵A的逆矩阵A^-1a. 首先,计算系数矩阵A的行列式det(A)。

b. 判断det(A)是否为0,如果det(A)=0,则该线性方程组无解或有无穷多解;如果det(A)≠0,则系数矩阵A可逆。

线性方程组的求解方法

线性方程组的求解方法

线性方程组的求解方法线性方程组求解是数学中非常重要的一部分,它用于模拟现实世界中存在的很多问题。

线性方程组可以描述很多不同的系统,例如电路、化学反应、经济问题等等。

直接求解线性方程组并不困难,但是随着方程的数量增加,计算的难度和时间也会增涨。

因此,寻找有效的方法来求解线性方程组是非常重要的。

在本文中,我们将学习几种不同的线性方程组求解方法。

1. 高斯消元法高斯消元法是最基本的求解线性方程组的方法之一。

它的基本思想是利用不同的线性组合把方程组中的未知数消去,从而化简为一个简单的三角形式。

例如,需要求解以下方程组:x + y + z = 62x + 5y – z = 42x + 3y + 8z = 27通过高斯消元法,我们可以将方程组化简为以下形式:x + y + z = 60.5y – 1.5z = 10 + 0.5z = 3由此我们可以得到z=6,再代入上一步的式子求y,最后得到x 的值。

虽然该方法简单,但是对于规模较大的方程组,计算的复杂性会显著增加。

2. 克拉默法克拉默法是一种求解线性方程组的方法,适用于方程组的系数矩阵可逆的情况。

该方法通过求解每个未知数的行列式来求得方程组的解。

例如,需要求解以下方程组:x + y = 52x – 3y = 1使用克拉默法可得:x = (5 × (-3) – 1 × (–1)) / (1 × (-3) – 2 × 1) = -17/5y = (1 × 1 – 5 × 2) / (1 × -3 – 2 × 1) = -3/5虽然该方法可以精确地求解线性方程组,但是它的计算复杂度和计算时间都很高。

3. LU分解法LU分解法是将线性方程组的系数矩阵分解为下三角矩阵L和上三角矩阵U的乘积,以此来求解方程组。

该方法可以大大简化计算的复杂度,特别是在需要多次求解同一组系数矩阵的情况下。

例如,需要求解以下方程组:2x + y + z = 8-3x - 4y + z = -16-2x + y + 2z = -6使用LU分解法可将系数矩阵分解为以下两个矩阵:L =1 0 0-1.5 1 0-1 1 -1U =2 1 10.5 -5/3 2/30 0 -1然后将矩阵相乘,就可以解出方程组的解。

线性方程组的几种求解方法

线性方程组的几种求解方法

线性方程组的几种求解方法1.高斯消元法高斯消元法是求解线性方程组的一种常用方法。

该方法的基本思想是通过对方程组进行一系列简化操作,使得方程组的解易于求得。

首先将方程组表示为增广矩阵,然后通过一系列的行变换将增广矩阵化为行简化阶梯形,最后通过回代求解出方程组的解。

2.列主元高斯消元法列主元高斯消元法是在高斯消元法的基础上进行改进的方法。

在该方法中,每次选取主元时不再仅仅选择当前列的第一个非零元素,而是从当前列中选取绝对值最大的元素作为主元。

通过选取列主元,可以避免数值稳定性问题,提高计算精度。

3.LU分解法LU分解法是一种将线性方程组的系数矩阵分解为一个下三角矩阵L 和一个上三角矩阵U的方法。

首先进行列主元高斯消元法得到行阶梯形矩阵,然后对行阶梯形矩阵进行进一步的操作,得到L和U。

最后通过回代求解出方程组的解。

4.追赶法(三角分解法)追赶法也称为三角分解法,适用于系数矩阵是对角占优的三对角矩阵的线性方程组。

追赶法是一种直接求解法,将系数矩阵分解为一个下三角矩阵L和一个上三角矩阵U,然后通过简单的代数运算即可求得方程组的解。

5.雅可比迭代法雅可比迭代法是一种迭代法,适用于对称正定矩阵的线性方程组。

该方法的基本思想是通过不断迭代求解出方程组的解。

首先将方程组表示为x=Bx+f的形式,然后通过迭代计算不断逼近x的解。

6.高斯-赛德尔迭代法高斯-赛德尔迭代法是雅可比迭代法的改进方法。

该方法在每一次迭代时,使用已经更新的解来计算新的解。

相比于雅可比迭代法,高斯-赛德尔迭代法的收敛速度更快。

7.松弛因子迭代法松弛因子迭代法是一种对高斯-赛德尔迭代法的改进方法。

该方法在每一次迭代时,通过引入松弛因子来调节新解与旧解之间的关系。

可以通过选择合适的松弛因子来加快迭代速度。

以上是一些常用的线性方程组求解方法,不同的方法适用于不同类型的线性方程组。

在实际应用中,根据问题的特点和要求选择合适的求解方法可以提高计算的效率和精度。

直接法解线性方程组 高斯(guass)与追赶法

直接法解线性方程组 高斯(guass)与追赶法

实验一 直接法解线性方程组一、实验目的掌握列选主元消去法与追赶法解线性方程组。

二、实验内容分别写出Guass 列选主元消去法与追赶法的算法,编写程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。

实验中以下列数据验证程序的正确性。

1、用Guass 列选主元消去法求解方程组 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--5.58.37.33.47.11.85.16.93.51.53.25.2321x x x2、用追赶法求解方程组 ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-----000010210210000210000210000254321x x x x x三、实验仪器设备与材料主流微型计算机四、实验原理1、Guass 列选主元消去法 对于AX =B1)、消元过程:将(A|B )进行变换为)~|~(B A ,其中A ~是上三角矩阵。

即:⎪⎪⎪⎪⎪⎭⎫⎝⎛→⎪⎪⎪⎪⎪⎭⎫ ⎝⎛n nnn n n nnn n n n b a b a b a a b a a a b a a a b a a a010122111221222221111211k 从1到n-1 a 、 列选主元选取第k 列中绝对值最大元素ik ni k a ≤≤max 作为主元。

b 、 换行ik ij kj b b n k j a a ⇔+=⇔,,1,c 、 归一化 kkk k kj kk kj b a b n k j a a a ⇒+=⇒/,,1,/d 、 消元nk i b b a b n k j n k i a a a a i k ik i ij kj ik ij ,,1,,,1;,,1, +=⇒-+=+=⇒-2)、回代过程:由)~|~(B A 解出11,,,x x x n n -。

1,2,,1,/1-=⇒-⇒∑+=n k x x ab x a b k nk j j kjk nnn n2、追赶法 线性方程组为: ⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-----n n n n n nn n n f f f f f x x x x x a b c a b c a b c a b c a 132********33322211做LU 分解为: ⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=-1111,12133221n n nR L βββαγαγαγα分解公式:⎪⎪⎪⎩⎪⎪⎪⎨⎧-===-====-)1,,2,1(),,3,2(,),,3,2(111n i c n i b b n i a i i i i i i i i i αββγααγ 则⎩⎨⎧==⇒=⇒=y Ux fLy f LUx f Ax 回代公式: ⎪⎪⎩⎪⎪⎨⎧=-==-),,3,2(1111n i y f y f y i i i i i αγα⎩⎨⎧--=-==+)1,,2,1(1n n i x y x y x i i i i n n β五、实验步骤1、理解并掌握列选主元消去法与追赶法;2、画出列选主元消去法与追赶法的流程图3、使用VC 语言编写出相应的程序并调试验证通过1.高斯消元核心代码:void guass(double a[],int n,double b[],double x[]) { int i,j,m;double s;for(i=1,j=0;i<n;i++,j++) { for(m=i;m<n;m++){ s=a[j*n+j]/a[m*n+j]; //printf("%f ",s); //printf("\n");for(int k=j;k<n;k++) { a[m*n+k]=a[m*n+k]*s-a[(i-1)*n+k];}b[m]=b[m]*s-b[i-1];}}for(i=n-1;i>-1;i--){if(i==n-1)x[i]=b[i]/a[i*n+i];else{s=b[i];for(j=1;j<n-i;j++){s=s-a[i*n+n-j]*x[n-j];}x[i]=s/a[i*n+i];}}}运行结果如下:2.追赶法核心代码:void chase(float a[],int n,float l[],float u[]){int i;for(i=1;i<=n-1;i++){l[i*n+i-1]=a[i*n+i-1];if(i==1)l[0]=a[0];elsel[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];u[(i-1)*n+i-1]=1;u[(i-1)*n+i]=a[(i-1)*n+i]/l[(i-1)*n+i-1];}l[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];u[(i-1)*n+i-1]=1;}void solve(int n,float l[],float u[],float f[]){float y[4],x[4];for(int i=1;i<=n;i++){if(i==1)y[i-1]=f[0]/l[0];elsey[i-1]=(f[i-1]-l[(i-1)*n+i-2]*y[i-2])/l[(i-1)*n+i-1];}for(i=n;i>0;i--){if(i==n)x[i-1]=y[i-1];elsex[i-1]=y[i-1]-x[i]*u[(i-1)*n+i];}for(i=0;i<n;i++)printf("%f ",x[i]);}运行结果:七、实验注意事项注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。

线性方程组求解方法

线性方程组求解方法

线性方程组求解方法a1x1 + a2x2 + a3x3 + ... + anxn = b其中,a1、a2、a3、..、an为已知常数,b为已知常数或未知数,x1、x2、x3、..、xn为未知数。

求解线性方程组的方法有很多种,下面将介绍几种常见的方法。

1.直接代入法:直接代入法是最简单的求解线性方程组的方法之一、对于一个线性方程组,选择一个方程,解出一个未知数,然后将该解代入其他方程中,依次求解出其他未知数,最后验证是否满足所有方程。

2.消元法:消元法是求解线性方程组的一种常用方法,它通过对方程进行变换,将方程组简化为较简单的等价方程组。

可以分为高斯消元法和高斯-约当消元法两种。

-高斯消元法:高斯消元法是将线性方程组转化为上三角形方程组的一种方法,具体步骤如下:(1)将方程组排列成增广矩阵的形式;(2)选择一个方程,将其系数除以该方程的首个非零系数,以确保方程组的首个系数为1;(3)用该方程的倍数加到其他方程上,将其他方程的首个系数变为0;(4)重复上述步骤,直到得到上三角形方程组;(5)通过回代求解未知数的值。

-高斯-约当消元法:高斯-约当消元法是扩展了高斯消元法,可以将线性方程组转化为最简形式的一种方法,具体步骤如下:(1)将方程组排列成增广矩阵的形式;(2)取矩阵的第一个元素为主元,在主元所在的列中找到绝对值最大的元素,将其移动到主元的位置;(3)利用主元的倍数加到其他行,使得主元所在列的其他元素都变为0;(4)重复上述步骤,直到找到主元;(5)利用回代求解未知数的值。

3.矩阵法:矩阵法是利用矩阵来求解线性方程组的一种方法。

线性方程组可以表示为AX=B的形式,其中A为系数矩阵,X为未知数矩阵,B为常数矩阵。

通过对系数矩阵进行逆矩阵操作,可以得到未知数矩阵的解。

4.克莱姆法则:克莱姆法则是一种用于求解n元线性方程组的方法,如果方程组的系数矩阵A满足行列式,A,不等于零,则可以使用克莱姆法则求解。

追赶法,高斯消元法,逆矩阵法,迭代法——解线性方程组精仪学院马金玉

追赶法,高斯消元法,逆矩阵法,迭代法——解线性方程组精仪学院马金玉

追赶法,高斯消元法,逆矩阵法,迭代法 —— 解线性方程组精仪学院 马金玉 1012202030本文主要详细介绍了追赶法,高斯法,逆矩阵法的方法原理,运用这三种方法分别进行线性方程的求解举例,给出MATLAB 相应程序,最后做结果分析,比较说明追赶法和高斯法的特点。

最后对三种典型迭代方法Jacobi 迭代,Gauss-Seidel 迭代,SOR 迭代进行简单的分析比较。

1. 追赶法1.1).追赶法方法介绍追赶法用于求解以下形式的方程组(三对角方程组)d Ax =其中 1[,,]T n d d =d ,系数矩阵(三对角矩阵)11222111n n n n n b c a bc a b c a b ---⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦A系数矩阵A 的元素满足1100 0 (2,,1)0i i i i i n n b c b a c a c i n b a ⎧>>⎪≥+>≠=-⎨⎪>>⎩第一步:实现A=LU 的分解,按照递推公式1111//()i i i i i c b c b a βββ-=⎧⎨=-⎩ 计算 123,,...........βββ:第二步:求解方程组LY=f,相应的递推公式 11111/()/()i i i i i i i y f b y f a y b a β--=⎧⎨=--⎩ 第三部:求解方程组UX=Y ,相应的递推公式1()n nii i i x y x y x β-=⎧⎨=-⎩ 求得x因为计算1231......n ββββ-→→→→ 及 1231......n y y y y -→→→→的过程是追赶的过程,结出结果X 。

1.2).追赶法解线性方程组的matlab实例解线性方程组第一步:编写M文件如下:function [x,y,beta]=zhuiganfa(a,b,c,f)%a,b,c是三对角阵的对角线上的元素,f是自由项.n=length(b);beta(1)=c(1)/b(1);for i=2:nbeta(i)=c(i)/(b(i)-a(i)*beta(i-1));endy(1)=f(1)/b(1);for i=2:ny(i)=(f(i)-a(i)*y(i-1))/(b(i)-a(i)*beta(i-1));endx(n)=y(n);for i=n-1:-1:1x(i)=y(i)-beta(i)*x(i+1);enddisp(sprintf('k x(k) y(k) beta(k)')); for i=0:n-1disp(sprintf('%d %15.4f %15.4f %15.4f',i,x(i+1),y(i+1),beta(i+1))); end追赶法M文件程序截图如图1所示图1 追赶法M文件程序截图第二步:根据所求方程,在命令窗口中输入如下命令,并按ENTER 键确认。

线性方程组的解法线性方程组

线性方程组的解法线性方程组

线性方程组的解法线性方程组线性方程组是数学中常见的一种方程形式,它由多个线性方程联立而成。

解线性方程组是在给定一组方程的条件下,求出符合这些方程的未知数的取值,从而满足方程组的所有方程。

本文将介绍线性方程组的解法和应用。

一、高斯消元法高斯消元法是解线性方程组的一种常用方法。

它通过一系列行变换将线性方程组转化为简化的行阶梯形矩阵,然后通过回代求解得到方程组的解。

具体步骤如下:1. 将线性方程组写成增广矩阵的形式,其中未知数的系数和常数项构成矩阵的左右两部分。

2. 选取一个主元(即系数不为零的元素)作为基准行,并通过行变换使得该元素为1,同时消去其他行中该列的元素。

3. 重复上述步骤,将矩阵转化为行阶梯形式,即每一行的主元都在前一行主元的右下方。

4. 进行回代,从最后一行开始,逐步求解方程组的未知数。

高斯消元法能够解决大部分线性方程组,但对于某些特殊情况,例如存在无穷解或无解的方程组,需要进行额外的判断和处理。

二、矩阵求逆法矩阵求逆法是另一种解线性方程组的方法。

它通过求解方程组的系数矩阵的逆矩阵,再与常数项的矩阵相乘,得到未知数的解向量。

具体步骤如下:1. 如果线性方程组的系数矩阵存在逆矩阵,即矩阵可逆,那么方程组有唯一解。

2. 计算系数矩阵的逆矩阵。

3. 将逆矩阵与常数项的矩阵相乘,得到未知数的解向量。

需要注意的是,矩阵求逆法只适用于方程组的系数矩阵可逆的情况,对于不可逆的方程组,则无解或者存在无穷解。

三、克拉默法则克拉默法则适用于n个未知数、n个方程的线性方程组。

它利用行列式的性质来求解未知数。

具体步骤如下:1. 构建系数矩阵和常数项的矩阵。

2. 计算系数矩阵的行列式,即主对角线上各元素的乘积减去副对角线上各元素的乘积。

3. 分别用求解一个未知数时的系数矩阵替代系数矩阵中对应列的元素,再计算新矩阵的行列式。

4. 将每个未知数的解依次计算出来。

克拉默法则的优点是理论简单,易于理解,但随着未知数和方程数的增加,计算复杂度呈指数增长,计算效率较低。

数值分析列主元高斯消去顺序高斯平方根法追赶法

数值分析列主元高斯消去顺序高斯平方根法追赶法

课题名称:课题一解线性方程组的直接方法解决的问题:给定三个不同类型的线性方程组,用适当的直接法求解。

采用的数值方法:对第一个普通的线性方程组,采用了高斯顺序消去法和高斯列主元消去法。

对第二个正定线性方程组,采用了平方根法。

对第三个三对角线性方程组,采用了追赶法。

算法程序:(1)普通的线性方程组①顺序消去法#include<stdio.h>#include<math.h>int main(void){float A[10][10]= {{4,2,-3,-1,2,1,0,0,0,0},{8,6,-5,-3,6,5,0,1,0,0},{4,2,-2,-1,3,2,-1,0,3,1},{0,-2,1,5,-1,3,-1,1,9,4},{-4,2,6,-1,6,7,-3,3,2,3},{8,6,-8,5,7,17,2,6,-3,5},{0,2,-1,3,-4,2,5,3,0,1},{16,10,-11,-9,17,34,2,-1,2,2},{4,6,2,-7,13,9,2,0,12,4},{0,0,-1,8,-3,-24,-8,6,3,-1}};float b[10]= {5,12,3,2,3,46,13,38,19,-21}; float x[10]= {0};float Aik,S,temp;int i,j,k;int size=10;for(k=0; k<size-1; k++){if(!A[k][k])return -1;for(i=k+1; i<size; i++){Aik=A[i][k]/A[k][k];for(j=k; j<size; j++){A[i][j]=A[i][j]-Aik*A[k][j]; }b[i]=b[i]-Aik*b[k];}}printf("A[]\n");for(i=0; i<size; i++){for(j=0; j<size; j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0; i<size; i++)printf("%f ",b[i]);printf("\n\n");x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2; k>=0; k--){S=b[k];for(j=k+1; j<size; j++){S=S-A[k][j]*x[j];}x[k]=S/A[k][k];}printf("x[]=\n");for(i=0; i<size; i++)printf("%f ",x[i]);return 0;}②列主元消去法#include<stdio.h>#include<math.h>int main(void){float A[10][10]= {{4,2,-3,-1,2,1,0,0,0,0}, {8,6,-5,-3,6,5,0,1,0,0},{4,2,-2,-1,3,2,-1,0,3,1},{0,-2,1,5,-1,3,-1,1,9,4},{-4,2,6,-1,6,7,-3,3,2,3},{8,6,-8,5,7,17,2,6,-3,5},{0,2,-1,3,-4,2,5,3,0,1},{16,10,-11,-9,17,34,2,-1,2,2},{4,6,2,-7,13,9,2,0,12,4},{0,0,-1,8,-3,-24,-8,6,3,-1}};float b[10]= {5,12,3,2,3,46,13,38,19,-21}; float x[10]= {0};float Aik,S,temp;int i,j,k;float max;int col;int size=10;for(k=0; k<size-1; k++){max=fabs(A[k][k]);col=k;for(i=k; i<size; i++){if(max<fabs(A[i][k])) {max=fabs(A[i][k]); col=i;}}for(j=k; j<size; j++){temp=A[col][j];A[col][j]=A[k][j];A[k][j]=temp;}temp=b[col];b[col]=b[k];b[k]=temp;if(!A[k][k])return -1;for(i=k+1; i<size; i++){Aik=A[i][k]/A[k][k]; for(j=k; j<size; j++){A[i][j]=A[i][j]-Aik*A[k][j]; }b[i]=b[i]-Aik*b[k];}}printf("A[]\n");for(i=0; i<size; i++){for(j=0; j<size; j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0; i<size; i++)printf("%f ",b[i]);printf("\n\n");x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2; k>=0; k--){S=b[k];for(j=k+1; j<size; j++){S=S-A[k][j]*x[j]; }x[k]=S/A[k][k];}printf("x[]=\n");for(i=0; i<size; i++)printf("%f ",x[i]);return 0;}(2)对称正定线性方程组平方根法:#include <stdio.h>#include <math.h>#define n 8int main(void){float A[8][8]={{4,2,-4,0,2,4,0,0},{2,2,-1,-2,1,3,2,0},{-4,-1,14,1,-8,-3,5,6},{0,-2,1,6,-1,-4,-3,3},{2,1,-8,-1,22,4,-10,-3},{4,3,-3,-4,4,11,1,-4},{0,2,5,-3,-10,1,14,2},{0,0,6,3,-3,-4,2,19}};float g[8][8]= {0};float b[8]= {0,-6,6,23,11,-22,-15,45}; float x[8]= {0};float y[8]= {0};int k,m,i,sq;for(k=0; k<n; k++){float p=0,q=0,s=0;for(m=0; m<=k-1; m++){p=p+A[k][m]*A[k][m];}g[k][k]=sqrt(A[k][k]-p);A[k][k]=g[k][k];for(i=k+1; i<n; i++){q=0;for(m=0; m<=k-1; m++){q=q+A[i][m]*A[k][m];}g[i][k]=(A[i][k]-q)/A[k][k]; A[i][k]=g[i][k];}s=0;for(m=0; m<=k-1; m++){s=s+A[k][m]*y[m];}y[k]=(b[k]-s)/A[k][k];}x[n-1]=y[n-1]/A[n-1][n-1];for(k=n-2; k>=0; k--){float sum=0;for(m=k+1; m<n; m++){sum=sum+A[m][k]*x[m];}x[k]=(y[k]-sum)/A[k][k];}for(sq=0; sq<n; sq++){printf("%f ",x[sq]);}return 0;}(3)三对角线性方程组追赶法#include <stdio.h>#include <math.h>#define n 10int main(void){float a[10]={4,4,4,4,4,4,4,4,4,4};float c[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};float d[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1}; float b[10]={7,5,-13,2,6,-12,14,-4,5,-5}; float x[10]={0};float y[10]={0};float arf[10]={0};float bt[9]={0};arf[0]=a[0];int i;for(i=0;i<n-1;i++){bt[i]=c[i]/arf[i];arf[i+1]=a[i+1]-d[i+1]*bt[i];//printf("%f %f \n",bt[i],arf[i+1]); }y[0]=b[0]/arf[0];//printf("%f\n",y[0]);for(i=1;i<n;i++){y[i]=(b[i]-d[i]*y[i-1])/arf[i];}//printf("%f\n",y[1]);x[n-1]=y[n-1];for(i=n-2;i>=0;i--){x[i]=y[i]-bt[i]*x[i+1]; }for(i=0;i<n;i++)printf("%lf ",x[i]);return 0;}数值结果:(1) 普通的线性方程组①顺序消去法②列主元消去法(2) 对称正定线性方程组平方根法:(3)三对角线性方程组追赶法:对实验计算结果的讨论和分析:(1) 普通的线性方程组①顺序消去法x1~x10的绝对误差:0.000001,-0.000001,0.000001,0,0.000001,0,0.000002,0,0,0x1~x10的相对误差:0.000001,0.000001,-1,0,0.0000005,0,0.00000067,0,0,0误差很小,基本可以忽略。

数值计算基础Gauss列选主元消去法及追赶法

数值计算基础Gauss列选主元消去法及追赶法

1、用Guass列选主元消去法求解方程组源程序代码:#include<stdio.h>#include<stdlib.h>#include<math.h>#define MAX_n 100#define PRECISION 0.0000001void MatrixInput(float A[][MAX_n],int m,int n)//输入数组{int i,j;float ftmp;printf("\n===Begin input Matrix elements===\n");for(i=1;i<=m;++i){printf("Input_Line %d : ",i);for(j=1;j<=n;++j){scanf("%f",&ftmp);A[i][j]=ftmp;}}}void MatrixOneColumnOutput(float A[][MAX_n],int n,int k)//输出方程的解{int i;for(i=1;i<=n;++i)printf("\nx[%d]=%f",i,A[i][k]);}int UpTriangle(float U[][MAX_n],int n)//解上三角方程组{int i,j;for(i=n;i>0;--i){if(fabs(U[i][i])<PRECISION)return 1;for(j=i+1;j<=n;++j)U[i][n+1]-=U[i][j]*U[j][n+1];U[i][n+1]/=U[i][i];}return 0;}void Swap(float *a,float *b)//a,b二个变量中的值交换{float ftmp;ftmp=*a;*a=*b;*b=ftmp;}int GaussElimination_column_select(float A[][MAX_n],int n)//选主元{ int i,j,k;float fTmp;for(i=1;i<n;++i){ //找主元所在行for(k=i,j=i+1;j<=n;++j)if(fabs(A[j][i])>fabs(A[k][i])) k=j;//二行交换for(j=i;j<=n+1;++j)Swap(&A[i][j],&A[k][j]);//消元if(fabs(A[i][i])<PRECISION)return 1;for(j=i+1;j<=n;++j)for(k=i+1;k<=n+1;++k)A[j][k]-=A[i][k]*A[j][i]/A[i][i];}UpTriangle(A,n);return 0;}void main(){int n;float A[MAX_n][MAX_n];printf("Input n=");scanf("%d",&n);if(n>=MAX_n-1){printf("\an must <%d!\n",MAX_n);exit(0);}MatrixInput(A,n,n+1);if(GaussElimination_column_select(A,n)) printf("\nGauss Failed!");else{printf("\nOutput Solution:");MatrixOneColumnOutput(A,n,n+1);printf("\n\n");}}运行结果:2、用追赶法求解方程组#include<stdio.h>#include<math.h>double ZhuiGanFa(double a[],double b[],double c[],double d[],int n); void main(){int n,i;double a[10],b[10],c[10],d[10];printf("Input n value:");/*表示n维向量*/scanf("%d",&n);printf("\n");printf("Now input the (a_i),i=1,2,…,%d: ",n-1);for(i=0;i<=n-2;i++)scanf("%lf",&a[i]);printf("Now input the (b_i),i=1,2,…,%d: ",n);for(i=0;i<=n-1;i++)scanf("%lf",&b[i]);printf("Now input the (c_i),i=1,2,…,%d: ",n-1);for(i=0;i<=n-2;i++)scanf("%lf",&c[i]);printf("Now input the (d_i),i=1,2,…,%d: ",n);for(i=0;i<=n-1;i++)scanf("%lf",&d[i]);ZhuiGanFa(a,b,c,d,n);}double ZhuiGanFa(double a[],double b[],double c[],double d[],int n) {int i;double t;if(fabs(b[0])<=fabs(c[0])||fabs(c[0])<=0||fabs(b[n-1])<fabs(a[n-2])||fabs(a[n-2])<=0)/*判断是否符合追赶法条件*/{printf("fail\n");return 0;}for(i=1;i<=n-2;i++){if(fabs(b[i])<(fabs(a[i])+fabs(c[i]))||a[i]*c[i]==0){printf("fail\n");return 0;}}c[0]=c[0]/b[0];d[0]=d[0]/b[0];for(i=1;i<=n-2;i++){t=b[i]-a[i-1]*c[i-1];c[i]=c[i]/t;d[i]=(d[i]-a[i-1]*d[i-1])/t;}d[n-1]=(d[n-1]-a[n-2]*d[n-2])/(b[n-1]-a[n-2]*c[n-2]);for(i=n-2;i>=0;i--)d[i]=d[i]-c[i]*d[i+1];printf("\n");for(i=0;i<=n-1;i++)printf("x(%d)=%f\n",i,d[i]);printf("\n");return 1;}运行结果1:运行结果2:。

线性方程组的直接解法

线性方程组的直接解法

线性方程组的直接解法
线性方程组(linear equation system)是一类几何问题,也是解决线性系统和代数问题的重要方法,线性方程组由多个联立方程组成,这些方程中也可能含有未知量。

直接解法是把数学模型转换为数值模型,并给出实现其解题步骤的算法,它不同于间接求解的方法,既不做任何假设,也不处理不确定性问题,只是简单地直接求解线性方程组。

解线性方程组的直接解法主要分为三种,分别是高斯消元法、列主元消去法和列坐标变换法。

高斯消元法是一种比较常用的方法,主要是把线性方程组的未知量从左到右一步步求出来,其中用到的主要技术是把矩阵中部分元素消去为零,以便求解不定线性方程组的未知量。

而列主元消去法则是以一列为主元,去消除其他联立方程中出现的此列中的变量,从而最终求出其他未知变量的值。

最后,列坐标变换法是将线性方程组转换为一个更有利于求解的矩阵,其中未知量可以直接求得解答。

除了这三种常见方法外,还有一些更特殊的直接解法,比如要解常微分方程的未知函数,可以用拉格朗日方法和分部积分方法,再比如求解雅各比方程的根,可以通过主副方程互解求解,这种方法也叫作特征根法。

综上,解线性方程组的直接解法有高斯消元法、列主元消去法、列坐标变换法等;特殊问题可以采用拉格朗日方法、分部积
分法和特征根法等。

每种方法都有自己的优势,因此在使用时,可以根据问题的特点,选择适合的方法来解决。

用追赶法解方程组步骤

用追赶法解方程组步骤

用追赶法解方程组步骤用追赶法解方程组的步骤追赶法是一种常用于解线性方程组的方法,也被称为托马斯算法。

它适用于系数矩阵为三对角矩阵的方程组,即只有主对角线和两个相邻的副对角线上有非零元素的方程组。

下面将介绍用追赶法解方程组的具体步骤。

1. 确定方程组的形式我们需要将线性方程组转化为矩阵形式,即AX=B,其中A是系数矩阵,X是未知数向量,B是常数向量。

在追赶法中,系数矩阵A 应为三对角矩阵。

2. 分解系数矩阵接下来,我们需要对系数矩阵A进行分解。

将系数矩阵A分解为L、D、U三个矩阵的乘积,即A=LDU分解。

其中L是下三角矩阵,D 是对角矩阵,U是上三角矩阵。

分解的目的是简化方程组的求解过程。

3. 前向追赶在前向追赶过程中,我们需要解决方程组LY=B,其中Y是辅助向量。

首先,我们可以从第一个方程开始,直接求解出Y的第一个分量。

然后,利用递推关系式,依次求解出Y的其他分量。

这个过程类似于追逐,从前往后一步步追赶。

4. 消元接下来,我们需要进行消元操作,将方程组转化为DUX=Y。

这个过程中,我们需要利用到前面分解得到的L、D和U矩阵。

通过将L矩阵与方程组相乘,可以消去X的前面分量。

然后,通过将D矩阵与方程组相乘,可以将X的分量消为1。

最后,通过将U矩阵与方程组相乘,可以将X的后面分量消去。

5. 后向追赶在后向追赶过程中,我们需要解决方程组UX=Y,即通过追逐的方式从后往前求解X的分量。

首先,我们可以从最后一个方程开始,直接求解出X的最后一个分量。

然后,利用递推关系式,依次求解出X的其他分量。

6. 检验解的正确性在求解完成后,我们需要检验解的正确性。

将求得的X代入原方程组中,验证方程组是否成立。

如果方程组成立,那么我们得到的解就是正确的。

总结:追赶法是一种有效解线性方程组的方法,它通过将系数矩阵分解为L、D、U三个矩阵,并利用前向追赶和后向追赶的方式求解未知数。

追赶法的优点是求解过程简单快速,适用于特定类型的方程组。

解线性方程组的直接法和迭代法

解线性方程组的直接法和迭代法

数值分析方法中方程求解的直接法和迭代法第3章 解线性方程组的直接法一、消元法1. 高斯消元法(加减消元):首先将A 化为上三角阵,再回代求解。

11121121222212n n n n nnn a a a b a a a b a a a b ⎛⎫⎪ ⎪⎪⎪⎝⎭ (1)(1)(1)(1)(1)11121311(2)(2)(2)(2)222322(3)(3)(3)3333()()00000n n nn n nnn a a a a b a a a b a a b a b ⎛⎫⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭步骤如下:第一步:1111,2,,i a i i n a -⨯+=第行第行11121121222212n n n n nnn a a a b a a a b a a a b ⎛⎫⎪ ⎪⎪⎪⎝⎭ 111211(2)(2)(2)2222(2)(2)(2)200n nn nnn a a a b a a b a a b ⎛⎫ ⎪ ⎪ ⎪ ⎪⎝⎭第二步:(2)2(2)222,3,,i a i i n a -⨯+=第行第行 111211(2)(2)(2)2222(2)(2)(2)200nnn nnn a a a b a a b a a b ⎛⎫⎪ ⎪ ⎪ ⎪⎝⎭11121311(2)(2)(2)(2)222322(3)(3)(3)3333(3)(3)(3)300000n n n n nn n a a a a b a a a b a a b a a b ⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭类似的做下去,我们有:第k 步:()()k ,1,,k ikk kka i i k n a -⨯+=+第行第行。

n -1步以后,我们可以得到变换后的矩阵为:11121311(2)(2)(2)(2)222322(3)(3)(3)3333()()00000n n nn n nnn a a a a b a a a b a a b a b ⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭注意到,计算过程中()k kk a 处在被除的位置,因此整个计算过程要保证它不为0。

第二章 解线性代数方程组的直接法(DOC)

第二章 解线性代数方程组的直接法(DOC)

第二章 解线性方程组的直接法本章研究的对象是n 阶线性方程组⎪⎪⎩⎪⎪⎨⎧=+++=+++=+++nn nn n n n n n n b x a x a x a b x a x a x a b x a x a x a .........22112222212111212111 (2.1)其矩阵形式为b AX = (2.1)′其中,)(ij a A =是方程组的系数矩阵,⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=n x x x X ...21,⎪⎪⎪⎪⎪⎭⎫⎝⎛=n b b b b ...21分别为方程组的未知向量和常数向量。

所谓直接法,就是在不计舍入误差时,经过有限步运算能求得方程组精确解的方法。

下面介绍几种较实用的直接法。

2.1 Gauss 消去法 2.1.1 Gauss 顺序消去法高斯(Gauss )消去法实质是消元法,只是步骤规范,便于编程。

它的基本做法是把方程组(2.1)转化成一个等价的三角方程组⎪⎪⎩⎪⎪⎨⎧==++=+++n n nn n n n n g x b g x b x b g x b x b x b 2222211212111 (2.2) 这个过程称为消元。

然后,逐个求出11,,,x x x n n -,这个过程称为回代。

(一) 高斯消去法的计算过程为了符号统一,把方程组(2.1)改写成下面形式⎪⎪⎩⎪⎪⎨⎧=+++=+++=+++)1()1(2)1(1)1()1()1(2)1(1)1()1()1(2)1(1)1( (212)22221111211n nn n n n n b x a x a x a b x a x a x a b x a x a x a n n n(2.3)用矩阵表示为)1()1(b X A = (2.3)′其中⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=)1()1(2)1(1)1(2)1(22)1(21)1(1)1(12)1(11)1(nn n n nn a a a a aa a aa A, ⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=)1()1()1()1(...21n b b b b 若0)1(11≠a ,用第二个方程减去第一个方程的)1(11)1(21/a a 倍,第三个方程减去第一个方程的)1(11)1(31/a a 倍,等等。

解线性方程组的直接方法

解线性方程组的直接方法

解线性方程组的直接方法一、高斯消元法高斯消元法是解线性方程组的一种常用且直接的方法。

它的基本思想是通过一系列的代数运算,将方程组化为一个三角方程组,然后从最后一行开始,逐步回代求解未知数。

下面以一个二元一次方程组为例,说明高斯消元法的具体步骤:例如,给定方程组:a₁₁x₁+a₁₂x₂=b₁a₂₁x₁+a₂₂x₂=b₂其中,a₁₁,a₁₂,a₂₁,a₂₂,b₁,b₂为已知系数。

1.检查a₁₁的值是否为0,若为0则交换第一行与非零行。

2.将第一行的每个元素除以a₁₁,使a₁₁成为13.将第一行乘以(-a₂₁)并加到第二行上,使第二行的第一个元素变为0。

4.引入一个新的未知数y₂=a₂₁x₁+a₂₂x₂,并代入第二行,化简方程组。

5.使用回代法求解方程组。

高斯消元法的优势在于其直接的解题思路和较高的计算精度,但是其缺点是计算复杂度较高,对于大规模的方程组不太适用。

二、逆矩阵法逆矩阵法是解线性方程组的另一种直接方法,它通过求解方程组的系数矩阵的逆矩阵,并将其与方程组的常数向量相乘,得到方程组的解向量。

下面以一个三元一次方程组为例,说明逆矩阵法的具体步骤:例如,给定方程组:a₁₁x₁+a₁₂x₂+a₁₃x₃=b₁a₂₁x₁+a₂₂x₂+a₂₃x₃=b₂a₃₁x₁+a₃₂x₂+a₃₃x₃=b₃其中,a₁₁,a₁₂,a₁₃,a₂₁,a₂₂,a₂₃,a₃₁,a₃₂,a₃₃,b₁,b₂,b₃为已知系数。

1.计算系数矩阵A的行列式D=,A。

2. 求解系数矩阵A的伴随矩阵Adj(A)。

3. 计算逆矩阵A⁻¹=Adj(A)/D。

4.将常数向量b用列向量表示。

5.计算解向量x=A⁻¹b。

逆矩阵法的优势在于其求解过程相对简单,计算量较小,并且不需要对系数矩阵进行消元操作。

但是逆矩阵法的限制在于当系数矩阵不可逆时无法使用。

三、克莱姆法则克莱姆法则是解线性方程组的另一种直接方法,它通过定义克莱姆行列式和克莱姆向量,利用行列式的性质求解方程组的解向量。

线性方程组的几种求解方法

线性方程组的几种求解方法

线性方程组的几种求解方法线性方程组是指由一系列线性方程组成的方程组。

求解线性方程组是在给定的约束条件下找到满足所有方程的解。

在数学和工程领域,线性方程组的求解是一项重要的任务,涉及到许多实际问题的建模和分析。

本文将介绍几种常见的线性方程组的求解方法。

1. 高斯消元法(Gaussian elimination)高斯消元法是求解线性方程组的最常用方法之一、它通过矩阵的初等行变换将线性方程组化简为阶梯形矩阵,然后通过回代求解未知数的值。

高斯消元法具有简单、直观的特点,适用于一般的线性方程组求解。

2. 列主元高斯消元法(Gaussian elimination with partial pivoting)列主元高斯消元法是高斯消元法的改进版本。

它在每一步选择主元时,选取列中绝对值最大的元素作为主元,以减小误差的传播。

这种方法可以提高数值稳定性,但相对于普通高斯消元法,计算量较大。

3. 克拉默法则(Cramer's rule)克拉默法则是一种用于求解线性方程组的代数方法。

它通过计算系数矩阵的行列式和各个未知数的代数余子式,得到每个未知数的值。

克拉默法则适用于方程组个数和未知数个数相等的情况,但由于计算行列式的复杂度高,不适用于大规模的线性方程组求解。

4. 矩阵分解法(Matrix factorization)矩阵分解法通过将系数矩阵分解为两个或多个特定形式的矩阵的乘积,从而简化线性方程组的求解。

常见的矩阵分解方法有LU分解、QR分解、Cholesky分解等。

矩阵分解法适用于大规模线性方程组的求解,具有高效、稳定的特点。

5. 迭代法(Iterative methods)迭代法是一种逐步逼近解的方法,通过迭代计算逐渐接近线性方程组的解。

常见的迭代法有雅可比迭代法、高斯-赛德尔迭代法和共轭梯度法等。

迭代法适用于大规模稀疏线性方程组的求解,具有快速收敛、节约存储空间的特点。

6. 特殊结构法(Special structure methods)对于具有特殊结构的线性方程组,可以利用其特殊性质设计相应的求解方法。

线性代数方程组求解直接方法

线性代数方程组求解直接方法
通过对方程组进行初等行变换,将方 程组化为上三角矩阵形式,然后回代 求解得到方程组的解。该方法具有简 单易懂的优点,但在处理大型方程组 时可能存在数值稳定性问题。
LU分解法
将系数矩阵分解为一个下三角矩阵L和 一个上三角矩阵U的乘积,然后通过求 解LY=b和UX=Y两个三角形方程组得到 原方程组的解。LU分解法具有较高的数 值稳定性,适用于中小型方程组。
根据系数矩阵的第一行和最后一行元素, 计算出初始参数。
2. 追赶过程
3. 回代过程
从第二行开始,逐行进行消元,将系数矩 阵转化为上双对角矩阵。
从最后一行开始,逐行回代求解,得到方程 组的解。
平方根法的基本原理与计算步骤
基本原理
1. Cholesky分解
2. 前代过程
3. 回代过程
平方根法是一种适用于对称正 定矩阵线性方程组的求解方法 ,通过Cholesky分解将系数矩 阵分解为下三角矩阵和其转置 的乘积,进而简化计算。
收敛速度
在适当的条件下,雅可比迭代法的收敛速度可能比一般的 迭代法更快。
计算复杂度
雅可比迭代法需要计算雅可比矩阵及其逆矩阵,因此计算 量相对较大;而一般的迭代法只需要进行矩阵与向量的乘 法运算,计算量相对较小。
稳定性
雅可比迭代法的稳定性较好,对初始近似解的要求较低; 而一般的迭代法可能对初始近似解的要求较高,否则可能 导致迭代序列发散。
对系数矩阵进行Cholesky分解 ,得到下三角矩阵L。
通过下三角矩阵L,求解出中间 向量y。
利用中间向量y和下三角矩阵L 的转置,求解出方程组的解。
追赶法与平方根法的比较
适用范围
追赶法适用于三对角矩阵线性方程组, 而平方根法适用于对称正定矩阵线性方

线性方程组的直接解法实验报告

线性方程组的直接解法实验报告

本科实验报告
课程名称:数值计算方法B
实验项目:线性方程组的直接解法
最小二乘拟合多项式
实验地点:ZSA401
专业班级:学号:201000
学生姓名:
指导教师:李志
2012年4月13日
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
printf("%lf\t",A[i][j]);
printf("\n");
}
double answer[N];
Gauss_eliminate(n,answer);
/*输出解*/
for(i=1;i<=n;i++)
printf("a[%d]=%lf\t",i-1,answer[i]);
getchar();
getchar();
}
四、实验结果与讨论、心得
讨论、心得:
刚开始调试代码的时候有时候就是很小的错误导致整个程序不能运行,需要我们一步一步慢慢来,经过无数次的检查程序错误的原因,以及在老师的帮助下,完成了这次实验。

这段时间的实验课提高了我的分析问题,解决问题的能力,特别提高了对一个程序的整。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一 直接法解线性方程组
一、实验目的
掌握列选主元消去法与追赶法解线性方程组。

二、实验内容
分别写出Guass 列选主元消去法与追赶法的算法,编写程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。

实验中以下列数据验证程序的正确性。

1、用Guass 列选主元消去法求解方程组 ⎥⎥⎥⎦⎤
⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--5.58
.37.33.47
.11
.85.16.93.51.53.25.2321x x x
2、用追赶法求解方程组 ⎥⎥
⎥⎥⎥⎥⎦⎤
⎢⎢⎢⎢⎢⎢⎣⎡-=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-----00001021
02100002100002100002
54321x x x x x
三、实验仪器设备与材料
主流微型计算机
四、实验原理
1、Guass 列选主元消去法 对于AX =B
1)、消元过程:将(A|B )进行变换为)~
|~
(B A ,其中A ~
是上三角矩阵。

即:
⎪⎪⎪⎪
⎪⎭


⎛→⎪⎪⎪⎪⎪⎭⎫ ⎝⎛n nn
n n n nn
n n n n b a b a b a a b a a a b a a a b a a a
010
12211122
1
222221111211
k 从1到n-1 a 、 列选主元
选取第k 列中绝对值最大元素ik n
i k a ≤≤max 作为主元。

b 、 换行
i
k ij kj b b n k j a a ⇔+=⇔,,1,
c 、 归一化 k
kk k kj kk kj b a b n k j a a a ⇒+=⇒/,,1,/
d 、 消元
n
k i b b a b n k j n k i a a a a i k ik i ij kj ik ij ,,1,,,1;,,1, +=⇒-+=+=⇒-
2)、回代过程:由)~
|~
(B A 解出11,,,x x x n n -。

1
,2,,1,/1
-=⇒-
⇒∑+=n k x x a
b x a b k n
k j j kj
k n
nn n
2、追赶法 线性方程组为: ⎪⎪
⎪⎪
⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝
⎛-----n n n n n n
n n n f f f f f x x x x x a b c a b c a b c a b c a 132********
333
22211
做LU 分解为: ⎪⎪⎪⎪⎪⎪⎪⎪⎭


⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫

⎛=-11
1
1,1
2133
221n n n
R L βββαγαγαγα
分解公式:
⎪⎪⎪⎩

⎪⎪⎨⎧
-===-====-)1,,2,1(),,3,2(,),,3,2(1
11n i c n i b b n i a i i i i i i i i i αββγααγ 则


⎧==⇒=⇒=y Ux f
Ly f LUx f Ax 回代公式: ⎪⎪⎩
⎪⎪⎨

=-==-)
,,3,2(1
111n i y f y f y i i i i i αγα
⎩⎨
⎧--=-==+)
1,,2,1(1
n n i x y x y x i i i i n n β
五、实验步骤
1、理解并掌握列选主元消去法与追赶法;
2、画出列选主元消去法与追赶法的流程图
3、使用VC 语言编写出相应的程序并调试验证通过
1.高斯消元核心代码:
void guass(double a[],int n,double b[],double x[]) { int i,j,m;
double s;
for(i=1,j=0;i<n;i++,j++) { for(m=i;m<n;m++){ s=a[j*n+j]/a[m*n+j]; //printf("%f ",s); //printf("\n");
for(int k=j;k<n;k++) { a[m*n+k]=a[m*n+k]*s-a[(i-1)*n+k];
}
b[m]=b[m]*s-b[i-1];
}
}
for(i=n-1;i>-1;i--)
{
if(i==n-1)
x[i]=b[i]/a[i*n+i];
else
{
s=b[i];
for(j=1;j<n-i;j++)
{
s=s-a[i*n+n-j]*x[n-j];
}
x[i]=s/a[i*n+i];
}
}
}
运行结果如下:
2.追赶法核心代码:
void chase(float a[],int n,float l[],float u[])
{
int i;
for(i=1;i<=n-1;i++)
{
l[i*n+i-1]=a[i*n+i-1];
if(i==1)
l[0]=a[0];
else
l[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];
u[(i-1)*n+i-1]=1;
u[(i-1)*n+i]=a[(i-1)*n+i]/l[(i-1)*n+i-1];
}
l[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];
u[(i-1)*n+i-1]=1;
}
void solve(int n,float l[],float u[],float f[])
{
float y[4],x[4];
for(int i=1;i<=n;i++)
{
if(i==1)
y[i-1]=f[0]/l[0];
else
y[i-1]=(f[i-1]-l[(i-1)*n+i-2]*y[i-2])/l[(i-1)*n+i-1];
}
for(i=n;i>0;i--)
{
if(i==n)
x[i-1]=y[i-1];
else
x[i-1]=y[i-1]-x[i]*u[(i-1)*n+i];
}
for(i=0;i<n;i++)
printf("%f ",x[i]);
}
运行结果:
七、实验注意事项
注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。

八、思考题
若使用全主元消去法,在编程中应如何记录保存对于未知数的调换。

相关文档
最新文档