高斯消去法

本文介绍了一种用于求解线性方程组的高斯消去法,通过将方程组转化为上三角形式,简化了解决过程。详细展示了算法的实现代码,包括矩阵互换与消元步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

2x + y - z = 8 \quad (L_1)
-3x - y + 2z = -11 \quad (L_2)
-2x + y + 2z = -3 \quad (L_3)

这时才用高斯消去法将会是一个很合适的选择,高斯消去法的思路是把n个线性方程构成n元联立方程组变换为一个等价的上三角方程组(或者下三角)

\begin{pmatrix}2 & 1 & -1 & 8 \\-3 & -1 & 2 & -11 \\-2 & 1 & 2 & -3\end{pmatrix}            变成      \begin{pmatrix}2 & 1 & -1 & 8 \\0 & \frac{1}{2} & \frac{1}{2} & 1 \\0 & 0 & -1 & 1\end{pmatrix}


从而,很容易得出解


下面,我们来看高斯消去法的实现代码

/**
 * 高斯消去法
 * @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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值