列主消元法 解方程
来源:互联网 发布:免费网管软件 编辑:程序博客网 时间:2024/04/28 05:29
- #include <iostream>
- using namespace std;
- const int N = 20;
- float a[N][N];
- float fabs(float x)//求绝对值
- {
- return x>0?x:-x;
- }
- int main()
- {
- int n,i,j,p,x,y,f,q,bigq;
- float k,t,max;
- cout<<"请输入行列式的阶数:";
- while (cin>>n && n>0)
- {
- int judge = 1;//作为系数行列式是否是0 的标志
- cout<<"请输入线性方程组的系数矩阵:"<<endl;
- /***********************/
- for(i = 1; i<=n ; i++)
- for(j = 1; j<=n ;j++)
- {
- cin>>a[i][j];
- }
- //输入线性方程组的系数矩阵
- /*******************/
- cout<<"请输入线性方程组的常数列:"<<endl;
- for(i= 1;i<=n ; i++)
- cin>>a[i][n+1];
- //输入完毕;
- /*******************/
- for(j= 1; j<=n ; j++) // n row
- {
- cout<<"第"<< j << "大步" <<endl;
- for(q= j , max = fabs((a[i][j])) ,bigq =j; q<=n; q++)
- //q从j开始作比较;
- //bigq = j 开始时 默认 为 j 行
- {
- if( fabs(a[q][j]) >max)
- {
- max = fabs(a[q][j]);
- bigq = q; //若 要 互换 则 选取 q 行 为主 元
- }
- }
- cout<<"列主元为第"<< bigq <<"行的元素,绝对值为:" <<max<<endl;
- //寻找第J列中系数最大的一行用bigq记下行号
- for(p = 1; p<=n+1 ; p++)
- //当a[j][j]元为零时,第j行和第bigq行互换;
- //出错:p到n结束;没有交换叙述矩阵
- {
- t = a[j][p]; //交换
- a[j][p] = a[bigq][p];
- a[bigq][p] = t;
- }
- cout<<"第"<< j <<"行和第" << bigq <<"行发生互换"<<endl;
- //比较换行后的处理
- if(0 == a[j][j])
- {
- cout<<"该线性方程组无解或者解不唯一(提前结束)"<< 0 <<endl;
- judge = 0;
- break;
- }
- for( i =f=n ; i>j && max!=0 ; i--)
- //i代表第J大步的第i小步
- {
- k = -a[i][j]/a[j][j];
- for(p=1; p<=n+1; p++) //error husiwen:p<n+1; 注意 系数也要处理
- {
- a[i][p] += a[j][p]*k;// k 为 乘系数 k = -a[i][j]/a[j][j]; 消掉 下面的 系数
- if(a[i][p]< 0.0001)// 当比较小的时候 取值 为0;
- a[i][p] =0;
- }
- //依次消去a[i][j]元,构造上三角行列式
- cout<<"一小步:/n 行的系数为:"<< k <<";乘"<<k<<"处理之后得到:"<<endl;
- for(x=1 ;x<=n ; x++)
- {
- for(y=1; y<=n+1; y++)
- {
- cout.setf(ios::left); // c++ 格式 输出
- cout.width(5);
- cout<<a[x][y]<<" "; // 输出系数 和 b ;n+1 表示等式的右边
- }
- cout<<endl;
- //行列式消去化0的情况的跟踪报道
- }
- }
- }
- for(j=1; j<=n; j++)//j代表一大步
- for(i=f=1; i<j&& judge !=0 ; i++)//i 代表第j大步中的第i小步
- {
- k = -a[i][j]/a[j][j];
- for(p=1; p<=n+1; p++)
- a[i][p]+=a[j][p]*k;
- }
- if(judge != 0)
- {
- cout<<"该行列式方程的解为:"<<endl;
- for(i=1; i<=n; i++)
- cout<<"x"<< i <<"="<<a[i][n+1]/a[i][i]<<endl; //此时a[i]求解 方程组 的根,输出
- }
- //计算完毕 输出结果
- cout<<"请输入行列式的阶数(按0结束):";
- }
- return 0;
- }