import java.util.Scanner;
/**
* @author Janus
* @creator 2020-03-10-17:10
*/
public class Cholesky {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int row=scanner.nextInt();
double[][] a=new double[row][row];
double[] b=new double[row];
double[][] l=new double[row][row];
double[] d=new double[row];
double[] y=new double[row];
double[] x=new double[row];
Input2D(a,scanner);
Output2D(a);
Input1D(b,scanner);
Output1D(b);
iniL(l);
System.out.printf("L:\n");
Output2D(l);
for(int k=0;k<row;++k){
d[k]=a[k][k];
for(int i=0;i<k;++i){
d[k]-=l[k][i]*l[k][i]*d[i];
}
for(int i=k+1;i<row;++i){
double temp=a[k][i];
for(int j=0;j<k;++j){
temp-=l[k][j]*d[j]*l[i][j];
}
l[i][k]=temp/(l[k][k]*d[k]);
}
}
System.out.printf("D:\n");
Output1D(d);
System.out.printf("L:\n");
Output2D(l);
y[0]=b[0];
for(int i=1;i<row;++i){
y[i]=b[i];
for(int k=0;k<i;++k){
y[i]-=l[i][k]*y[k];
}
}
System.out.printf("Y:\n");
Output1D(y);
x[row-1]=y[row-1]/d[row-1];
for(int i=row-2;i>=0;--i){
x[i]=y[i]/d[i];
for(int k=i+1;k<row;++k){
x[i]-=l[k][i]*x[k];
}
}
System.out.printf("X:\n");
Output1D(x);
}
public static void Input2D(double[][] matrix, Scanner scanner){
for(int i=0;i<matrix.length;++i){
Input1D(matrix[i],scanner);
}
}
public static void Input1D(double[] arr, Scanner scanner){
for(int j=0;j<arr.length;++j){
arr[j]=scanner.nextDouble();
}
}
public static void Output1D(double[] arr){
for(double temp:arr){
System.out.printf("%+.6f\t",temp);
}
System.out.print('\n');
}
public static void Output2D(double[][] matrix){
for(double[] temp:matrix){
Output1D(temp);
}
System.out.print('\n');
}
public static void iniL(double[][] l){
for(int i=0;i<l.length;++i){
l[i][i]=1;
}
}
}
工程计算-改进的Cholesky分解
最新推荐文章于 2023-11-16 14:04:50 发布