数值方法实验(求解线性微分方程组).doc
文本预览下载声明
Implement Gaussian Elimination With Pivoting Method
项嘉玮
年级:2010 学号小组:4组
数值方法与格式描述
本次实验的目的是解决以下形式的线性方程组
首先我们令A= x= b=
由于上三角方程组的求解很简单。所以若能将方程组化为上三角方程组,那就很容易得到方程的解,高斯消去法则是一种简洁高效的方法,可以将方程组化为上三角方程组,但是这种方法必须满足每一步时才能求解,还有当绝对值很小时,作分母会引起较大的舍入误差。因此在消元过程中应尽量选择绝对值较大的系数作为主元素。
所以列主元消去法很好的解决这一问题。
将的系数中绝对值最大者作为主元素,交换第一行和此元素所在的行,然后主元消去非主元项的系数,。一般的,在的一些相关系数之前,先从中选出绝对值最大者作为主元素,交换第k行和次主元素所在的行,再消去的一些相关系数,只要方程组A非奇异(若A的行列式的值是0的话,方程组有无穷多组解),则每个主元定不为0,故消元过程一定能将方程组化为上三角方程组。
将方程用增广矩阵表示。
最后通过回带就可以解出方程组的解了。
流程图
消元过程
For i=0,2,...,n-1
1.选主元,对于j=i,i+1,...,n-1,找到最大的的fabs(a[jm][i])
2.若最大值任为0,则矩阵A为奇异阵,程序结束,否则执行下一步。
3.交换第jm行与第i行对应的元素位置。
4.消元,对于j=i,i+1,...,n-1对计算m=a[j][i]/a[i][i];
对k=0,1,2,...,n-1计算a[j][k]=a[j][k]-m*a[i][k],b[j]=b[j]-m*b[i]。
回代过程
,对计算
代码实现过程
int GaussPivoting( double **a, double b[], int n, double x[] )
{ int i,j,k,l;
double c,m,d;
for(i=0;in;i++)
{
d=0;
//寻找主元的位置
for(j=i;jn;j++)
{
if(fabs(a[j][i])d)
{
d=fabs(a[j][i]);
l=j;
}
}
//判断是否为奇异阵
if(d==0) return 0;
//交换主元位置
for(k=0;kn;k++)
{
c=a[i][k];
a[i][k]=a[l][k];
a[l][k]=c;
}
c=b[i];
b[i]=b[l];
b[l]=c;
//消元过程
for(j=i+1;jn;j++)
{
m=a[j][i]/a[i][i];
for(k=0;kn;k++)
a[j][k]=a[j][k]-m*a[i][k];
b[j]=b[j]-m*b[i];
}
}
//回代过程
for(i=n-1;i=0;i--)
{
c=0;
for(j=i+1;jn;j++)
c=c+x[j]*a[i][j];
x[i]=(b[i]-c)/a[i][i];
}
return 1;
}
数值例子与分析
例子1:线性方程组的矩阵为b[5][5]={
{1., 3., 2.,5.,4. },
{2., 4., 3.,1.,5. },
{1.5, 2.,3.3,6.,4. },
{4.1, 2.,7.,3.,9. },
{5.1, 3.,7.,2.,10.} },
Right hand:c[5]={53.,48.,59.4, 86.1,90.1 }
该线性方程组的程序运算结果是:
例子2:
该线性方程组的程序运算结果为:
显示全部