22列主元消去法
- 格式:ppt
- 大小:380.50 KB
- 文档页数:8
重庆理工大学数学与统计学院数值分析课程设计成绩评定书设计题目:用列主元消去法和追赶法求解带有边值问题的线性方程组专业班学号学生姓名指导教师用列主元消去法和追赶法求解线性方程组摘要:根据高斯消去法的理论知识,通过MATLAB 工具编写函数,运用列主元消去法和追赶法来求解线性方程组。
在消元过程中可能出现)(a k kk0 的情况,这时就可以用列主元消去法来解决,它的特点是每次在系数矩阵中依次按列在主对角线及以下的元素中,选取绝对值最大的元素作为主元,将它调到主对角线上,然后用它消去主对角线以下的元素,最后化为同解的上三角形方程组去求解;而在实际问题中,如求解系数矩阵为对角占优的三对角线性方程组,用追赶法求解就显得更方便。
可以看出,两种方法对于求解线性方程组都具有可行性和准确性。
关键词:高斯消去法;列主元消去法;追赶法;MA TLAB一、问题提出. 考虑两点边值问题()()⎪⎩⎪⎨⎧==<<=+.11,00,10,22y y a a dx dy dx y d ε容易知道它的精确解为.1111ax e ea y x+⎪⎪⎭⎫⎝⎛---=--εε为了把微分方程离散,把[]1,0区间n 等分,令nh 1=,ih x i =,,1,,2,1-=n i 得到差分方程,21211a hy y hy y y ii i i i =-++-++-ε简化为()(),2211ah y y h y h i i i =++-+-+εεε从而离散后得到的线性方程组的系数矩阵为()()()()⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡+-++-++-++-=h h h hh hh A εεεεεεεεεε2222对1=ε,6.0=a ,100=n ,分别用列主元消去法和追赶法求解线性方程组,然后比较与精确解的误差,对结果进行分析。
改变n ,讨论同样问题。
二、问题求解2.1列主元消去法2.1.1方法思想高斯消去法是一个古老的求解线性方程组的方法,但它的改进、变形得到的主元素消去法仍然是计算机上常用的计算方法,高斯消元法的基本思想是:通过逐次消元将所给的线性方程组化为上三角形方程组,继而通过回代过程求解线性方程组。
课程设计任务书前 言回顾普通解方程组的方法,一般都是先逐个削去未知变量,最终得到只有一个未知变量的方程,解之,把得到的值回代到消去变量过程中得到的方程组,逐个求出未知变量。
这种解线性方程组的基本方法就是这里要介绍的高斯消去法。
数学上,高斯消元法(或译:高斯消去法),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。
当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。
高斯消元法可以用在电脑中来解决数千条等式及未知数。
高斯消元法可以用来找出一个可逆矩阵的逆矩阵。
用关联矩阵表述网络拓扑结构,并根据厂站拓扑结构和网络拓扑结构等概念简化了电力系统的拓扑结构。
根据广义乘法和广义加法的运算规则,将改进的高斯消元算法应用于电力系统拓扑结构分析中,并引入稀疏、分块处理等技术提高了上述拓扑分析的效率。
采用上述高斯消元算法对山东电网220kV 以上的变电站进行拓扑结构分析,结果表明了运用该高斯消元法进行网络拓扑分析的正确性和有效性。
用列主元素法,选取每列的绝对值最大的元素作为消去对象并作为主元素。
然后换行使之变到主元位子上,在进行消元计算。
设)()(k k b X A ,确定第k 列主元所在位置k i ,在交换k i 行和k 行后,在进行消元,并用MATLAB 软件进行求解。
目录摘要......................................................................................... 错误!未定义书签。
第1章绪论 ........................................................................... 错误!未定义书签。
第2章高斯消元法的算法描述 (2)2.1高斯消元法的原理概述 (2)2.1.1高斯消元法的消元过程 (2)2.1.2高斯消元法的回带过程 (3)2.1.3高斯消元法的复杂度分析 (4)2.2列主高斯消元法原理简介 (5)2.2.1列主高斯消元法的消元过程 (6)2.2.2列主高斯消元法的回带过程 (6)2.2.3列主高斯消元法的算法描述 (6)第3章高斯消元法的物理应用 (9)3.1电网模型的描述 (9)3.2电网模型的问题分析 (9)3.3求解计算 (11)参考文献 (13)摘 要用列主元素高斯消去法法,选取每列的绝对值最大的元素作为消去对象并作为主元素。
列主元素消去法列主元素消去法(Gauss-Jordan 消元法)是一种线性代数中常用的消元方法,用于求解线性方程组的解。
这种方法的基本思想是,将线性方程组的增广矩阵通过一系列的初等变换,化为一个阶梯矩阵或行简化阶梯矩阵,从而得到线性方程组的解。
具体步骤如下:构造增广矩阵,即将系数矩阵和常数矩阵组合成一个矩阵。
将增广矩阵转化为一个上三角矩阵(也叫阶梯矩阵)。
反向消元,将阶梯矩阵转化为一个行简化阶梯矩阵。
根据简化矩阵求解方程组。
这种方法的优点是计算简单、容易理解,且可避免误差的积累。
但是,如果矩阵的规模较大,运算量会很大,计算时间较长。
此时可以使用更高效的算法,如LU分解、QR分解等。
假设有一个 $n$ 个未知量和 $n$ 个方程的线性方程组,可以写成矩阵形式如下:$Ax = b$其中,$A$ 是一个 $n \times n$ 的系数矩阵,$x$ 是一个 $n \times 1$ 的未知量向量,$b$ 是一个 $n \times 1$ 的常数向量。
为了求解 $x$,可以将方程组的增广矩阵表示如下:$\begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1n} & b_{1} \ a_{21} & a_{22} & a_{23} & \cdots & a_{2n} & b_{2} \ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \ a_{n1} & a_{n2} & a_{n3} & \cdots & a_{nn} & b_{n} \end{bmatrix}$ 其中,$a_{ij}$ 表示矩阵的第 $i$ 行第 $j$ 列的元素。
选主元消去法的基本原理选主元消去法是高斯消元法的一种改进方法,旨在提高高斯消元法的运算效率。
它通过在每一次消去过程中选择系数矩阵的最大元素(主元)作为基准元素,将其放在消去过程中的当前行首位,从而避免出现除数为零的情况,减小误差累积,并降低运算量。
选主元消去法的基本原理如下:1. 确定主元:在每一次消去过程中,首先需要根据某种准则选择当前列中绝对值最大的元素作为主元素,并将其所在行与当前行进行交换。
常用的准则有最大主元消去法和选主元消去法。
2. 消元过程:将主元所在列中主元下方的所有元素全部变为0。
这一步骤可以通过对当前行进行线性组合,将主元下方的其他元素变为0。
消元过程结束后,主元所在列下方的所有元素均为0。
3. 回代过程:从最后一行开始,用回代法求解未知数。
通过将回代过程中的已求得的未知数带入方程组中的其他未知数,依次求解出剩余的未知数。
选主元消去法的关键在于选择合适的主元。
在最大主元消去法中,选择当前列中绝对值最大的元素作为主元,并进行行交换,使主元所在行位于当前行首位。
这样做的目的是为了最大限度地减小主元造成的误差累积。
然而,在某些情况下,选取最大主元并不能有效地减小误差,甚至可能会增加误差。
因此,选主元消去法中选取主元的准则更为复杂。
在选主元消去法中,选择准则一般有三种:绝对值最大法、相对值最大法和列主元法。
绝对值最大法:选择当前列中绝对值最大的元素作为主元。
这种方法可以有效地减小误差,并提高计算精度。
然而,对于某些特殊的矩阵,如病态矩阵,选择绝对值最大的元素作为主元可能导致误差累积增大。
相对值最大法:选择当前列中相对值最大的元素作为主元,即选择当前列中的元素与该列中绝对值最大的元素的比值最大的元素作为主元。
相对值最大法能够有效地降低误差累积,并提高计算精度。
列主元法:选择当前列中除主元外绝对值最大的元素所在的行作为主元所在的行。
这种方法能够有效地减小误差,尤其在处理病态矩阵时效果显著。
2012-2013(1)专业课程实践论文列主元素消去法范宁:0818180102,R数学08-1班夏之秋:0818180110,R数学08-1班一、算法理论列主元素消去法既是选主元高斯消去法的一种,也是实际计算中常用的部分选主元消去法。
列主元素消去法则是对完全主元素消去法的又一次改进。
列主元素消去法在完全主元素消去法的基础上减少了在选主元素时所要花费的一定的计算时间。
设有线性方程组b=Ax其中,A 为非奇异矩阵。
方程组的增广矩阵为⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=n nnn n k i n n b a a a a b a a a b a a a A212222211112111]b ,[ 首先在A 的第1列选取绝对值最大的元素作为主元素,即选择0max 111,1≠=≤≤i ni i a a然后交换A 的第1行与第1i 行(交换后增广矩阵为简单起见仍记为]b ,[A ,其元素仍记为i j i b a ,)。
经过第1次消元计算得到与原方程组等价的方程组(2))2(bx =A其中⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=)2()2(2)1(1)2()2()2(2)2(2)2(22)1(1)1(12)1(11)2(b n nnn n nb b b a a a a a a a A, 上述过程可记为 ]2[)2()2(]b ,[]b ,[A A →重复上述计算过程,现假设已完成第1-k 步的选主元素过程,交换两行并进行消元计此时]b ,[A 约化为⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=)()()()()()()2(2)2(2)2(22)1(1)1(1)1(12)1(11)()(]b ,[k n k nnk nkk k k knk kkn nk k b a a b aa b a a b a a a A其中)(k A 的元素仍记为j i a ,)(b k 的元素仍记为i b .第k 步选主元素(在)(k A 右下角方阵的第1列内选),即确定k i ,使0max ,≠=≤≤ik ni k k i a a k交换]b ,[)()(k K A 第k 行与)1,,2,1(-=n k i k 行的元素,再进行消元计算,最后将原线性方程组化为⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n nn nn b b b x x x a a a a a a212122211211回代可求解得 ⎪⎩⎪⎨⎧-=-==∑+=)1,2,,1(/)(/1 n i a x a b x a b x ii ni j j ij i inn n n二、算法框图开始输出奇异标志结束输入A (增广矩阵)()k i a a ik rk >=max 1=k?0=rk a交换A 中k r ,两行1,,1,,1++=+=⨯-=n k j n k i a a a a a kk kj ik ij ij?1-<n k()1,2,,1,,,2,11, -=++=⨯-=∑+n n k n k k j a x aa x kkj kjn k k1=k输出迭代失败标志三、算法程序#include <stdio.h>#include<conio.h>#include <math.h>#include <stdlib.h>#define max_dimension 20int n;static float a[max_dimension][max_dimension]; static float b[max_dimension];static float x[max_dimension];void main(){int i;int j;int d;int row;float temp;float known_items;float l[max_dimension][max_dimension];system("cls");printf("Please Input Matrix jieshu :");scanf("%d",&n);printf("\n");printf("Please Input Matrix Factors : ");printf("\n");for (i=0; i<n; i++){printf("input di %d hang dezhi:",i+1);for (j=0; j<n; j++){scanf("%f",&a[i][j]);}printf("\n");}printf("Please Input Changshu xiang: ");for (i=0; i<n; i++)scanf("%f",&b[i]);printf("The Augmented(zenguang) Matrix is :\n\n"); for (i=0; i<n; i++)for (j=0; j<n; j++)printf("%f",a[i][j]);printf("%f",b[i]);printf("\n");}printf("\n");for (d=0; d<n-1;d++){row=d;for (i=d+1; i<n; i++){if(fabs(a[i][d])>fabs(a[row][d]))row=i;}if (row!=d){for (j=d;j<n; j++){temp=a[row][j];a[row][j]=a[d][j];a[d][j]=temp;}temp=b[row];b[row]=b[d];b[d]=temp;}for (i=d+1; i<n; i++){l[i][d]=-a[i][d]/a[d][d];for (j=d;j<n; j++){a[i][j]=a[i][j]+a[d][j]*l[i][d];}b[i]=b[i]+b[d]*l[i][d];}}for (i=0; i<n; i++){for (j=0; j<n; j++)printf("%f",a[i][j]);printf("%f",b[i]);printf("\n");}printf("\n");for (i=n-1; i>-1; i--){known_items=0;for (j=1; j<n-i; j++){known_items=known_items+a[i][i+j]*x[i+j];}x[i]=(b[i]-known_items)/a[i][i];}printf("The Root X is :\n\n");for (i=0; i<n; i++)printf("%.5f ",x[i]);printf("\n\n");getch();}四、算法实现例1. 求解方程组:⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫⎝⎛--000.3000.2000.1643.5072.1000.2623.4712.3000.1000.3000.2001.0321x x x 用四位浮点数进行计算,精确解舍入到四位有效数字为()T x 3675.0,05104.0,4904.0*--=解:运行程序(1)显示 Please Input Matrix jieshu :输入的值为3,回车。
数值分析上机实验报告(二)一、问题描述:利用列主元消去法求解下列方程组2X1+5X2+3X3 - 2X4=72X1- 2X2+3X3+5X4=-1X1+3X2+2X3+3X4=0X1+2X2+ X3 - 2X4=4二、算法原理:由高斯消去法知道,在消去过程中可能出现a kk(k)=0的情况,这时候消去法将无法进行,所以最好选取系数矩阵(或消元后的低阶矩阵)中绝对值最大的元素作为主元,以使高斯消去法具有较好的数值稳定性。
三、实验步骤:1、det 1;2、对于k=1,2,···,n-1(1)按列选主元|a ik.k|=max|a ik|(2)如果a i.k=0,则计算停止(det(A)=0)(3)如果i k=k则转(4)换行:a kj a ik·j(j=k,k+1,···,n)b k b ikdet -det(4)消元计算对于i=k+1,···,n○1am ik=a ik/a kk○2对于j=k+1,···,n a ij a ij—m ik*a kj○3b i b i-m ik*b ik(5)det a kk*det3、如果则计算停止(det(A)=0)4、回代求解(1)b n b n/a nn(2)对于i=n-1···,2,1bi(bi-∑aij*bj)/aii5.det ann*det四、实验框图五、源程序# include <stdio.h># include<math.h># define n 4main(){int i,j,k,l;float A[n][n],b[n],x[n],max;//输入系数矩阵及右端项for(i=0;i<n;i++)for(j=0;j<n;j++){printf("A[%d][%d]=",i,j);scanf("%f;",&A[i][j]);}for(i=0;i<n;i++){printf("b[%d]=",i);scanf("%f;",&b[i]);}//列主元消去过程for(k=0;k<n-1;k++){max=abs(A[k][k]);l=k;for(i=k+1;i<n;i++)if(abs(A[i][k])>max){max=abs(A[i][k]);l=i;} if(l>k){for(j=k;j<n;j++){max=A[k][j];A[k][j]=A[l][j];A[l][j]=max;}max=b[k];b[k]=b[l];b[l]=max;}for(i=k+1;i<n;i++){max=A[i][k]/A[k][k];for(j=k+1;j<n;j++)A[i][j]=A[i][j]-max*A[k][j];b[i]=b[i]-max*b[k];}}//回代过程x[n-1]=b[n-1]/A[n-1][n-1];for(k=1;k<n;k++){i=n-k-1;x[i]=b[i];for(j=i+1;j<n;j++)x[i]=x[i]-A[i][j]*x[j];x[i]=x[i]/A[i][i];}//输出解for(i=0;i<n;i++)printf("x[%d]=%f;",i,x[i]);getchar();}六、运行结果。
数值分析1顺序消去法、列主元、列主元Gauss-Jordan消去法function x = Gauss (A, b)% 求解方程组的Gauss消去法,调用方法为% x = Gauss (A, b)% 其中% A 为方程组的系数矩阵,b为方程组的右端项% x 为方程组的解[n,m] = size (A); nb = length (b);if n~=merror ('% 系数矩阵必须为方的!');endif m~=nberror ('% b 的维数与方程组的行数不匹配!'); endfor k = 1:n-1% 消元过程for i = k+1:nm = A (i,k)/A(k,k);for j = k+1:nA (i,j) = A (i,j)-m*A (k,j);endb (i) = b (i)-m*b (k);endendx=zeros (size (b));for k = n:-1:1for j = k+1:nb (k) = b (k)-A (k,j)*x (j);endx (k) = b (k)/A(k,k);endendfunction x = Gauss_Elim (A, b)% 求解方程组的列主元Gauss消去法,调用方法为% x = Gauss_Elim (A, b)% 其中% A 为方程组的系数矩阵,b为方程组的右端项% x 为方程组的解[n,m] = size (A); nb = length (b);error ('% 系数矩阵必须为方的!');endif m~=nberror ('% b 的维数与方程组的行数不匹配!');endfor k = 1:n-1% 选主元a_max = 0;for i = k:nif abs (A (i,k))>a_maxa_max = A (i,k); r=i;endendif abs(a_max)<1e-15error ('% 系数矩阵奇异,无法求解方程组!');end% 交换两行if r>kfor j = k:nz=A (k,j); A (k,j)=A (r,j);A (r,j)=z;endz=b (k);b (k)=b (r);b (r)=z;end% 消元过程for i = k+1:nm = A (i,k)/A(k,k);for j = k+1:nA (i,j) = A (i,j)-m*A (k,j);endb (i) = b (i)-m*b (k);endend% 回代过程if abs (A (n,n))<1e-15error ('% 系数矩阵奇异,无法求解方程组!'); endx=zeros (size (b));for k = n:-1:1for j = k+1:nb (k) = b (k)-A (k,j)*x (j);endx (k) = b (k)/A(k,k);endendfunction x = Gauss_Jordan (A, b)% 求解方程组的列主元Gauss-Jordan消去法,调用方法为% x = Gauss_Jordan (A, b)% 其中% A 为方程组的系数矩阵,b为方程组的右端项% x 为方程组的解[n,m] = size (A); nb = length (b);error ('% 系数矩阵必须为方的!');endif m~=nberror ('% b 的维数与方程组的行数不匹配!'); endfor k = 1:n% 选主元a_max = 0;for i = k:nif abs (A (i,k))>a_maxa_max = A (i,k); r=i;endendif abs(a_max)<1e-15error ('% 系数矩阵奇异,无法求解方程组!'); end% 交换两行if r>kfor j = k:nz=A (k,j); A (k,j)=A (r,j);A (r,j)=z;endz=b (k);b (k)=b (r);b (r)=z;end% 消元计算b (k) = b (k)/A(k,k);for j = k+1:nA (k,j) = A (k,j)/A(k,k);endfor i=1:nfor j=k+1:nA (i,j) = A (i,j)-A (i,k)*A (k,j); endb (i)=b (i)-A (i,k)*b (k); endendendx = b; % 输出bend。
一、 列主元素Gauss 消去法、Jacobi 迭代法原理及计算方法1. 列主元素Gauss 消去法:1.1 Gauss 消去法基本原理设有方程组Ax b =,设A 是可逆矩阵。
高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增广矩阵[]B A b = ,将其中的A 变换成一个上三角矩阵,然后求解这个三角形方程组。
1.2 列主元Gauss 消去法计算步骤将方程组用增广矩阵[]()(1)ijn n B A b a ⨯+== 表示。
1). 消元过程对1,2,,1k n =-(1) 选主元,找{},1,,k i k k n ∈+ 使得 ,max k i k ik k i na a ≤≤= (2) 如果,0k i k a =,则矩阵A 奇异,程序结束;否则执行(3)。
(3) 如果k i k ≠,则交换第k 行与第k i 行对应元素位置,k kj i j a a ↔,,,1j k n =+ 。
(4) 消元,对,,i k n = ,计算/,ik ik kk l a a =对1,,1j k n =++ ,计算.ij ij ik kj a a l a =-2). 回代过程(1) 若0,nn a =则矩阵奇异,程序结束;否则执行(2)。
(2) ,1/;n n n nn x a a +=对1,,2,1i n =- ,计算,11/n i i n ij j ii j i x a a x a +=+⎛⎫=- ⎪⎝⎭∑2. Jacobi 迭代法2.1 Jacobi 迭代法基本原理Jacobi 迭代法的基本思想是对n 元线性方程组b Ax =,.,n n R b R A ∈∈将其变形为等价方程组f Bx x +=,其中.,,n n n n R x R f R B ∈∈∈⨯B 成为迭代矩阵。
从某一取定的初始向量)0(x 出发,按照一个适当的迭代公式 ,逐次计算出向量f Bx x k k +=+)()1( ( 1,0=k ),使得向量序列}{)(k x 收敛于方程组的精确解.(1)输入1,,,,)0(=k n xb A ε,. (2) )(1,1)0()1(∑≠=-=n j i i j ij i iii x a b a x )1,0(n i = (3)判断 ε≤--≤≤)0()1(10max i i n i x x ,若是,输出1)1(2)1(1,,n x x x ,若否,置1+=k k ,)1()0(i i x x =,)2,1(n i =。
2012-2013(1)专业课程实践论文列主元素消去法范宁:0818180102,R数学08-1班夏之秋:0818180110,R数学08-1班一、算法理论列主元素消去法既是选主元高斯消去法的一种,也是实际计算中常用的部分选主元消去法。
列主元素消去法则是对完全主元素消去法的又一次改进。
列主元素消去法在完全主元素消去法的基础上减少了在选主元素时所要花费的一定的计算时间。
设有线性方程组b =Ax其中,A 为非奇异矩阵。
方程组的增广矩阵为⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=n nnn n k i n n b a a a a b a a a b a a a A ΛΛM M ΛM M M M M ΛMM ΛΛΛΛ212222211112111]b ,[ 首先在A 的第1列选取绝对值最大的元素作为主元素,即选择0max 111,1≠=≤≤i ni i a a然后交换A 的第1行与第1i 行(交换后增广矩阵为简单起见仍记为]b ,[A ,其元素仍记为i j i b a ,)。
经过第1次消元计算得到与原方程组等价的方程组(2))2(b x =A其中⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=)2()2(2)1(1)2()2()2(2)2(2)2(22)1(1)1(12)1(11)2(b n nnn nn b b b a a a a a a a AM ΛΛMM MM ΛΛΛΛ, 上述过程可记为 ]2[)2()2(]b ,[]b ,[A A →重复上述计算过程,现假设已完成第1-k 步的选主元素过程,交换两行并进行消元计此时]b ,[A 约化为⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=)()()()()()()2(2)2(2)2(22)1(1)1(1)1(12)1(11)()(]b ,[k n k nn k nk k k k kn k kk n nk k b a a b a a b a a b a a a A ΛM M M ΛM M M M O ΛΛΛΛ其中)(k A 的元素仍记为j i a ,)(b k 的元素仍记为i b .第k 步选主元素(在)(k A 右下角方阵的第1列内选),即确定k i ,使0max ,≠=≤≤ik ni k k i a a k交换]b ,[)()(k K A 第k 行与)1,,2,1(-=n k i k Λ行的元素,再进行消元计算,最后将原线性方程组化为⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n nn n n b b b x x x a a a a a a M M M OΛΛ212122211211回代可求解得 ⎪⎩⎪⎨⎧-=-==∑+=)1,2,,1(/)(/1Λn i a x a b x a b x iini j j ij i i nn n n二、算法框图三、算法程序#include <stdio.h>#include<conio.h>#include <math.h>#include <stdlib.h>#define max_dimension 20int n;static float a[max_dimension][max_dimension]; static float b[max_dimension];static float x[max_dimension];void main(){int i;int j;int d;int row;float temp;float known_items;float l[max_dimension][max_dimension]; system("cls");printf("Please Input Matrix jieshu :");scanf("%d",&n);printf("\n");printf("Please Input Matrix Factors : ");printf("\n");for (i=0; i<n; i++){printf("input di %d hang dezhi:",i+1);for (j=0; j<n; j++){scanf("%f",&a[i][j]);}printf("\n");}printf("Please Input Changshu xiang: ");for (i=0; i<n; i++)scanf("%f",&b[i]);printf("The Augmented(zenguang) Matrix is :\n\n"); for (i=0; i<n; i++){for (j=0; j<n; j++)printf("%f",a[i][j]);printf("%f",b[i]);printf("\n");}printf("\n");for (d=0; d<n-1;d++){row=d;for (i=d+1; i<n; i++){if(fabs(a[i][d])>fabs(a[row][d]))row=i;}if (row!=d){for (j=d;j<n; j++){temp=a[row][j];a[row][j]=a[d][j];a[d][j]=temp;}temp=b[row];b[row]=b[d];b[d]=temp;}for (i=d+1; i<n; i++){l[i][d]=-a[i][d]/a[d][d];for (j=d;j<n; j++){a[i][j]=a[i][j]+a[d][j]*l[i][d];}b[i]=b[i]+b[d]*l[i][d];}}printf("The shangsanjiaozenguang Matrix after predigestion is:\n\n"); for (i=0; i<n; i++){for (j=0; j<n; j++)printf("%f",a[i][j]);printf("%f",b[i]);printf("\n");}printf("\n");for (i=n-1; i>-1; i--){known_items=0;for (j=1; j<n-i; j++){known_items=known_items+a[i][i+j]*x[i+j];}x[i]=(b[i]-known_items)/a[i][i];}printf("The Root X is :\n\n");for (i=0; i<n; i++)printf("%.5f ",x[i]);printf("\n\n");getch();}四、算法实现例1. 求解方程组:⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--000.3000.2000.1643.5072.1000.2623.4712.3000.1000.3000.2001.0321x x x 用四位浮点数进行计算,精确解舍入到四位有效数字为()Tx 3675.0,05104.0,4904.0*--=解:运行程序(1)显示 Please Input Matrix jieshu :输入的值为3,回车。
用列主元消去法解下列方程组列主元消去法是一种求解线性方程组的方法,也称为高斯消元法。
它的基本思想是通过一系列的行变换将增广矩阵化为阶梯形矩阵,然后通过回代求解出未知数的值。
下面我们来详细介绍一下列主元消去法的具体步骤。
首先,我们将线性方程组的系数矩阵和常数向量组成增广矩阵,即:$$\left[\begin{matrix}a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\\vdots & \vdots & \ddots & \vdots & \vdots \\a_{n1} & a_{n2} & \cdots & a_{nn} & b_n\end{matrix}\right]$$然后,我们选择第一列中绝对值最大的元素作为主元素,并将其所在的行交换到第一行。
如果第一列中所有元素的绝对值都为0,则选择第二列中绝对值最大的元素作为主元素,并将其所在的行交换到第一行。
以此类推,直到所有列都处理完毕。
接下来,我们将第一行的主元素除以它的系数,然后用第一行的主元素消去第二行、第三行、……、第n行的主元素。
具体地,我们将第二行的第一列元素除以第一行的主元素,然后将第一行乘以这个数并减去第二行,使得第二行的第一列元素变为0。
同样地,我们将第三行、第四行、……、第n行的第一列元素都消去。
然后,我们选择第二列中绝对值最大的元素作为主元素,并将其所在的行交换到第二行。
然后,我们将第二行的主元素除以它的系数,然后用第二行的主元素消去第三行、第四行、……、第n行的主元素。
以此类推,直到所有列都处理完毕。
最后,我们得到一个阶梯形矩阵,即:$$\left[\begin{matrix}a_{11}^{'} & a_{12}^{'} & \cdots & a_{1n}^{'} & b_1^{'} \\0 & a_{22}^{'} & \cdots & a_{2n}^{'} & b_2^{'} \\\vdots & \vdots & \ddots & \vdots & \vdots \\0 & 0 & \cdots & a_{nn}^{'} & b_n^{'}\end{matrix}\right]$$其中,$a_{ii}^{'}$表示第$i$行第$i$列的主元素,$b_i^{'}$表示第$i$行的常数项。
(1)列主元素消去法求解线性方程:#include<iostream>#include<cmath>#define N 20using namespace std;void load();float a[N][N];int m;int main(){int i,j;int c,k,n,p,r;float x[N],l[N][N],s,d;cout<<"下面请输入未知数的个数m=";cin>>m;cout<<endl;cout<<"请按顺序输入增广矩阵a:"<<endl;load();for(i=0;i<m;i++){for(j=i;j<m;j++)c=(fabs(a[j][i])>fabs(a[i][i]))?j:i; /*找列最大元素*/for(n=0;n<m+1;n++){s=a[i][n]; a[i][n]=a[c][n]; a[c][n]=s;} /*将列最大数防在对角线上*/ for(p=0;p<m+1;p++)cout<<a[i][p]<<"\t";cout<<endl;for(k=i+1;k<m;k++){l[k][i]=a[k][i]/a[i][i];for(r=i;r<m+1;r++) /*化成三角阵*/a[k][r]=a[k][r]-l[k][i]*a[i][r];}}x[m-1]=a[m-1][m]/a[m-1][m-1];for(i=m-2;i>=0;i--){d=0;for(j=i+1;j<m;j++)d=d+a[i][j]*x[j];x[i]=(a[i][m]-d)/a[i][i]; /*求解*/}cout<<"该方程组的解为:"<<endl;for(i=0;i<m;i++)cout<<"x["<<i<<"]="<<x[i]<<"\t";//system("pause");return 0;}void load(){int i,j;for(i=0;i<m;i++)for(j=0;j<m+1;j++)cin>>a[i][j];}运行结果:下面请输入未知数的个数m=3请按顺序输入增广矩阵a:1 2 3 45 1 0 84 6 9 24 6 9 20 -6.5 -11.25 5.50 -1.86265e-008 -0.115385 3.92308该方程组的解为:x[0]=-9.99999 x[1]=58 x[2]=-34 Press any key to continue总结:列主元素消去法的目的是为了防止减去一个较小的数时大数淹没小数,而使结果产生较大误差,本程序关键在每次消元时找到相应列中的最大项,然后交换两行位置,在进行计算。
全主元消去法1. 通过编制全主元消去法的MATLAB 程序(见文件),并用12312312310x 19x 2x =320x 40x x =4x 4x 5x =5--⎧⎪-++⎨⎪++⎩ 验证,程序给出的结果为x = 4.4164 2.3523 -1.7651,这与原方程的解相同,说明程序是有效的。
2. 全主元消去法的运算保证是能稳定收敛的,并不会出现分母为零的现象,其误差来源于数据的舍入误差,而这个误差与采用普通高斯消去法和列主元消去法相比大大减小。
3. 当主元素选定后,要对选择出的第一个主元素变为1,这就需要将第一行元素都除以主元素,共需要1n -次乘除法运算,而要使第二行至最后一行的第一列元素都为零,则需要进行(1)*(1)n n -+次乘除法运算,所以第一步共需要22n n +-次乘除法运算,同理可算得进行第二步到最后一步所进行的乘除法运算为22112112n n -+--+-()()、……()可得消元过程中乘除法总和为*(1)*(21)(1)262n n n n n n ++++-次乘除法运算,回带过程中则产生n*(1)1234n=2n +++++……次乘除法运算,所以运用全主元消去法共会产生*(1)*(21)(1)26n n n n n n ++++-次乘除法运算,这也就是方程组的规模与计算量的关系。
4. 矩阵高度稀疏的情况下可以考虑对矩阵进行重新排列,使非零元素聚集在主对角线附近,可以减少运算量。
function [x]=gaussq(a,b)%%x为解,qa为全主元变换后的矩阵a d=[a b];RA=rank(a);RD=rank(d);L=length(b);n=size(a);pos=1:n(1)if RA~=RD %%根据增广矩阵判断有解条件fprintf('无解')elseif RA~=Lfprintf('无穷多解')elsefprintf('有唯一解')for q=1:nbig=max(max(abs(a(q:n,q:n))));for r=q:n %%在右下角矩阵中找到绝对值最大的值for t=q:nif big==abs(a(r,t))zhuh=r; %%记录最大值所在的行列zhul=t;endendendp=a(q,:);%%换主行a(q,:)=a(zhuh,:)%%a矩阵中换行a(zhuh,:)=p;bb=b(q);%%b矩阵中也进行换行b(q)=b(zhuh)b(zhuh)=bb;p=a(:,q);%%换主列a(:,q)=a(:,zhul);a(:,zhul)=p;p=pos(q);%%记录位置变化,调换列后对求解x的影响pos(q)=pos(zhul);pos(zhul)=p;endc=[a b]for j=1:L-1%%变换后将所在矩阵的下面行的第一个元素变为0for i=(j+1):Lm=c(i,j)/c(j,j)c(i,:)=c(i,:)-c(j,:)*mendendx(L,1)=c(L,L+1)/c(L,L);for k=L-1:-1:1x(k,1)=(c(k,L+1)-c(k,k+1:L)*x(k+1:L))/c(k,k);endy=[1:n(1)];%%交换被列调换打乱的位置for w=1:nfor v=1:nif (pos(v)==w)y(w)=x(v)endendendx=y;endend。