Gauss列主元消去法程序设计

合集下载

Gauss列主元消去法、QR(MATLAB)

Gauss列主元消去法、QR(MATLAB)

Gauss列主元消去法、QR(MATLAB)Gauss列主元消去法是一种线性方程组的求解方法,也称Gauss消去法。

其基本思想是将方程组转化为上三角矩阵,然后通过反向代入求解。

该方法的优点在于计算精度高,求解速度快,但缺点是需要大量的计算,尤其是在矩阵阶数较高时。

具体来讲,Gauss列主元消去法的步骤如下:步骤一:将系数矩阵A进行LU分解,其中L是下三角矩阵、U是上三角矩阵。

设$A=LU$,则原方程组可以写成$LUx=b$。

步骤二:通过初等矩阵左乘系数矩阵A,将每一列的主元变为该列所有元素中绝对值最大的那个元素。

这个过程称为选主元,可以避免计算中的数值不稳定问题。

步骤三:将选主元后的系数矩阵A进行LU分解,得到$L^{'}$、$U^{'}$。

步骤五:通过反向代入求解$U^{'}x=y$,得到$x$的解。

Gauss列主元消去法的实现通常通过矩阵的变换来实现。

对于$n$阶矩阵$A=[a_{ij}]$,通过一系列的行变换,可以将其变为上三角矩阵。

其中的变换可以表示为:$$ R_{i} \leftrightarrow R_{j} $$其中,$R_{i}$和$R_{j}$分别表示矩阵$A$中的第$i$行和第$j$行,$k$是一个非零常数。

这些变换被称为初等行变换。

在MATLAB中,可以使用已经实现好的{\color{blue}\texttt{gauss}}函数来求解线性方程组。

该函数实现的算法是Gauss列主元消去法。

其调用格式为:x = gauss(A,b)其中,$A$是系数矩阵,$b$是结果向量。

函数返回结果向量$x$。

如果$A$或$b$不合法,则函数会返回一个空向量。

除了Gauss列主元消去法,还有一种常用的求解线性方程组的方法是QR分解法。

步骤二:通过正交矩阵左乘系数矩阵$A$,使其变为一个上三角矩阵。

这个过程称为正交相似变换。

步骤三:将$b$进行正交相似变换,得到$Q^{T}b$。

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)精品资料

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)精品资料
高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)
//Gauss消去法解线性方程组
//参考教材《计算方法教程》第二版,西安交通大学出版社
#include<stdio.h>
int main(void)
{
float A[7][7]={{3,-5,6,4,-2,-3,8},
{1,1,-9,15,1,-9 ,2},
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;
}
}
printf("col:%d\n",col);
for(j=k;j<size;j++)
printf("\n\n");
//消去过程
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];
{
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
}

(7) 列主元高斯消去法的实现

(7) 列主元高斯消去法的实现

列主元高斯消去法是一种用于解线性方程组的经典算法,其实现过程包括主元选取、互换行、消元和回代等步骤。

本文将从理论基础、算法描述、实现步骤和代码示例等方面介绍列主元高斯消去法的实现方法,希望可以帮助读者更好地理解和掌握这一算法。

一、理论基础列主元高斯消去法是求解线性方程组的一种经典方法,其基本思想是通过逐步消去未知数,最终得到方程组的解。

在实际应用中,通常将线性方程组表示为增广矩阵的形式,然后通过主元选取、互换行、消元和回代等操作,逐步将增广矩阵转化为阶梯形矩阵或行阶梯形矩阵,最终获得方程组的解。

列主元高斯消去法的关键在于主元的选取,通过选取适当的主元可以避免出现数值不稳定的情况,从而提高求解的准确性和稳定性。

