import java.util.Scanner;
/**
* @author Janus
* @creator 2020-03-09-9:42
*/
public class Gauss {
private int rowNum;
private int columnNum;
private double[][] matrix;
public static void main(String[] Args) {
Scanner scanner = new Scanner(System.in);
Gauss obj = new Gauss(scanner.nextInt(),scanner.nextInt());
obj.Input();
obj.Output();
obj.GaussElimination();
obj.Output();
System.out.printf("行列式的值为: %f \n",obj.det());
}
public void GaussElimination(){
double max;
int maxRowNum;
for(int i=0;i<rowNum-1;++i){
max=matrix[i][i];
if(max==0){
System.err.printf("行列式等于0");
System.exit(1);
}
maxRowNum=i;
for(int j=i+1;j<rowNum;++j){
if(Math.abs(max)<Math.abs(matrix[j][i])){
max=matrix[j][i];
maxRowNum=j;
}
}
swapRow(i+1,maxRowNum+1);
for(int j=i+1;j<rowNum;++j){
RowAdd(j+1,i+1,(-matrix[j][i]/matrix[i][i]));
}
}
GaussEliminationAnswer();
}
private void GaussEliminationAnswer(){
double[] ans=new double[rowNum];
double temp;
for(int i=rowNum-1;i>=0;--i){
temp=matrix[i][columnNum-1];
for(int j=i+1;j<rowNum;++j){
temp-=ans[j]*matrix[i][j];
}
ans[i]=temp/matrix[i][i];
}
for(int i=0;i<rowNum;++i){
System.out.printf("X%d = %f\n",i,ans[i]);
}
}
public Gauss (int r, int c) {
if(c-r>1){
System.err.printf("方程有无穷多解\n");
System.exit(1);
}
this.rowNum = r;
this.columnNum = c;
matrix = new double[r][c];
}
public double det(){
double sum=1;
for(int i=0;i<rowNum;++i){
sum*=matrix[i][i];
}
return sum;
}
public void RowAdd(int r1, int r2, double rate) {
r1--;
r2--;
for (int i = 0; i < columnNum; ++i) {
matrix[r1][i] += matrix[r2][i] * rate;
}
}
public void ColumnAdd(int c1, int c2, double rate) {
c1--;
c2--;
for (int i = 0; i < rowNum; ++i) {
matrix[i][c1] += matrix[i][c2] * rate;
}
}
public void swapRow(int r1, int r2) {
r1--;
r2--;
double temp;
for (int i = 0; i < columnNum; ++i) {
temp = matrix[r1][i];
matrix[r1][i] = matrix[r2][i];
matrix[r2][i] = temp;
}
}
public void swapColumn(int c1, int c2) {
c1--;
c2--;
double temp;
for (int i = 0; i < rowNum; ++i) {
temp=matrix[i][c1];
matrix[i][c1]=matrix[i][c2];
matrix[i][c2]=temp;
}
}
public void multiplyRow(int r,double rate) {
for(int i=0;i<columnNum;++i){
matrix[r][i]*=rate;
}
}
public void multiplyColumn(int c,double rate) {
for(int i=0;i<rowNum;++i){
matrix[i][c]*=rate;
}
}
public final void Output() {
for (int i = 0; i < rowNum; ++i) {
for (int j = 0; j < columnNum; ++j) {
System.out.printf("%+3.6f\t", matrix[i][j]);
}
System.out.printf("\n");
}
System.out.printf("\n");
}
public void Input() {
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < rowNum; ++i) {
for (int j = 0; j < columnNum; ++j) {
matrix[i][j] = scanner.nextDouble();
}
}
}
}
工程计算-列主元Gauss消去法
最新推荐文章于 2024-04-20 11:02:39 发布