ガウス・ザイデル法で解ける連立方程式を生成

対角要素の絶対値が大きい方程式だと収束するということなので、そういうデータをでっちあげる。

public class LinearSystem {
    private static int getRandom(int n){
        int i = (int)(Math.random() * n + 1) *
                ((Math.random() < .5) ? 1 : -1);
        return i;
    }
    public static void main(String[] args){
        //求める値(今回はあらかじめ求めておく)
        double[] x = {
            getRandom(10), getRandom(10), getRandom(10), getRandom(10)};
        //係数
        double[][] a = new double[x.length][x.length];
        for(int i = 0; i < a.length; ++i){
            for(int j = 0; j < a[i].length; ++j){
                a[i][j] = getRandom(i == j ? 20 : 5);
            }
        }
        //答え
        double[] y = new double[a.length];
        for(int i = 0; i < y.length; ++i){
            for(int j = 0; j < a[i].length; ++j){
                y[i] += x[j] * a[i][j];
            }
        }

        //式の表示
        String[] ch = {"w", "x", "y", "z"};
        for(int i = 0; i < a.length; ++i){
            String str = "";
            for(int j = 0; j < a[i].length; ++j){
                str += String.format(" %" + 
                        ((j == 0) ? " " : "+") +
                        "2.0f%s", a[i][j], ch[j]);
            }
            System.out.printf("%s=% 2.0f%n", str, y[i]);
        }
        //解を計算する
        double[] s = new double[x.length];
        for(int n = 0; n < 10; ++n){//とりあえず10回
            for(int i = 0; i < x.length; ++i){
                double sum = 0;
                for(int j = 0; j < x.length; ++j){
                    if(i == j) continue;
                    sum += a[i][j] * s[j];
                }
                s[i] = (y[i] - sum) / a[i][i];
            }
            for(int j = 0; j < x.length; ++j){
                System.out.printf("%s(%d)=% 2.1f ", ch[j], n, s[j]);
            }
            System.out.println();
        }
        //準備していた解の表示
        for(int i = 0; i < x.length; ++i){
            System.out.printf("%s=% 2.0f ", ch[i], x[i]);
        }
        System.out.println();
    }
}