工程计算-改进的Cholesky分解

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;
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值