二、算法描述列主元高斯消去法的基本算法描述如下:1. 将线性方程组表示为增广矩阵的形式2. 从第一行开始,选择当前列中绝对值最大的元素作为主元,并将其所在行与当前行交换3. 通过第一个主元,将当前列下方的元素消为零,得到一个新的增广矩阵4. 重复以上步骤,直到得到一个阶梯形矩阵或行阶梯形矩阵5. 利用回代的方法,求解得到线性方程组的解三、实现步骤基于上述算法描述,可以将列主元高斯消去法的实现步骤总结如下:1. 主元选取:对于当前列,在所有未处理的元素中选择绝对值最大的元素作为主元,并将其所在行与当前行交换2. 互换行:如果选取的主元为零,则需要考虑互换行的操作,以避免出现除零错误3. 消元:利用当前列的主元将下方的元素消为零4. 回代:通过阶梯形矩阵或行阶梯形矩阵进行回代,求解得到线性方程组的解在实现列主元高斯消去法时,需要注意处理数值计算中可能出现的特殊情况,如零主元和除零错误等,并进行合理的异常处理。

四、代码示例下面是列主元高斯消去法的简单实现代码示例,该示例使用Python 语言编写:```pythonimport numpy as npdef gauss_elimination(A, b):n = len(b)for i in range(n):pivot = ifor j in range(i+1, n):if abs(A[j, i]) > abs(A[pivot, i]):pivot = jA[[i, pivot]] = A[[pivot, i]]b[[i, pivot]] = b[[pivot, i]]for j in range(i+1, n):factor = A[j, i] / A[i, i]b[j] -= factor * b[i]A[j] -= factor * A[i]x = np.zeros(n)for i in range(n-1, -1, -1):x[i] = (b[i] - np.dot(A[i, i+1:], x[i+1:])) / A[i, i]return x```以上代码示例实现了列主元高斯消去法的求解过程,通过调用该函数可以求解给定的线性方程组。

列主元素Gauss消去法Jacobi迭代法原理及计算方法

列主元素Gauss消去法Jacobi迭代法原理及计算方法

一、 列主元素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 =。

Gauss列主元消去法程序设计

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 两行的元素。

列主元高斯消元法的C语言编程及列管式换热器设计

列主元高斯消元法的C语言编程及列管式换热器设计

列主元高斯消元法的C语言编程及列管式换热器设计主元高斯消元法(Gaussian Elimination)是一种线性代数中常用的求解线性方程组的方法。

它可以被用于列管式换热器的设计中,来计算热交换器的换热性能。

下面是用C语言实现主元高斯消元法的代码:```c#include <stdio.h>#include <stdlib.h>#define SIZE 10void swapRow(double matrix[SIZE][SIZE], int row1, int row2, int n)for(int i = 0; i <= n; i++)double temp = matrix[row1][i];matrix[row1][i] = matrix[row2][i];matrix[row2][i] = temp;}void printMatrix(double matrix[SIZE][SIZE], int n)for(int i = 0; i < n; i++)for(int j = 0; j <= n; j++)printf("%lf ", matrix[i][j]);}printf("\n");}void gaussianElimination(double matrix[SIZE][SIZE], int n) for(int i = 0; i < n; i++)//列中绝对值最大的元素int maxRow = i;for(int j = i + 1; j < n; j++)if(abs(matrix[j][i]) > abs(matrix[maxRow][i]))maxRow = j;}}//交换行swapRow(matrix, i, maxRow, n);//消元for(int j = i + 1; j < n; j++)double factor = matrix[j][i] / matrix[i][i];for(int k = i; k <= n; k++)matrix[j][k] = matrix[j][k] - factor * matrix[i][k];}}}void backSubstitution(double matrix[SIZE][SIZE], double solution[SIZE], int n)for(int i = n - 1; i >= 0; i--)solution[i] = matrix[i][n];for(int j = i + 1; j < n; j++)solution[i] -= matrix[i][j] * solution[j];}solution[i] /= matrix[i][i];}int maiint n;printf("请输入未知数的个数:");scanf("%d", &n);double matrix[SIZE][SIZE];double solution[SIZE];//输入方程组的系数矩阵和常数列printf("请输入方程组的系数矩阵和常数列(以空格分隔):\n"); for(int i = 0; i < n; i++)for(int j = 0; j <= n; j++)scanf("%lf", &matrix[i][j]);}}//打印输入的矩阵printf("输入的矩阵为:\n");printMatrix(matrix, n);//利用高斯消元法求解方程组gaussianElimination(matrix, n);//利用回代法求解解向量backSubstitution(matrix, solution, n);//打印解向量printf("解向量为:\n");for(int i = 0; i < n; i++)printf("x%d = %lf\n", i+1, solution[i]);}return 0;```上述代码实现了主元高斯消元法的求解过程,通过键盘输入方程组的系数矩阵和常数列,然后计算出解向量。

