求高斯全主元消元法过程
3个回答
2013-07-05
展开全部
主元素法有两种,一种列主元法,一种全主元法,一般来说列主元法就能确保算法的稳定,所谓算法的稳定是指在运算过程中计算误差(对消去法这种直接法来说主要指由于计算机字长有限带来的舍入误差)能得到控制,全主元是较列主元法更稳定的算法,但它的计算量要比列主元法大的多,列主元法在每做一次消元仅与同列的元素做比较,比较的次数与线性方程组的阶n是同阶的量,而全主元法每做一次消元要与系数矩阵所有元素进行比较,计算量是与n^2同阶的量,计算量较列主元大的多,一般来说不采用全主元法,而采用列主元法即可.
2013-07-05
展开全部
i国反对法国和计划计划又有意义有意义有意义有意义
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
class gauss
{
private:
int i,j,k,n,*pivrow,**pivcol;
double eps,pivot,sum,aik,al,*x,**a;
public:
void gauss_input();
void gauss_elimination();
void gauss_output();
~gauss()
{
delete [] x;
delete [] pivrow;
for(i=0;i<n;i++) {delete[] a[i];}
delete [] a;
for(i=0;i<n;i++) {delete [] pivcol[i];}
delete [] pivcol;
}
};
int main()
{
gauss solution;
solution.gauss_input();
solution.gauss_elimination();
solution.gauss_output();
return 0;
}
void gauss::gauss_input()
{
ifstream fin("gauss.dat");
fin>>n;
x=new double [n];
pivrow=new int[n];
pivcol=new int *[n];
for(i=0;i<n;i++)
{
pivcol[i]=new int[2];
}
a=new double *[n];
for(i=0;i<n;i++)
{
a[i]=new double [n+1];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
fin>>a[i][j]; //输入系数矩阵
}
for(i=0;i<n;i++)
{
fin>>a[i][n]; //输入右端向量的各元素 a[][]为增广矩阵
}
fin>>eps;
fin.close();
}
void gauss::gauss_elimination()
{
for(k=0;k<(n-1);k++)
{
pivot=fabs(a[k][k]);
pivrow[k]=k;
pivcol[k][0]=k;
pivcol[k][1]=k;
for(i=k;i<n;i++) //遍历系数矩阵 找到主元
{
for(j=k;j<n;j++)
{
if(pivot<fabs(a[i][j]))
{
pivot=fabs(a[i][j]);
pivrow[k]=i;
pivcol[k][1]=j;
}
}
}
if(pivot<eps)
{
cout<<"\n矩阵可能奇异.失败..."<<endl;
exit(0);
}
if(pivrow[k]!=k) //交换行
{
for(j=k;j<(n+1);j++)
{
al=a[pivrow[k]][j];
a[pivrow[k]][j]=a[k][j];
a[k][j]=al;
}
}
if(pivcol[k][1]!=k) //交换列
{
for(i=0;i<n;i++) //必须是整列整列的交换 所以i遍历到n
{
al=a[i][pivcol[k][1]];
a[i][pivcol[k][1]]=a[i][k];
a[i][k]=al;
}
}
if(k!=(n-1)) //消元
{
for(i=(k+1);i<n;i++)
{
aik=a[i][k];
for(j=k;j<(n+1);j++)
{
a[i][j]-=aik*a[k][j]/a[k][k];
}
}
}
}
x[n-1]=a[n-1][n]/a[n-1][n-1]; //开始回代
for(i=(n-1);i>=0;i--)
{
sum=0.0;
for(j=(i+1);j<n;j++)
{
sum+=a[i][j]*x[j];
}
x[i]=(a[i][n]-sum)/a[i][i];
}
for(k=(n-2);k>=0;k--) //恢复结果 注意:交换行,不影响最后结果。但是交换列会影响未知数的顺序
{
al=x[pivcol[k][1]];
x[pivcol[k][1]]=x[pivcol[k][0]];
x[pivcol[k][0]]=al;
}
}
void gauss::gauss_output()
{
ofstream fout("gauss.out");
fout<<"\n结果是:"<<endl;
for(i=0;i<n;i++)
{
fout<<"\nx[" <<i<< "]="<<x[i]<<endl;
}
fout.close();
}
************************************
输入文件格式
6
-4 1 0 0 0 1
3 -7 2 0 2 0
0 4 -7 3 0 0
0 0 1 -5 4 0
0 2 0 6 -11 3
3 0 0 0 3 -8
-130 0 0 0 0 0
0
#include <fstream>
#include <cmath>
using namespace std;
class gauss
{
private:
int i,j,k,n,*pivrow,**pivcol;
double eps,pivot,sum,aik,al,*x,**a;
public:
void gauss_input();
void gauss_elimination();
void gauss_output();
~gauss()
{
delete [] x;
delete [] pivrow;
for(i=0;i<n;i++) {delete[] a[i];}
delete [] a;
for(i=0;i<n;i++) {delete [] pivcol[i];}
delete [] pivcol;
}
};
int main()
{
gauss solution;
solution.gauss_input();
solution.gauss_elimination();
solution.gauss_output();
return 0;
}
void gauss::gauss_input()
{
ifstream fin("gauss.dat");
fin>>n;
x=new double [n];
pivrow=new int[n];
pivcol=new int *[n];
for(i=0;i<n;i++)
{
pivcol[i]=new int[2];
}
a=new double *[n];
for(i=0;i<n;i++)
{
a[i]=new double [n+1];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
fin>>a[i][j]; //输入系数矩阵
}
for(i=0;i<n;i++)
{
fin>>a[i][n]; //输入右端向量的各元素 a[][]为增广矩阵
}
fin>>eps;
fin.close();
}
void gauss::gauss_elimination()
{
for(k=0;k<(n-1);k++)
{
pivot=fabs(a[k][k]);
pivrow[k]=k;
pivcol[k][0]=k;
pivcol[k][1]=k;
for(i=k;i<n;i++) //遍历系数矩阵 找到主元
{
for(j=k;j<n;j++)
{
if(pivot<fabs(a[i][j]))
{
pivot=fabs(a[i][j]);
pivrow[k]=i;
pivcol[k][1]=j;
}
}
}
if(pivot<eps)
{
cout<<"\n矩阵可能奇异.失败..."<<endl;
exit(0);
}
if(pivrow[k]!=k) //交换行
{
for(j=k;j<(n+1);j++)
{
al=a[pivrow[k]][j];
a[pivrow[k]][j]=a[k][j];
a[k][j]=al;
}
}
if(pivcol[k][1]!=k) //交换列
{
for(i=0;i<n;i++) //必须是整列整列的交换 所以i遍历到n
{
al=a[i][pivcol[k][1]];
a[i][pivcol[k][1]]=a[i][k];
a[i][k]=al;
}
}
if(k!=(n-1)) //消元
{
for(i=(k+1);i<n;i++)
{
aik=a[i][k];
for(j=k;j<(n+1);j++)
{
a[i][j]-=aik*a[k][j]/a[k][k];
}
}
}
}
x[n-1]=a[n-1][n]/a[n-1][n-1]; //开始回代
for(i=(n-1);i>=0;i--)
{
sum=0.0;
for(j=(i+1);j<n;j++)
{
sum+=a[i][j]*x[j];
}
x[i]=(a[i][n]-sum)/a[i][i];
}
for(k=(n-2);k>=0;k--) //恢复结果 注意:交换行,不影响最后结果。但是交换列会影响未知数的顺序
{
al=x[pivcol[k][1]];
x[pivcol[k][1]]=x[pivcol[k][0]];
x[pivcol[k][0]]=al;
}
}
void gauss::gauss_output()
{
ofstream fout("gauss.out");
fout<<"\n结果是:"<<endl;
for(i=0;i<n;i++)
{
fout<<"\nx[" <<i<< "]="<<x[i]<<endl;
}
fout.close();
}
************************************
输入文件格式
6
-4 1 0 0 0 1
3 -7 2 0 2 0
0 4 -7 3 0 0
0 0 1 -5 4 0
0 2 0 6 -11 3
3 0 0 0 3 -8
-130 0 0 0 0 0
0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询