高斯消元法 - Java实现

高斯消元法


原理(CMU - PSP):

1. I = 1


2. LET P=A[K] , I = max { |A[J, I]| , I <= J <= N}


3. IF P = 0 THEN EXIT


4. IF K > I THEN FOR J = I TO N + 1, SWAP A[I, J] AND A[K, J]


5. 
5.a FOR J = I + 1 TO N + 1 LET A[I, J] = A[I, J] / A[I, I]

    5.b SET A[I, I]  = 1


6. FOR L = I + 1 to N, multiply row I by -A[L, I]   and add to row L


7. I = I + 1. IF I < N THEN GO TO 2


8. EXIT to back-substitution


/*cb*/public class GaussElimination {
	private double[][] matrix;
	
	/*mb*/public double[] gaussElimination(double[][] m) {
		this.matrix = m;

		final int N = matrix.length;
		final double[] ret = new double[N];
				
		int i = 0;
		int j = 0;
		int k;
		while(i < N - 1) {
			k = findMax(matrix, i);
			
			if(k > i) {
				for(j = i; j < N + 1; j ++) {
					swap(i, j, k);
				}
			}
						
			for(j = i + 1; j < N + 1; j ++) {
				matrix[i][j] /= matrix[i][i];
			}
			matrix[i][i] = 1.0;
						
			for(int l = i + 1; l < N; l ++) {
				double factor = -matrix[l][i];
				for(int c = 0; c < matrix[0].length; c ++) {
					matrix[l][c] += matrix[i][c] * factor;
				}
			}
			
			i ++;
		}
		 
		for(int s = N - 1; s >= 0; s --) {
			if(s == N - 1) {
				ret[s] = matrix[s][matrix[s].length - 1] / matrix[s][matrix[s].length - 2];
			} else {
				ret[s] = matrix[s][matrix[s].length - 1];
				int t = matrix[s].length - 2;
				for(; t > s; t --) {
					ret[s] -= ret[t] * matrix[s][t];
				}
				ret[s] /= matrix[s][t];
			}
		}
		
		return ret;
	}/*me*/
	
	/*mb*/private int findMax(double[][] matrix, int position) {
		int index = 0;
		
		double max = 0.0;
		for(int i = position; i < matrix.length; i ++) {
			if(Math.abs(matrix[i][position]) > max) {
				max = matrix[i][position];
				index = i;
			}
		}
		
		return index;
	}/*me*/
	
	/*mb*/private void swap(int i, int j, int k) {
		double temp = matrix[i][j];
		matrix[i][j] = matrix[k][j];
		matrix[k][j] = temp;
	}/*me*/
	
}/*ce*/



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值