线性方程组求解高质量C语言程序精编.docx
- 文档编号:28148621
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:8
- 大小:103.60KB
线性方程组求解高质量C语言程序精编.docx
《线性方程组求解高质量C语言程序精编.docx》由会员分享,可在线阅读,更多相关《线性方程组求解高质量C语言程序精编.docx(8页珍藏版)》请在冰豆网上搜索。
线性方程组求解高质量C语言程序精编
Highqualitymanuscriptsarewelcometodownload
线性方程组求解高质量C语言程序精编
课题:
线性方程组求解
课题描述及要求··········································2
项目分析················································2
算法流程················································2
方法说明················································3
源代码··················································3
程序说明················································6
运行结果················································7
总结····················································7
参考文献················································8
线性方程组求解
05111114陈龙
一.课题描述和功能要求
1.描述:
求解线性方程组Ax=b,写成函数。
其中,A为n乘n阶矩阵,x为n元未知向量,b为n个常数组成的矩阵。
2.要求:
采用高斯先列主元消元法(也可采用其他方法)求解线性方程组AX=b。
二.项目分析
数学上,高斯消去法或称高斯-约当消去法,由高斯和约当得名(很多人将高斯消去作为完整的高斯-约当消去的前半部分),它是线性代数中的一个算法,用于决定线性方程组的解,决定矩阵的秩,以及决定可逆方矩阵的逆。
当用于一个矩阵时,高斯消去产生“行消去梯形形式”。
例如:
一个二元一次方程组,设法对每个等式进行变形,使两个等式中的同一个未知数的系数相等,这两个等式相减,得到一个新的等式,在这个新的等式中,细数相等的未知数就被除去了(系数为0)。
同样的也适合多元多次方程组。
我们知道m*n矩阵(用大写字母表示)是一个m行n列的数阵,n维向量(用加粗的小写字母表示)是n个数的数组,也就是一个n*1矩阵(列向量。
我们不考虑行向量)。
另外,大家也都知道矩阵乘法。
因此一个m*n线性方程组可以表示为
Ax=b,其中A是由系数aij组成的m*n矩阵即系数矩阵,x是n维的未知数向量,b是m维的结果向量。
如果把向量b写到A的右边得到m*(n+1)的矩阵,得到的新矩阵称为这个方程组的增广矩阵。
每一个方程组均对应于一个增广矩阵。
三.算法流程图
四.方法说明
(1)第1步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换
(2)第2步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换
(3)第3步消元——在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换
(4)按x4-x3-x2-x1的顺序回代求解出方程组的解。
五.源代码
#include<>
#include<>
#include<>
#include<>
intGS(int,double**,double*,double);
double**TwoArrayAlloc(int,int);
voidTwoArrayFree(double**);
voidmain()
{
inti,j,n;
doubleep,**a,*b;
ep=1e-4;
printf("有几个未知数");
scanf("%d",&n);
a=TwoArrayAlloc(n,n);
b=(double*)calloc(n,sizeof(double));
if(b==NULL)
{
printf("内存分布失败\n");
exit
(1);
}
for(i=0;i { printf("请输入第%d行相应的系数: \n",i+1); for(j=0;j { printf("a[%d][%d]: ",i,j); scanf("%lf",a[i]+j); fflush(stdin); } printf("请输入第%d行相应的常数: \n",i+1); printf("b[%d]: ",i); scanf("%lf",b+i); fflush(stdin); } if(! GS(n,a,b,ep)) { printf("不能用高斯消元法求解\n"); exit(0); } printf("该方程组的解为: \n"); for(i=0;i printf("x%d=%.2f\n",i+1,b[i]); TwoArrayFree(a); free(b); } intGS(intn,double**a,double*b,doubleep) { inti,j,k,l; doublet; for(k=1;k<=n;k++) { for(l=k;l<=n;l++) if(fabs(a[l-1][k-1])>ep) break; elseif(l==n) return(0); if(l! =k) { for(j=k;j<=n;j++) { t=a[k-1][j-1]; a[k-1][j-1]=a[l-1][j-1]; a[l-1][j-1]=t; } t=b[k-1]; b[k-1]=b[l-1]; b[l-1]=t; } t=1/a[k-1][k-1]; for(j=k+1;j<=n;j++) a[k-1][j-1]=t*a[k-1][j-1]; b[k-1]*=t; for(i=k+1;i<=n;i++) { for(j=k+1;j<=n;j++) a[i-1][j-1]-=a[i-1][k-1]*a[k-1][j-1]; b[i-1]-=a[i-1][k-1]*b[k-1]; } } for(i=n-1;i>=1;i--) for(j=i+1;j<=n;j++) b[i-1]-=a[i-1][j-1]*b[j-1]; return (1); } double**TwoArrayAlloc(intr,intc) { double*x,**y; intn; x=(double*)calloc(r*c,sizeof(double)); y=(double**)calloc(r,sizeof(double*)); if(! x||! y) { printf("内存分配失败\n"); exit (1); } for(n=0;n<=r-1;++n) y[n]=&x[c*n]; return(y); } voidTwoArrayFree(double**x) { free(x[0]); free(x); } 六.程序说明 1.输入方程系数与常数 for(i=0;i 语言程序设计 [2]畅斌,潘莉.VisualC++完全手册
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性方程组 求解 质量 语言 程序 精编