対角要素の絶対値が大きい方程式だと収束するということなので、そういうデータをでっちあげる。
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(); } }