线性方程组求解高质量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;iprintf("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++完全手册