高斯消元原理
来源:互联网 发布:怎么投诉淘宝卖家 编辑:程序博客网 时间:2024/05/22 05:37
高斯消元是用来求线性方程组的解,行列式求值,或者矩阵求逆等等。主要有两个步骤:化行阶梯形矩阵和回带。
高斯消元的时间复杂度为,以下代码中代表方程个数,代表未知数个数,数组用来判断哪些未知数是
变元,数组用来存求得的解。
代码:
#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>#include <math.h>using namespace std;const int N = 105;int gcd(int a,int b){ return b ? gcd(b,a%b):a;}int lcm(int a,int b){ return a / gcd(a,b) * b;}/**n个方程,m个未知数,r代表当前处理的行,c代表当前处理的列*/void Gauss(int a[][N],int n,int m,int &r,int &c){ r = c = 0; for(; r<n && c<m; r++,c++) { int maxi = r; for(int i=r+1; i<n; i++) if(abs(a[i][c]) > abs(a[maxi][c])) maxi = i; if(maxi != r) { for(int i=r; i<m+1; i++) swap(a[r][i],a[maxi][i]); } if(a[r][c] == 0) { r--; continue; } for(int i=r+1; i<n; i++) { if(a[i][c] != 0) { int x = abs(a[i][c]); int y = abs(a[r][c]); int LCM = lcm(x,y);//最小公倍数 int tx = LCM / x; int ty = LCM / y; if(a[i][c] * a[r][c] < 0) ty = -ty; for(int j=c; j<m+1; j++)//主要目的是让 a[i][c]变为0 a[i][j] = a[i][j] * tx - a[r][j] * ty; } } }}int Rewind(int a[][N],int x[],bool f[],int n,int m,int r,int c){ for(int i=r; i<n; i++) if(a[i][c] != 0) return -1; if(r < m)//不一定能解除全部的解 { memset(f,1,sizeof(f)); for(int i=r-1; i>=0; i--) { int id = 0; int cnt = 0; for(int j=0; j<m; j++) { if(a[i][j] != 0 && f[j]) { cnt++; id = j;//这个id是指需要解的那个x } } if(cnt > 1) continue; int t = a[i][m]; //整个方程组的值 for(int j=0; j<m; j++) { if(a[i][j] != 0 && j != id) t -= a[i][j] * x[j]; } x[id] = t / a[i][id]; f[id] = 0;//代表id这列 这个x已经被解出来了 } return m - r; } for(int i=r-1; i>=0; i--)//均能解出 { int t = a[i][c]; for(int j=i+1; j<c; j++) { if(a[i][j] != 0) t -= a[i][j] * x[j]; } if(t % a[i][i] != 0) return -2; x[i] = t / a[i][i]; } return 0;}void Print(int a[][N],int n,int m){ for(int i=0; i<n; i++) { for(int j=0; j<m+1; j++) cout<<a[i][j]<<" "; cout<<endl; }}int a[N][N];int x[N];bool f[N];int main(){ int n,m; while(cin>>n>>m) { for(int i=0; i<n; i++) { for(int j=0; j<m+1; j++) cin>>a[i][j]; } int r,c; Gauss(a,n,m,r,c);//转化为三角形或者是阶梯形 Rewind(a,x,f,n,m,r,c); Print(a,n,m); puts(""); } return 0;}
阅读全文
0 0
- 高斯消元原理
- 高斯消元原理
- 高斯消元原理
- 原理
- 原理
- 原理
- 加法原理乘法原理
- Win32ASM原理
- win32asm原理
- 编译原理
- 创新原理
- 数字签名原理
- 变速箱原理
- 搜索引擎原理
- 乱码原理
- 搜索引擎原理
- 搜索引擎原理
- 彼得原理
- poj1182_并查集详解
- java执行cmd命令的分装类
- 第三方登陆
- linux shell 指令学习小结(一)
- activiti在使用oracle数据库时出现建表错误
- 高斯消元原理
- leetCode之3Sum
- 关于上一篇日志《TWS API 开发手记——连接到TWS平台》的修正
- BZOJ 4802 欧拉函数(素数判定Miller-Rabin+素因子分解Pollard-rho+欧拉函数)
- Android实现APP欢迎页面
- new 重载
- Unity3D shader(5)——vertex shader(一)
- 初识OpenCV
- python中多线程的使用