高斯消元
给出一个线性方程组,有n个方程组,m个未知数。解这个线性方程组。
输入
第1行:2个整数n和m,(n, m <=400,且n不一定等于m)
接下来n行,每行m+1个整数,表示一个方程的m个未知数的系数和常数(数值不超过1000)
输出
如果无解,输出“No solution”。
如果有唯一解,输出m行,每行一个未知数的值,保留到小数点第4位。格式见样例。
如果有无穷解,输出m行,如果未知数有确定解,直接输出。如果是自由变元,输出“xx not determined ”格式见样例。
呵呵哒~~
具体分析
看到网上很多代码分析,但是处理得都不全面,所以这次发一个能处理几乎所有情况的代码。
我们用到牛顿迭代法,就是先用高斯消元把一个未知数的值算出来,再带回去就可以了。
高斯消元:
举个栗子:
2x - y + 3z = 1
4x + 2y + 5z = 4
2x + 2z = 6
把它变成这样的矩形:
2 -1 3 1
4 2 5 4
2 0 2 6
我们进行3步处理:
1.把在i到n的第i个未知数的绝对值的最大系数放到第i行.
2.用乘法消元法把其它行的第i个未知数消成0
3.把现在第i行的第i个未知数消成常数为1
同时,我们还要满足上三角阵
可能听得很麻木,先看一下代码:
//这是浮点数的做法
//k枚举的是第几个方程,now是在求第now个未知数
for( k = 1 ; k <= n && now <= m ; k ++ , now ++ ){
int j = k;
for( int i = k + 1; i <= n ; i ++ ){
if( fabs(a[j][now]) < fabs( a[i][now] ) )
j = i;//第一步&#x