高斯列主元消去法解线性方程组的实现

高斯列主元消去法解线性方程组的实现

高斯列主元消去法解线性方程组的实现班级学号姓名榴莲一、实验任务采用高斯列主元消去法求解线性方程组,以下消解方程为例。

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");}六、实验结果及分析高斯消去法由消元和回代两个过程组成。

3高斯列主元消去法8页word文档

3高斯列主元消去法8页word文档

3.高斯列主元消去法,求解其次线性方程组C/C++ codeprintf("Now input b(i),i,j=0...%d:\n",n-1); for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n-2;i++){ for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++) if(fabs(a[j][i])>mx){ mi=j;mx=fabs(a[j][i]);if(i<mi){ tmp=b[i];b[i]=b[mi];b[mi]=tmp;for(j=i;j<n;j++){ tmp=a[i][j];a[i][j]=a[mi][j];a[mi][j]=tmp;for(j=i+1;j<n;j++){ tmp=-a[j][i]/a[i][i];b[j]+=b[i]*tmp;for(k=i;k<n;k++)a[j][k]+=a[i][k]*tmp;x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){ x[i]=b[i];for(j=i+1;j<n;j++)x[i]-=a[i][j]*x[j];x[i]/=a[i][i];for(i=0;i<n;i++)printf("Answer:\n x[%d]=%f\n",i,x[i]); getch();return0;#include<math.h>#include<stdio.h>#define NUMBER 20#define Esc 0x1b#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k);float max(int k);message();main()float x[NUMBER];int r,k,i,j;char celect;clrscr();printf("\n\nUse Gauss.");printf("\n\n1.Jie please press Enter.");printf("\n\n2.Exit press Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n input n=");scanf("%d",&n);printf(" \n\nInput matrix A and B:");for(i=1;i<=n;i++)printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);for(j=1;j<=n+1;j++) scanf("%f",&A[i][j]);for(k=1;k<=n-1;k++)ark=max(k);if(ark==0)printf("\n\nIt's wrong!");message();else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--)float me=0;for(j=k+1;j<=n;j++)me=me+A[k][j]*x[j];x[k]=(A[k][n+1]-me)/A[k][k];for(i=1;i<=n;i++)printf(" \n\nx%d=%f",i,x[i]); message();exchange(int r,int k)int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];float max(int k)int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp)temp=fabs(A[i][k]);4.龙贝格求积公式,求解定积分C/C++ codesum+=(f(p)+f(q))/2;return(h*sum);void main(){ int i;int n=N,m=0;float T[MAX+1][2];T[0][1]=LBG(a,b,n);n*=2;for(m=1;m<MAX;m++){ for(i=0;i<m;i++)T[i][0]=T[i][1];T[0][1]=LBG(a,b,n);n*=2;for(i=1;i<=m;i++)T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e)) { printf("Answer=%f\n",T[m][1]); getch();return ;希望以上资料对你有所帮助,附励志名言3条:1、宁可辛苦一阵子,不要苦一辈子。

实验二:Gauss列主元消去法

实验二:Gauss列主元消去法

实验二:Gauss列主元消去法程序1:Gauss列主元消去法A=input('请输入线性方程组的增广矩阵A=');n=length(A)-1;x=zeros(n,1);aa=zeros(n,1);for j=1:nfor i=1:(n+1)AA(j,i)=abs(A(j,i));endendfor k=1:(n-1)for i=k:naa(i-(k-1))=AA(i,k);endfor i=k:nif AA(i,k)==max(aa)breakendendif AA(i,k)==0breakfprintf('方程组系数矩阵奇异\n');elsefor j=k:(n+1)jh=A(i,j);A(i,j)=A(k,j);A(k,j)=jh;endendfenzi=A(k,k);for j=k:(n+1)A(k,j)=A(k,j)/fenzi;endfor p=(k+1):njj=A(p,k);for j=k:(n+1)A(p,j)=A(p,j)-jj*A(k,j);endendendif k==(n-1)x(n)=A(n,(n+1))/A(n,n);for i=(n-1):(-1):1he=0;for j=(i+1):nhe=he+A(i,j)*x(j);endx(i)=A(i,(n+1))-he;endendx用Gauss列主元消去法解方程组:1.请输入线性方程组的增广矩阵A=[1e-008,2,3,1;-1,3.172,4.623,2;-2,1.072,5. 643,3]x =-0.4653-0.07000.38002.请输入线性方程组的增广矩阵A=[4,-2,4,10;-2,17,10,3;-4,10,9,-7];x =2.94640.6071-0.14293.请输入线性方程组的增广矩阵A=[0.3e-020,1,0.7;1,1,0.9]x =0.20000.7000程序2:不选主元的高斯消去法A=input('请输入线性方程组的增广矩阵A=');n=length(A)-1;x=zeros(n,1);for k=1:(n-1)if A(k,k)==0breakfprintf('方程组不能用普通的高斯消去法解\n');elsefenzi=A(k,k);for j=k:(n+1)A(k,j)=A(k,j)/fenzi;endfor p=(k+1):njj=A(p,k);for j=k:(n+1)A(p,j)=A(p,j)-jj*A(k,j);endendx(n)=A(n,(n+1))/A(n,n);for i=(n-1):(-1):1he=0;for j=(i+1):nhe=he+A(i,j)*x(j);endx(i)=A(i,(n+1))-he;endendendx用不选主元的Gauss消去法解方程组:1.请输入线性方程组的增广矩阵A=[4,-2,4,10;-2,17,10,3;-4,10,9,-7];x =2.94640.6071-0.14292.请输入线性方程组的增广矩阵A=[1e-008,2,3,1;-1,3.172,4.623,2;-2,1.072,5. 643,3];x =-0.4653-0.07000.38003.请输入线性方程组的增广矩阵A=[0.3e-020,1,0.7;1,1,0.9]x =0.7000。

Matlab程序Gauss列主元消去法

Matlab程序Gauss列主元消去法

Matlab程序Gauss列主元消去法编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(Matlab程序Gauss列主元消去法)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为Matlab程序Gauss列主元消去法的全部内容。

.Gauss 列主元消去法求解线性方程组迭代法计算停止的条件为:.采用用用Gauss 列主元消去法时,Matlab 计算程序为: clearclcA=[2 2 1 2;4 1 3 —1;—4 —2 0 1;2 3 2 3];B=[1;2;1;0];n=length(B);X=zeros (n,1);c=zeros(1,n);d1=0;for i=1:n —1max=abs(A(i ,i ));m=i;for j=i+1:nif max<abs (A (j,i ))max=abs (A (j,i));m=j;endendif (m ~=i)for k=i :nc(k)=A(i ,k);A (i,k)=A(m ,k);A (m,k)=c (k );endd1=B(i);12346212425027,2085113270x x x x -⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪- ⎪ ⎪ ⎪= ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭6)()1(3110max -+≤≤<-k j k j j x xB(i)=B(m);B(m)=d1;endfor k=i+1:nfor j=i+1:nA(k,j)=A(k,j)—A(i,j)*A(k,i)/A(i,i);endB(k)=B(k)—B(i)*A(k,i)/A(i,i);A(k,i)=0;endendX(n)=B(n)/A(n,n);for i=n-1:—1:1sum=0;for j=i+1:nsum=sum+A(i,j)*X(j);endX(i)=(B(i)-sum)/A(i,i);endX计算结果为:X =(1。

高斯列主元消去法解线性方程组

高斯列主元消去法解线性方程组

高斯列主元消去法解线性方程组c语言编写的源程序:#include <stdio.h>#include<math.h>int n;float a[100][100],b[100];void output (){int i,j;printf("the array a,b is\n");for (i=0;i<n;i++){ for (j=0;j<n;j++)printf("%-10f",a[i][j]);printf("%-10f",b[i]);printf("\n");}}void input(){int i,j;printf("input sting a ");scanf("%d",&n);printf("input array a:\n");for(i=0;i<n;i++)for(j=0;j<n;j++){scanf("%f",&a[i][j]);}printf("input array b:\n");for(i=0;i<n;i++)scanf("%f",&b[i]);}void gaosi (){ int k,i,j,max;float ta,tb,m;for(k=0;k<n;k++){max=k;for(i=k+1;i<n;i++){if(fabs(a[i][k])>fabs(a[max][k]))max=i;}if(i!=k){for(j=0;j<n;j++){ta=a[k][j];a[k][j]=a[max][j];a[max][j]=ta;}tb=b[k];b[k]=b[max];b[max]=tb; }output();for(i=k+1;i<n;i++){m=a[i][k]/a[k][k];for(j=k;j<n;j++)a[i][j]=a[i][j]-a[k][j]*m;b[i]=b[i]-m*b[k];output();}}}void qiujie (){ int i,j;float sum;b[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){sum=0;for(j=i+1;j<n;j++)sum=sum+a[i][j]*b[j];b[i]=(b[i]-sum)/a[i][i];}printf("the result is:\n");for(i=0;i<n;i++)printf("x%d=%f\n",i+1,b[i]);}void main(){ input();gaosi();qiujie();}以下是运行结果:输出矩阵的大致变化过程input sting a 4input array a:1.003 0.333 1.504 -0.333-2.011 1.455 0.506 2.9564.329 -1.952 0.006 2.0875.113 -4.004 3.332 -1.112input array b:3.005 5.407 0.136 3.772the result is:x1=-0.325438x2=0.327990x3=2.372718x4=1.040163计算如下方程组:1.003 x1+ 0.333x2+ 1.504x3 -0.333x4=3.005 -2.011x1 + 1.455 x2+ 0.506x3 + 2.956x4=5.4074.329 x1 -1.952x2+ 0.006 x3+ 2.087x4=0.1365.113 x1-4.004x2 + 3.332x3 -1.112x4= 3.772。

python高斯列主元消去法

python高斯列主元消去法

python高斯列主元消去法高斯列主元消去法是解线性方程组的一种方法,其中列主元指的是在每一列中选择最大的元素作为主元。

这有助于减小计算误差。

下面是一个使用Python 实现高斯列主元消去法的简单示例:```pythonimport numpy as npdef gaussian_elimination(A, b):n = len(b)# 增广矩阵augmented_matrix = np.column_stack((A, b))for i in range(n):# 部分主元消去max_row = np.argmax(np.abs(augmented_matrix[i:, i])) + iaugmented_matrix[[i, max_row]] = augmented_matrix[[max_row, i]]# 将主元归一augmented_matrix[i, :] /= augmented_matrix[i, i]# 消去其他行for j in range(i+1, n):augmented_matrix[j, :] -= augmented_matrix[j, i] * augmented_matrix[i, :]# 回代x = np.zeros(n)for i in range(n-1, -1, -1):x[i] = augmented_matrix[i, -1]for j in range(i+1, n):x[i] -= augmented_matrix[i, j] * x[j]return x# 示例A = np.array([[2, 1, -1],[-3, -1, 2],[-2, 1, 2]])b = np.array([8, -11, -3])result = gaussian_elimination(A, b)print("解:", result)```这个例子中,`A` 是系数矩阵,`b` 是右侧的常数向量。

高斯列主元素消去法算法C++

高斯列主元素消去法算法C++

#include<iostream>#include<fstream>#include<stdlib.h>#include<math.h>#define eps 0.0000000005using namespace std;void exchange(double A[3][3],double b[],int p,int q); void xiaoyuan(double A[3][3],double b[],int p,int n); void gauss(double A[3][3],double b[],int n);int main(int argv,char argc[]){double A[3][3];A[0][0]=0.00000001;A[0][1]=2;A[0][2]=3;A[1][0]=-1;A[1][1]=3.712;A[1][2]=4.623;A[2][0]=-2;A[2][1]=1.072;A[2][2]=5.643;double b[3]={1,2,3};gauss(A,b,3);return 0;}void exchange(double A[3][3],double b[],int p,int q,int n) {for(int i=0;i!=n;i++){double temp=0;temp=A[p][i];A[p][i]=A[q][i];A[q][i]=temp;}double temp=0;temp=b[p];b[p]=b[q];b[q]=temp;//cout<<"b[]"<<b[p]<<" "<<b[q]<<endl;}void xiaoyuan(double A[3][3],double b[],int p,int n) {cout<<"消元"<<endl;for(int i=p;i!=n-1;i++){cout<<"i="<<i<<endl;double temp=(0-A[i+1][p])/A[p][p];for(int j=p;j!=n;j++){A[i+1][j]=A[i+1][j]+A[p][j]*temp;cout<<A[i+1][j]<<" ";}b[i+1]=b[i+1]+b[i]*temp;cout<<b[i+1];}}void gauss(double A[3][3],double b[],int n){for(int k=0;k!=n-1;k++){double max=0;int index=k;cout<<A[k][k];max=A[k][k];for(int i=k+1;i!=n;i++){if(fabs(A[i][k])-fabs(max)>0){max=A[i][k];index=i;}}cout<<endl<<max<<endl;if(fabs(max)<eps){cout<<"无解"<<endl;exit(1);}if(k!=index){exchange(A,b,k,index,n);}xiaoyuan(A,b,k,n);system("PAUSE");}if(fabs(A[n-1][n-1])<eps){cout<<"无解"<<endl;exit(1);}//cout<<"b="<<endl;for(k=n-1;k!=-1;k--){cout<<b[k]<<" ";}cout<<endl;for(int i=n-1;i!=-1;i--){double sum=0;for(int j=i;j!=n-1;j++){double temp=0;temp=A[i][j+1]*b[j+1];sum=sum+temp;}b[i]=(b[i]-sum)/A[i][i];cout<<b[i]<<endl;}}。

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

《Gauss列主元消去法》实验报告
实验名称:Gauss列主元消去法程序设计???成绩:_________
专业班级:数学与应用数学1202班?姓名:王晓阳???学号:
实?验?日?期:?2014?年11月10日
实验报告日期:?2014年?11月10日
一.实验目的
1. 学习Gauss消去法的基本思路和迭代步骤.
2. 学会运用matlab编写高斯消去法和列主元消去法程序,求解线性方程组.
3. 当绝对值较小时,采用高斯列主元消去法•
4. 培养编程与上机调试能力.
二、实验内容
用消去法解线性方程组的基本思想是用逐次消去未知数的方法把原线性方程组Ax二b 化为与其等价的三角形线性方程组,而求解三角形线性方程组可用回代的方法求解
1. 求解一般线性方程组的高斯消去法•
(1) 消元过程:
设a kk k-0 ,第i个方程减去第k个方程的m ik Tk k倍,("k 1^1, n),得到
A k1x=b k1.
经过n-1次消元,可把方程组A1^b1化为上三角方程组A n x=b n.
⑵回代过程:
以解如下线性方程组为例测试结果
2. 列主元消去法
由高斯消去法可知,在消元过程中可能出现a kk k =0的情况,这是消去法将无法进行, 即使主元素a kk k-0但很小时,用其作除数,会导致其他元素数量级的严重增长和舍入误差的扩散,最后也使得计算解不可靠.这时就需要选取主元素,假定线性方程组的系数矩阵A是菲奇异的.
(1)消元过程:
对于k =1,2,川,n -1,进行如下步骤:
1) 按列选主元,记
2) 交换增广阵A的p,k两行的元素
A(k,j)=A(p,j) ( j=k,…,n +1)
3) 交换常数项b的p,k两行的元素。

b(k)=b(p)
4) 计算消元
(2) 回代过程
(3) 以解如下线性方程组为例测试结果
三、实验环境
MATLAB R2014a
四、实验步骤
1.高斯列主元消去法流程图:
计算消

回代
“输出线性方
程组的解
结束2.程序设计:
(一)高斯消去法: a=input('请输入系数阵:’);
b=input('请输入常数项:’);
n=len gth(b);
A=[a,b];
x=zeros(n,1);
%初始值
for k=1:n-1
for i=k+1:n %第k 次消元
m(i,k)=A(i,k)/A(k,k);
for j=k+1:n
A(i,j)=A(i,j)-A(k,j)*m(i,k);
end
b(i)=b(i)-m(i,k)*b(k);
end
end
x(n)=b(n)/A(n,n); %回代
for i=n-1:-1:1;
s=0;
for j=i+1:n;
s=s+A(i,j)*x(j);
end
x(i)=(b(i)-s)/A(i,i)
end
( 二) 高斯列主元消去法:a=input( ' 请输入
系数阵:' );
b=input( ' 请输入常数项:' );
n=length(b);
A=[a,b];
x=zeros(n,1); %初始值
for k=1:n-1
if abs(A(k, k))<10(4);
y=1
%判断是否选主元
else
y=0; end
if y; %选主元
for i=k+1:n;
if abs(A(i,k))>abs(A(k,k))
p=i;
else p=k;
end
end
if p~=k;
for j=k:n+1;
s=A(k,j);
A(k,j)=A(p,j); %交换系数
A(p,j)=s;
end
t=b(k);
b(k)=b(p); %交换常数项
b(p)=t;
end end for i=k+1:n
m(i,k)=A(i,k)/A(k,k); % 第k 次消元for j=k+1:n
A(i,j)=A(i,j)-A(k,j)*m(i,k);
end
b(i)=b(i)-m(i,k)*b(k);
end end
1
x =
x(n)=b(n)/A(n,n); %回代
for i=n-1:-1:1;
s=0;
for j=i+1:n; s=s+A(i,j)*x(j); end x(i)=(b(i)-s)/A(i,i) end
五、实验结果Gauss1
请输入系数阵:[10,-7,0;-3,2,6;5,-1,5]
请输入常数项:[7;4;6]
x =
-1.0000
1.0000
x =
-0.0000
-1.0000
1.0000
X=(0 ,-1 ,1)
Gauss2
请输入系数阵:[10八(-5),1;2,1]
请输入常数项:[1;2]
y =
0.5000
1.0000
X= (0.5 , 1)
1 x =六、实验讨论、结论
本实验通过matlab程序编程实现了高斯消去法及高斯列主元消去法的求解,能加深对高斯消去法基本思路与计算步骤的理解。

当主元素特别小时,需要选取主元,否则会影响
结果,这时就需要采用高斯列主元消去法。

七、参考资料
[1] 李庆杨,王能超,易大义.数值分析.清华大学出版社,2008,P142
[2] 刘卫国.MATLAB程序设计与应用.高等教育出版社,2006,P163。

相关文档
最新文档