对于形如一下的方程组,联立很容易借出来,可当变量个数达到一定数目,那会导致算法变得非常笨重



这时才用高斯消去法将会是一个很合适的选择,高斯消去法的思路是把n个线性方程构成n元联立方程组变换为一个等价的上三角方程组(或者下三角)
变成
从而,很容易得出解
下面,我们来看高斯消去法的实现代码
/**
* 高斯消去法
* @author chenxuegui
*
*/
public class GaussElimination
{
public static void main(String[] args)
{
double[][] a = new double[][] { { 2, -1, 1 }, { 4, 1, -1 }, { 1, 1, 1 } };
double[] b = new double[] { 1, 5, 0 };
GaussElimination matrix = new GaussElimination();
System.out.println("消去前:");
matrix.print(a, b);
matrix.BatterGaussElimination(a, b);
System.out.println("消去后:");
matrix.print(a, b);
}
/**
* 高斯消去法(Ax = b)
*
* 把a矩阵消成上三角
*
* @param a
* @param b
*/
private void BatterGaussElimination(double[][] a, double[] b)
{
int maxIndex;
double temp;
// i 表示列、行,对角线
for (int i = 0; i < a.length; i++)
{
// 因为如果a[i][i]太小,temp = (double) a[j][i] /
// a[i][i]的值会很大,以至于a[j][k]的新值因舍入误差而歪曲,所以,应该进行把i行和i列最大的值的行互换
maxIndex = i;
// 选出i列数最大的行
for (int j = i + 1; j < a.length; j++)
{
if (Math.abs(a[maxIndex][i]) < Math.abs(a[j][i]))
{
maxIndex = j;
}
}
// 交换i行和i列中最大数的行,j代表列
for (int j = i; j < a.length; j++)
{
temp = a[maxIndex][j];
a[maxIndex][j] = a[i][j];
a[i][j] = temp;
}
// 同时交换b数组
temp = b[maxIndex];
b[maxIndex] = b[i];
b[i] = temp;
// 把i行一下的行消去第i列,把他消去为0
// j代表行
for (int j = i + 1; j < a.length; j++)
{
temp = (double) a[j][i] / a[i][i];
// k 代表列
for (int k = i; k < a.length; k++)
{
// 主要为了把第i列消为0
a[j][k] -= a[i][k] * temp;
}
b[j] -= b[i] * temp;
}
}
}
/**
* 打印二维数组
*
* @param a
*/
private void print(double[][] a, double[] b)
{
for (int i = 0; i < a.length; i++)
{
for (int j = 0; j < a.length; j++)
{
System.out.print(a[i][j] + " ");
}
System.out.println(b[i]);
}
}
}
结果:
该算法效率为O(n^3)