Gauss消去法源程序
Gauss消去法等matlab程序
huidai.M文件:
functionx=huidaini(a)
n=length(a)-1;
x=zeros(n,1);
s=0;
fori=1:1:n
ifi==1
orj=1:1:i-1
s=s+a(i,j)*x(j)
end
x(i)=(a(i,n+1)-s)/a(i,i)
2.)列主元消去法:
functionx=GaussL(A,b)
a=[A b];
x=[];
n=length(a)-1;
fork=1:n
A=a(k:n,k);
h=max(A);
[u,v]=find(A==h);
u=u+k-1;
B=a;
a(k,:)=B(u,:);
a(u,:)=B(k,:);
fori=k+1:n
L(j+1,i)=A(j+1,i)/A(i,i)
A(j+1,:)=A(j+1,:)-L(j+1,i)*A(i,:)
end
end
U=A(:,1:n)
a1=[L b]
y=zeros(n,1)
y=huidaini(a1)
a2=[U y]
x=huidai(a2)
4:实验结果:
1.)Gauss消去法:
>> A=[2 2 3;4 7 7;-2 4 5];b=[3;1;-7];
>> Gauss(A,b)
ans =
2 -2 1
2.)列主元消去法:
>> A=[2 2 3;4 7 7;-2 4 5];b=[3;1;-7];
GaussL(A,b)
高斯列主元消元法解线性方程组
高斯列主元消元法解线性方程组一、题目:用Gauss 列主元消去法解线性方程组Ax b =,其中,A=17.031 -0.615 -2.991 1.007 -1.006 0.000-1.000 34.211 -1.000 -2.100 0.300 -1.7000.000 0.500 13.000 -0.500 1.000 -1.5004.501 3.110 -3.907 -61.705 12.170 8.9990.101 -8.012 -0.017 -0.910 4.918 0.1001.000 2.000 3.000 4.500 5.000 21.803⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭ 0.230 -52.322 54.000 240.236 29.304 -117.818b ⎛⎫ ⎪ ⎪ ⎪= ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭T X=(0.907099 -1.961798 3.293738 -4.500708 3.029344 -5.255068)二、原理及步骤分析设nn ij R a A ⨯∈=][)1(,nn Rb b b b ∈=],,,[)1()2(2)1(1 。
若约化主元素),,2,1(0)(n k a k kk =≠,则通过高斯消元法将方程b AX =约化为三角形方程组求解。
如果在消元过程中发现某个约化主元0)(=k kk a , 则第K 次消元就无法进行。
此外,即使所有约化主元全不为零,虽然可以完成方程组的求解,但也无法保证结果的可靠性,因为计算过程中存在舍入误差。
为减少计算过程中的舍入误差对解的影响,在每次消元前,应先选择绝对值尽可能大的元作为约元的主元,如果在子块的第一列中选取主元,则相应方法称为列主元消元法。
相应过程为:(1)选主元:在子块的第一列中选择一个元)(k k i k a 使)(max k ik ni k kk i a a k ≤≤=并将第k 行元与第k i 行元互换。
Gauss列主元消去法程序设计
《Gauss列主元消去法》实验报告实验名称:Gauss列主元消去法程序设计成绩:___________专业班级:数学与应用数学1202班姓名:王晓阳学号:28实验日期:2014 年11月10日实验报告日期:2014年11月10日一.实验目的1.学习Gauss消去法的基本思路和迭代步骤.2.学会运用matlab编写高斯消去法和列主元消去法程序,求解线性方程组.3.当()ka绝对值较小时,采用高斯列主元消去法.kk4.培养编程与上机调试能力.二、实验内容用消去法解线性方程组的基本思想是用逐次消去未知数的方法把原线性方程组Ax b=化为与其等价的三角形线性方程组,而求解三角形线性方程组可用回代的方法求解.1.求解一般线性方程组的高斯消去法.(1)消元过程:设()0k kk a ≠,第i 个方程减去第k 个方程的()()/k k ik ik kk m a a =倍,(1,,)i k n =+L ,得到()()11k k A x b ++=.()()()()()()()11,,1,,k k k ij ij ik kj k k k ii ik k a a m a i j k n b b m b ++⎧=-=+⎪⎨=-⎪⎩L 经过n-1次消元,可把方程组()()11A x b =化为上三角方程组()()n n A x b =.(2)回代过程:()()()()()1//,1,,1n n n n nn n i i i i i ij j ii j i x b a x b a x a i n =+⎧=⎪⎛⎫⎨=-=- ⎪⎪⎝⎭⎩∑L 以解如下线性方程组为例测试结果.1212312310773264556x x x x x x x x -=⎧⎪-++=⎨⎪-+=⎩2.列主元消去法由高斯消去法可知,在消元过程中可能出现()0k kk a =的情况,这是消去法将无法进行,即使主元素()0k kk a ≠但很小时,用其作除数,会导致其他元素数量级的严重增长和舍入误差的扩散,最后也使得计算解不可靠.这时就需要选取主元素,假定线性方程组的系数矩阵A 是菲奇异的.(1)消元过程:对于1,2,,1k n =-L ,进行如下步骤:1) 按列选主元,记max pk ik k i na a ≤≤=2) 交换增广阵A 的p,k 两行的元素。
matalab怎么用高斯消去法解方程组
matalab怎么用高斯消去法解方程组高斯消去法(Gaussian Elimination)是一种解线性方程组的常用方法,其中包括了高斯消元和回代两个步骤。
通过高斯消去法,我们可以将一个线性方程组转化为简化的上三角矩阵,从而简化求解过程。
要使用高斯消去法解决线性方程组,首先需要将方程组写成矩阵形式。
假设有一个n个方程和n个未知数的线性方程组,可以表示为Ax = b,其中A是一个n×n的系数矩阵,x是一个n×1的未知数向量,b是一个n×1的常数向量。
下面我们将详细介绍高斯消去法的步骤:步骤1:将系数矩阵A和常数向量b合并为增广矩阵[Ab],即在A的右边添加一个列向量b。
步骤2:选取主元素(pivot),通常选择第一行的首个非零元素作为主元素。
如果第一行的首个元素为零,则选择下一行的首个非零元素。
步骤3:将主元素所在的行交换到第一行,以确保主元素位于第一行。
步骤4:除以主元素,使主元素变为1。
这可以通过将主元素所在的行除以主元素的值来实现。
步骤5:用第一行的主元素消去其它行。
对于第i行,将其乘以第一行的主元素的负倒数,并加到第一行上。
步骤6:重复步骤2至步骤5,直到最后一行或最后一列为零。
如果最后一行或最后一列为零,则说明方程组无解或有无穷多解。
步骤7:回代。
从最后一行开始,将求得的解代入每一行的方程中,依次求解未知数。
下面我们将通过一个具体的例子来说明高斯消去法的过程。
假设有以下线性方程组:2x + y - z = 8-3x - y + 2z = -11-2x + y + 2z = -3我们首先将方程组转化为增广矩阵形式:[2 1 -1 | 8][-3 -1 2 | -11][-2 1 2 | -3]首先我们选择第一行的主元素,即第一行第一个非零元素2。
然后将第一行与第二行交换,使主元素位于第一行:[-3 -1 2 | -11][2 1 -1 | 8][-2 1 2 | -3]接下来我们将主元素化为1,即将第一行除以-3:[1 1/3 -2/3 | 11/3][2 1 -1 | 8][-2 1 2 | -3]然后用第一行的主元素消去第二行和第三行:[1 1/3 -2/3 | 11/3][0 1/3 1/3 | 2/3][0 5/3 4/3 | 2/3]此时我们得到了上三角矩阵形式的增广矩阵。
Gauss顺序消去法解线性方程组报告
Gauss 顺序消去法解线性方程组制作人:陈静Gauss 消去法是解线性方程组的一种直接方法,有时也称为精确法,这种算法只包含有限四次运算,并且在每一步运算过程都不会发生舍入误差的假设下,计算的结果就是方程组的精确解。
但实际计算中不可避免舍入误差的存在和影响,所以这种方法只能求得线性方程组的近似解。
一.实验目的:学会用Gauss 顺序消去法解线性方程组。
二.实验要求:线性方程组中≠-)1(k kk a 0.三.顺序消去法解方程组原理:(1) 消元计算:对k=1,2, ,n-1⎪⎪⎩⎪⎪⎨⎧+=-=+=-=+==++),,1(),,1,(),,1()()()1()()()1()()(n k i b l b b n k j i a l a a n k i a a l k k ik k i k ik kj ik k ij k ij k kk k ik ik(2) 回代计算:⎪⎩⎪⎨⎧-=-==∑+=)1,2,,1()()(1)()()()( n i a x a b x a b x i ii n i j j i ij i i i n nn n n n四.顺序消去法解方程组的解题步骤:设有线性代数方程组Ax = b其中A = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡nn n n n n a a a a a a a a a .....................212222111211,x = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n x x x 21,b = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n b b b 21. 为了清晰起见,将方程组写成如下形式⎪⎪⎩⎪⎪⎨⎧=+++=+++=+++.,,)1()1(2)1(21)1(1)1(2)1(22)1(221)1(21)1(1)1(12)1(121)1(11n n 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 第一步 设)1(11a ≠0,首先计算乘数 )1(11)1(11a a l i i =(i=2,3, ,n ). 用-1i l 乘上述方程组的第一个方程,再加到第i 个(i=2,3, ,n )方程上,消 去上述方程组的第二个方程到第n 个方程中的未知数1x ,得与上述方程组等价的方程组⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡)2()2(2)2(2)2(22)1(1)1(12)1(11nn n n n a a a a a a a ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n x x x 21 = ⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡)2()2(2)1(1n b b b 简记为x A )2(=)2(b ,其中)2(A 、)2(b 的元素计算公式为⎩⎨⎧=-===-=.,,3,2,,,2,,,2,)1(11)1()2()1(11)1()2(n i b l b b n i n j a l a a i i i j i ij ij 第二步 仿照第一步的做法以此类推,到第n 步便得到与上述方程组等价的方程组⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡)()2(2)2(22)1(1)1(12)1(11n nn n n a a a a a a ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n x x x 21 = ⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡))22)1(1n n b b b 以上两步为高斯顺序消去法的消去过程。
高斯列主元消去法解线性方程组的实现
高斯列主元消去法解线性方程组的实现班级学号姓名榴莲一、实验任务采用高斯列主元消去法求解线性方程组,以下消解方程为例。
1 2 1 x1 02 2 2 x2 = 3-1 -3 0 x3 2二、编程环境Windows7,Codeblock.三、算法步骤Gauss 消去法的基本思想是,通过将一个方程乘或除某个数以及两个方程相加减这两种运算手续,逐步减少方程组中变元的数目,最终使某个方程只含有一个变元,从而得出所求的解。
对于,G auss消去法的求解思路为:(1)若,先让第一个方程组保持不变,利用它消去其余方程组中的,使之变成一个关于变元的n-1阶方程组。
(2)按照(1)中的思路继续运算得到更为低阶的方程组。
(3)经过n-1步的消元后,得到一个三角方程。
(4)利用求解公式回代得到线性方程组的解。
四、程序流程图数据结构:i,j 变量double a[10][10] a 矩阵double b[10] b 矩阵double x[10] 求解的x矩阵n 矩阵的维度五、程序#include<stdio.h>#include<math.h>void guess(double a[][10],double b[],double x[],int n) { int k,i,j;for(k=0; k<n-1; k++){ double ma =a[k][k]; int tab = k;for(i=k+1; i<n; i++) {if(fabs(ma)<fabs(a[i][k])){ ma = a[i][k];tab = i;}}double mid; mid= b[k]; b[k] =b[tab]; b[tab] =mid; for(i=k; i<n;i++) {mid = a[k][i];a[k][i] = a[tab][i];a[tab][i] = mid;}for(i=k+1; i<n; i++) { b[i]=b[i]-a[i][k]/a[k][k]* b[k];for(j=k+1; j<n; j++) {a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];}a[i][k]=0;}}for(k=n-1; k>=0; k--){ double s =0;for(j=k+1; j<n; j++) s += a[k][j]*x[j];x[k]=(b[k]-s)/a[k][k];}}int main(){ int i,j;double a[10][10] = {{1,2,1},{2,2,3},{-1,-3,0}};double b[10] = {0,3,2};double x[10];int k,n=3;guess(a,b,x,n);printf("三角化矩阵A:\n");for(i=0; i<n; i++) {for(j=0; j<n; j++){ printf("%7.2lf",a[i][j]);}printf("\n");}printf("\n 方程数值 b:\n");for(i=0; i<n; i++) printf("%7.2lf",b[i]);printf("\n");printf("\n 求得的函数值 x:\n");for(i=0; i<n; i++) printf("%7.2lf",x[i]);printf("\n");}六、实验结果及分析高斯消去法由消元和回代两个过程组成。
数值计算基础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:。
高斯消去法解方程组
高斯消去法解方程组
高斯消去法是数值计算中一种解线性方程组的标准算法,由查尔斯·高斯在 18 年发明,是向量空间下线性方程组的计算最有效的算法。
它利用线性变换(例如交换、加减乘除),逐步将线性方程组化简成上三角形形式进而得到解,称为高斯消去法。
其核心思想是:由方程组的关系式可得出系数矩阵,采用层层消去的方法使其变成上三角矩阵,再解出解向量。
高斯消去法的具体步骤是:
(1)以第一列为基元,化为消去向量,即第一列第一项(用a表示)对应的消去系数,然后将其他行的第一项做除法,消去第一列。
(2)以第二列为基元,化为消去向量,消去其余行第二项。
(3)以此类推,以每一列为基元,化为消去向量,将其
余行此列之项全部消去;直至消去完毕。
(4)最后一步是逆序求出解向量。
由最后一个方程式,
可直接求出最后一列解向量(用x表示)特征值,若n表示方程组的阶数,则n=1时即可求得解向量的所有特征值,若n>1,则逆序回代求出前面的特征值。
高斯消去法解线性方程组的算法比较简单,易于理解,
但它会遇到数值误差、文本输入错误等问题,所以在使用高斯消去法时,应当注意它的准确性,以及在使用这种解法时可能出现的数值不稳定性。
此外,高斯消去法的效率较低,其计算
时间与方程组系数的规模呈指数增长关系,因此也可以通过其他算法来求解线性方程组,如 LU 分解等。
(完整版)数值计算用C编程实现gauss顺序消去法
用C 编程实现gauss 顺序消去法 班级: 09医软(一)班姓名: 包优 学号: 09713001姓名: 曹俊武 学号: 09713003姓名: 查海松 学号: 09713004一、 实验名称用c 编程实现gauss 顺序消去法二、 执行步骤设有线性方程组Ax = b (1.1)其中A=⎪⎪⎭⎪⎪⎬⎫⎪⎪⎩⎪⎪⎨⎧nn n n n n a a a a a a a a a K K K K KK K 212222111211,x=⎪⎪⎩⎪⎪⎨⎧⎪⎪⎭⎪⎪⎬⎫n x x x M 21,b=⎪⎪⎩⎪⎪⎨⎧⎪⎪⎭⎪⎪⎬⎫n b b b M 21 为了清晰起见,以n=4为例来说明消去法的过程,将方程组写成如下的形式⎪⎪⎩⎪⎪⎨⎧⎪⎪⎭⎪⎪⎬⎫=+++=+++=+++=+++)1(44)1(443)1(432)1(421)1(41)1(34)1(343)1(332)1(321)1(31)1(24)1(243)1(232)1(221)1(21)1(14)1(143)1(132)1(121)1(11b x a x a x a x a b x a x a x a x a b x a x a x a x a b x a x a x a x a (1.2) Gauss 消去法的过程是:第1步 假定)1(11a ≠0 ,在方程组(1,2)中保留第一个方程,将第一个方程分别乘 21)1(11)1(21l a a = 、 31)1(11)1(31l a a = 、41)1(11)1(41l a a = ,再分别减第二个、第三个、第四个方程便得到方程组(1,2)的等价方程组⎪⎪⎩⎪⎪⎨⎧⎪⎪⎭⎪⎪⎬⎫=++=++=++=+++)2(44)2(443)2(432)2(42)2(34)2(343)2(332)2(32)2124)2(243)2(232)2(22)1(14)1(143)1(132)1(121)1(11b x a x a x a b x a x a x a b x a x a x a b x a x a x a x a (1.3)其中)1(11)1()2(ji ij ij a l a a -=(j=2,3,4,5,;i=2,3,4,),)1(11)1()2(b l b b i i i -=(i=2,3,4). 第2 步 假定0)2(22≠a ,在方程组(1,3)中保留第一及第二个方程分别乘以 32)2(22)2(32l a a = ,42)2(22)2(42l a a =再分别减第三个、第四个方程便可得到方程组(1,3)的等价方程组⎪⎪⎩⎪⎪⎨⎧⎪⎪⎭⎪⎪⎬⎫=+=+=++=+++)3(44)3(443)3(43)3(34)3(343)3(33)2124)2(243)2(232)2(22)1(14)1(143)1(132)1(121)1(11b x a x a b x a x a b x a x a x a b x a x a x a x a (1.4) 其中)2(22)2()3(ji ij ij a l a a -=(j=3,4;i=3,4))2(22)2()3(b l b b i i i -=(i=3,4)第3步 假定0)3(33≠a ,保留方程组(1,4)的前3个方程,将第三个方程乘 43)3(33)3(43l a a = ,再减去第四个方程便可得到方程组(1,4)的等价方程组 ⎪⎪⎩⎪⎪⎨⎧⎪⎪⎭⎪⎪⎬⎫==+=++=+++)4(44)4(44)3(34)3(343)3(33)2124)2(243)2(232)2(22)1(14)1(143)1(132)1(121)1(11b x a b x a x a b x a x a x a b x a x a x a x a (1.5) 其中)3(3443)3(44)4(44a l a a -=,)3(343)3(4)4(4b l b b -=。
gauss消去法求解方程组matlab
高斯消去法是一种用于求解线性方程组的经典方法,它可以通过矩阵的初等变换将方程组化为上三角形式,然后通过回代的方式求解方程组。
在Matlab中,我们可以利用高斯消去法求解方程组,这样可以更加高效地进行数值计算。
下面我们将简要介绍高斯消去法的原理,并通过Matlab代码演示如何使用高斯消去法求解方程组。
一、高斯消去法原理及步骤高斯消去法是一种通过矩阵的初等变换将线性方程组化为上三角形式的方法,其求解过程主要包括以下几个步骤:1. 将系数矩阵增广为增广矩阵;2. 首先通过初等行变换将增广矩阵化为上三角矩阵;3. 然后通过回代的方式求解方程组。
通过这样的步骤,我们可以将原始的线性方程组化简为上三角形式,从而更容易求解方程组。
二、Matlab代码演示在Matlab中,我们可以通过编写代码实现高斯消去法来求解线性方程组。
下面是一个简单的例子代码,用来演示如何在Matlab中使用高斯消去法求解方程组:```matlabfunction x = gauss_elimination(A, b)[n, m] = size(A);if n ~= merror('A must be a square matrix');endAb = [A, b];for k = 1 : n - 1for i = k + 1 : nfactor = Ab(i, k) / Ab(k, k);Ab(i, k : n + 1) = Ab(i, k : n + 1) - factor * Ab(k, k : n + 1); endendx = zeros(n, 1);x(n) = Ab(n, n + 1) / Ab(n, n);for i = n - 1 : -1 : 1x(i) = (Ab(i, n + 1) - Ab(i, i + 1 : n) * x(i + 1 : n)) / Ab(i, i); endend```通过以上的Matlab代码,我们可以实现高斯消去法的求解过程,并得到方程组的解。
Gauss完全主元素消去法
for(int j=1;j<=n+1;j++)
cin>>a[i][j];
}
void output()
{
for(int i=1;i<=n;i++)
{
int index=z[i];
cout<<"x["<<index<<"]="<<x[i]<<endl;
{
float lik=a[i][k]/a[k][k];
for(int j=k+1;j<=n+1;j++)
{
a[i][j]-=lik*a[k][j];
}
}
/*for(int j=k;j<=n+1;j++)
for(i=k+1;i<=n;i++)
{
float t;
t=a[i][k];
a[i][k]=a[i][jk];
a[i][jk]=t;
}
int t=z[k];
z[k]=z[jk];
z[jk]=t;
}
for(i=k+1;i<=n;i++)
}*/
}
}
int main()
{
int n;
cout<<"输入一个数:";
cin>>n;
CGauss A(n);
高斯消去、追赶法matlab
⾼斯消去、追赶法matlab 1. 分别⽤Gauss消去法、列主元Gauss消去法、三⾓分解⽅法求解⽅程组程序:(1)Guess消去法:function x=GaussXQByOrder(A,b)%Gauss消去法N = size(A);n = N(1);x = zeros(n,1);for i=1:(n-1)for j=(i+1):nif(A(i,i)==0)disp('对⾓元不能为0');return;endm = A(j,i)/A(i,i);A(j,i:n)=A(j,i:n)-m*A(i,i:n);b(j)=b(j)-m*b(i);endendx(n)=b(n)/A(n,n);for i=n-1:-1:1x(i)=(b(i)-sum(A(i,i+1:n)*x(i+1:n)))/A(i,i);end命令⾏输⼊:A=[1 -1 2 1;-1 3 0 -3 ;2 0 9 -6;1 -3 -6 19];b=[1 3 5 7];b=b';x=GaussXQByOrder(A,b)运算结果:x =-8.0000000000000000.3333333333333333.6666666666666672.000000000000000(2)列主元Gauss消去法程序:function x=GaussXQLineMain(A,b)%列主元Gauss消去法N = size(A);n = N(1);x = zeros(n,1);zz=zeros(1,n);for i=1:(n-1)[~,p]=max(abs(A(i:n,i)));zz=A(i,:);A(i,:)=A(p+i-1,:);A(p+i-1,:)=zz;temp=b(i);b(i)=b(i+p-1);b(i+p-1)=temp;for j=(i+1):nm = A(j,i)/A(i,i);A(j,i:n)=A(j,i:n)-m*A(i,i:n);b(j)=b(j)-m*b(i);endendx(n)=b(n)/A(n,n);for i=n-1:-1:1x(i)=(b(i)-sum(A(i,i+1:n)*x(i+1:n)))/A(i,i);end命令⾏:A=[1 -1 2 1;-1 3 0 -3 ;2 0 9 -6;1 -3 -6 19];b=[1 3 5 7];b=b';x=GaussXQLineMain(A,b)运⾏结果:x =-8.0000000000000050.3333333333333323.6666666666666682.000000000000000(3)三⾓分解⽅法程序:function x = LU(A,b)%三⾓分解N = size(A);n = N(1);L = eye(n,n);U = zeros(n,n);x = zeros(n,1);y = zeros(n,1);U(1,1:n) = A(1,1:n);L(1:n,1) = A(1:n,1)/U(1,1);for k=2:nfor i=k:nU(k,i) = A(k,i)-L(k,1:(k-1))*U(1:(k-1),i);endfor j=(k+1):nL(j,k) = (A(j,k)-L(j,1:(k-1))*U(1:(k-1),k))/U(k,k); endendy(1)=b(1)/L(1,1);for i=2:ny(i)=b(i)-sum(L(i,1:i-1)*y(1:i-1));endx(n)=y(n)/U(n,n);for i=n-1:-1:1x(i)=(y(i)-sum(U(i,i+1:n)*x(i+1:n)))/U(i,i);end命令⾏:A=[1 -1 2 1;-1 3 0 -3 ;2 0 9 -6;1 -3 -6 19];b=[1 3 5 7];b=b';x=LU(A,b)运⾏结果:x =-8.0000000000000000.3333333333333333.6666666666666672.000000000000000程序:function [times,wucha]=zhuiganfa(a,b,c,f)%追赶法:x为所求解,times为所有乘除运算次数(即时间),wucha为误差的2-范数。
2.2Gauss消去法
可类似求得其解为
c1 x1 = l , 11 k 1 ck lkj x j j 1 xk , lkk
(2.2.6)
k 2,3, , n.
2.2.2 Gauss消去法
由于三角方程组的求解较为简单,对于一般的线性方程组 (2.1.2) , 若能通过同解变换将其化为上三角方程组或下三角方程 组,则求解方程组 (2.1.2) 的问题就解决了. Gauss消去法就是 基于这一基本思想. 记线性方程组(2.1.2)的增广矩阵为 a11 a12 a1n a a22 a2 n 21 A | b an1 an 2 ann
( k 1) | b( k 1) 中第 k 列的 a k 1, k , ,
( k 1) ( k 1) lik aik / akk , i k 1,, n.
( k 1) 将 A
(2.2.8)
| b( k 1) 中的第k 行乘以 lik,然后加到第i行上(i
作3060次乘除法, 而由第2.1节知Gramer法则则需作9.707 1020次 乘除法.由此可见,Gauss消去法的计算量远远小于Gramer法则 的计算量. Gauss消去法(不作行交换)能顺利进行到底的条件是主
(1) ( n 1) 元a11 , a22 ,, ann 均不为零下面定理给出了系数矩阵 . A满足这一
一般地,设已求得xn , xn1 ,, xk 1,则由(2.2.1)的第 k 个方程 可解得
xk ck
j k 1
u
ukk
n
kj
xj , k n 1, n 2,,1.
(2.2.4)
上述求解上三角方程组(2.2.1)解的过程称为回代过程. 1 回代过程需作 n( n 1)次乘除法运算. 2
gauss消去法
列主元高斯消去法:#include<stdio.h>#include<math.h>#define delta 1e-6#define N 100void main(){int i,j,t,r,n,u,c=0;float p,L,max,s;float X[N];float a[N][N+1];printf("请输入方程的阶数\n");scanf("%d",&n);printf("输入的原方程系数,中间用空格隔开\n");for(i=0;i<n;i++)for(j=0;j<n+1;j++)scanf("%f",&a[i][j]);printf("方程系数为\n");for(i=0;i<n;i++){for(j=0;j<n+1;j++){printf("%.2f ",a[i][j]);if(j==n){printf("\n");}}}for(j=0;j<n-1;j++){{max=a[j][j];r=j;}for(i=j+1;i<n;i++)if(fabs(a[i][j])>max){max=a[i][j];r=i;}if(fabs(a[i][j])<delta)printf("矩阵奇异");for(t=j;t<n+1;t++){p=a[j][t];a[j][t]=a[r][t];a[r][t]=p;}for(i=j+1;i<N;i++){L=a[i][j]/a[j][j];for(t=j;t<n+1;t++)a[i][t]=a[i][t]-L*a[j][t];}}printf("输出原方程的解为:\n");X[n-1]=a[n-1][n]/a[n-1][n-1];for(i=n-2;i>=0;i--){s=a[i][n];for(j=i+1;j<n;j++)s=s-a[i][j]*X[j];X[i]=s/a[i][i];}for(u=0;u<n;u++)for(j=0;j<n+1;j++){printf("%12f",a[u][j]);c++;if(c%(n+1)==0)printf("\n");}for(i=0;i<n;i++){printf("x(%d)=%.4f\n",i+1,X[i]);if(i==n-1)printf("\n");}}(2)追赶法#include <stdio.h>#include <math.h>void main( ){int i,n;float a[100],b[100],c[100],f[100];printf("input the N\n");scanf("%d",&n);for(i=0;i<n;i++){printf("plese input a%d and f%d\n",i+1,i+1); scanf("%f %f",&a[i],&f[i]);}for(i=1;i<n;i++){printf("plese input b%d\n",i+1);scanf("%f",&b[i]);}for(i=0;i<n-1;i++){printf("plese input c%d\n",i+1);scanf("%f",&c[i]);}b[0]=a[0];for(i=1;i<n;i++){b[i]=b[i]/a[i-1];a[i]-=b[i]*c[i-1];f[i]-=b[i]*f[i-1];}f[n-1]=f[n-1]/a[n-1];for(i=n-2;i>=0;i--){f[i]=(f[i]-c[i]*f[i+1])/a[i];}for(i=0;i<n;i++){printf("x%d=%f\n",i+1,f[i]);}}。
Gauss完全主元消去法
2011-2012(1)专业课程实践论文Gauss完全主元消去法韩璐,0718180109,R数学07-1一、算法理论设方程组的增广矩阵为⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=n nnnj n n i ni j i i i nj n j b a a a a b a a a a b a a a a b a a a a B111111111212122222211111211。
首先在A 中选取绝对值最大的元素作为主元素,例如0max 1111≠=≤≤≤≤ij nj n i j i a a ,然后交换B 的第1行与第1i 行,经第一次消元计算得()()()()22,,b A b A →。
重复上述过程,已完成第1-k 步的选主元素,交换两行及交换两列,消元计算,),(b A 约化为()()()⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=n nnnkk knkk nn kkb a a b a a b a a b a a a b A2222111211,, 其中()k A 元素仍记作ij a ,()k b 元素仍记作()1,,2,1-=n k b i 。
第k 步选主元素(在()k A 右下角方框内选),即确定k i ,k j 使0max ≠=≤≤≤≤ij nj k ni k j i a a k k 。
交换()()()k k b A ,第k 行与k j 行元素交换()()k A 第k 列与k j 列元素,将k k j i a 调到()k k ,位置,再进行消元计算,最后将原方程化为⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛n n nn n n b b b y y y a a a a a a 212122211211,其中1y ,2y ,…,n y 的次序为未知数1x ,2x ,…,n x 调换后的次序。
回代求解得()⎪⎩⎪⎨⎧-=⎪⎪⎭⎫ ⎝⎛-==∑+=1,2,11 n i a y a b y a b y iin i j i ij i i nn n n 完全主元消去法,其步骤如下:设b Ax =。