package com.mybolgs.common;import java.math.BigDecimal; import java.math.RoundingMode;public class Equation { private static final BigDecimal ZERO = new BigDecimal("0"); private static final BigDecimal ONE = new BigDecimal("1");
public static void main(String[] args) { /** * 方程组 * 3.4x + 50.2y = 44.5 * 2.1x + 0.55y = 5.9 */ BigDecimal[][] matrix = new BigDecimal[][]{ {new BigDecimal("3.4"), new BigDecimal("50.2"), new BigDecimal("44.5")}, {new BigDecimal("2.1"), new BigDecimal("0.55"), new BigDecimal("5.9")} }; BigDecimal[] rst = new Equation().solveEquation(matrix, 3, RoundingMode.HALF_UP); for (int i = 0; i < rst.length; ++i) { System.out.println(rst[i]); } }
import java.math.RoundingMode;public class Equation {
private static final BigDecimal ZERO = new BigDecimal("0");
private static final BigDecimal ONE = new BigDecimal("1");
public static void main(String[] args) {
/**
* 方程组
* 3.4x + 50.2y = 44.5
* 2.1x + 0.55y = 5.9 */
BigDecimal[][] matrix = new BigDecimal[][]{
{new BigDecimal("3.4"), new BigDecimal("50.2"), new BigDecimal("44.5")},
{new BigDecimal("2.1"), new BigDecimal("0.55"), new BigDecimal("5.9")}
};
BigDecimal[] rst = new Equation().solveEquation(matrix, 3, RoundingMode.HALF_UP);
for (int i = 0; i < rst.length; ++i) {
System.out.println(rst[i]);
}
}
/**
* 解多元一次方程组
* 只能解决n个变量n个方程的情况,即矩阵是n*(n+1)的形式
* @param matrix 矩阵
* @param scale 精确小数位数
* @param roundingMode 舍入模式
* @return
*/
public BigDecimal[] solveEquation(BigDecimal[][] matrix, int scale, RoundingMode roundingMode){
if(isNullOrEmptyMatrix(matrix)){
return new BigDecimal[0];
}
BigDecimal[][] triangular = elimination(matrix, scale, roundingMode);
return substitutionUpMethod(triangular, scale, roundingMode);
}
/**
* 用高斯消元法将矩阵变为上三角形矩阵
*
* @param matrix
* @param scale 精确小数位数
* @param roundingMode 舍入模式
* @return
*/
private BigDecimal[][] elimination(BigDecimal[][] matrix, int scale, RoundingMode roundingMode) {
if(isNullOrEmptyMatrix(matrix) || matrix.length != matrix[0].length - 1){
return new BigDecimal[0][0];
}
int matrixLine = matrix.length;
for (int i = 0; i < matrixLine - 1; ++i) {
//第j行的数据 - (第i行的数据 / matrix[i][i])*matrix[j][i]
for (int j = i + 1; j < matrixLine; ++j) {
for (int k = i + 1; k <= matrixLine; ++k) {
//matrix[j][k] = matrix[j][k] - (matrix[i][k]/matrix[i][i])*matrix[j][i];
matrix[j][k] = matrix[j][k].subtract((matrix[i][k].divide(matrix[i][i], scale, roundingMode).multiply(matrix[j][i])));
}
matrix[j][i] = ZERO;
}
}
return matrix;
}
/**
* 回代求解(针对上三角形矩阵)
*
* @param matrix 上三角阵
* @param scale 精确小数位数
* @param roundingMode 舍入模式
*/
private BigDecimal[] substitutionUpMethod(BigDecimal[][] matrix, int scale, RoundingMode roundingMode) {
int row = matrix.length;
for (int i = 0; i < row; ++i) {
if (matrix[i][i].equals(ZERO.setScale(scale))) {//方程无解或者解不惟一
return new BigDecimal[0];
}
}
BigDecimal[] result = new BigDecimal[row];
for (int i = 0; i < result.length; ++i) {
result[i] = ONE;
}
BigDecimal tmp;
for (int i = row - 1; i >= 0; --i) {
tmp = ZERO;
int j = row - 1;
while (j > i) {
tmp = tmp.add(matrix[i][j].multiply(result[j]));
--j;
}
result[i] = matrix[i][row].subtract(tmp).divide(matrix[i][i], scale, roundingMode);
}
return result;
}
/**
* 判断系数矩阵是否是null或空数组
* @param matrix 系数矩阵
* @return null或空数组返回true,否则返回false
*/
private static boolean isNullOrEmptyMatrix(BigDecimal[][] matrix){
if(matrix == null || matrix.length == 0){
return true;
}
int row = matrix.length;
int col = matrix[0].length;
for(int i = 0; i < row; ++i){
for(int j = 0; j < col; ++j){
if(matrix[i][j] == null){
return true;
}
}
}
return false;
}
}摘自 http://www.oschina.net/code/snippet_657390_47828
* 求二元一次方程的解
* @param a [3.4,50.2,44.5]
* @param b [2.1,55,5.9]
* @return
*/
public static double[] arithmetic_a_b(double[] a,double[] b) {
double[] result=new double[a.length-1];
if (a!=null&&b!=null) {
result[1]=(a[2]*b[0]-b[2]*a[0])/(a[1]*b[0]-b[1]*a[0]);
result[0]=(a[2]-a[1]*result[1])/a[0];
}
return result;
}
完整程序参考——http://www.dingwave.com/bbs/forum.php?mod=viewthread&tid=132&extra=