计算方法之追赶法

追赶法是解决稀疏矩阵的 一种方法,但应该满足对角占优,否则不能进行计算,下面是程序,语言为java

import java.util.Scanner;

/**
 * Created by q on 2017/11/30.
 */
public class ChasingMethod {
    private int num; //numb比矩阵的阶大一,不用下标是0的空间
    private double a[];
    private double b[];
    private double c[];
    private double y[];

    public ChasingMethod(int num, double[] a, double[] b, double[] c, double[] y) {
        this.num = num;
        this.a = a;
        this.b = b;
        this.c = c;
        this.y = y;
    }
    public boolean check(){  //判断是否对角占优
        if(Math.abs(b[1])<Math.abs(c[1])) return  false;
        for(int i = 2;i <num ;i++){
            double temp = Math.abs(a[i])+ Math.abs(c[i]);
            if(Math.abs(b[i])<temp){
                return false;
            }
        }
        if(Math.abs(b[num])<Math.abs(a[num])) return  false;
        return true;
    }
    public void calB(){
        c[1] =  c[1]*1.0/b[1];
        for(int i = 2;i <num ;i++){
            c[i] = c[i] *1.0/ (b[i] - a[i]* c[i-1]); //Ci = Ci/( bi-aiβi-1)
        }
    }
    public void calY(){
        y[1] = y[1]*1.0 / b[1];
        for(int i = 2;i <= num ;i++){
            y[i] = (y[i] - a[i]*y[i-1])*1.0/ (b[i] - a[i]* c[i-1]);
            //fi = (fi -aiyi-1)/ ( bi-aiβi-1)  (yi-1已存放在fi-1 ,βi-1已存入Ci-1)
        }
    }
    public void calX(){
        for(int i = num-1;i>0;i--){
            y[i] = y[i] - c[i]* y[i+1];//fi = fi -Ci fi+1
        }
    }
    public void print(){
        for(int i = 1;i<=num;i++){
            System.out.println(y[i]);
        }
    }
    public static void main(String [] args){
        Scanner scanner = new Scanner(System.in);
        int n;
        System.out.println("请输入X的个数");
        n = scanner.nextInt();
        double a[] = new double[n+1];
        double b[] = new double[n+1];
        double c[] = new double[n+1];
        double y[] = new double[n+1];
        System.out.println("请输入A数组");
        for(int i=2;i<=n;i++){
            a[i] = scanner.nextDouble();
        }
        System.out.println("请输入B数组");
        for(int i=1;i<=n;i++){
            b[i] = scanner.nextDouble();
        }
        System.out.println("请输入C数组");
        for(int i=1;i<=n-1;i++){
            c[i] = scanner.nextDouble();
        }System.out.println("请输入Y数组");
        for(int i=1;i<=n;i++){
            y[i] = scanner.nextDouble();
        }
        ChasingMethod method = new  ChasingMethod(n,a,b,c,y);
        if(!method.check()){
        	 System.out.println("不满足对焦占优的条件,程序退出");
        	 return;
        }
        method.calB();
        method.calY();
        method.calX();
        method.print();
    }
}


猜你喜欢

转载自blog.csdn.net/baidu_38370610/article/details/78679797