public class test5 {
public static void g(double[][] a, double[] b, int m, int n) {
for (int i = 0; i < m; i++)
a[i][0] = 1;
for (int i = 0; i < m; i++)
for (int j = 0; j < n - 1; j++)
a[i][j + 1] = a[i][j] * b[i];
}
// 楚列斯基分解
public static void M(double[][] a, int n) {
for (int k = 0; k < n; k++) {
a[k][k] = Math.sqrt(a[k][k]);
for (int i = k + 1; i < n; i++)
a[i][k] /= a[k][k];
for (int j = k + 1; j < n; j++)
for (int i = j; i < n; i++)
a[i][j] -= a[i][k] * a[j][k];
}
}
// 对楚列斯基分解后的结果求解
public static void res(double[][] a, double[] b, double[] result, int n) {
M(a, n);
for (int i = 0; i < n; i++)
result[i] = b[i];
for (int j = 0; j < n; j++) {
if (a[j][j] == 0) {
System.out.println("Error1");
System.exit(0);
}
result[j] /= a[j][j];
for (int i = j + 1; i < n; i++)
result[i] -= a[i][j] * result[j];
}
for (int j = n - 1; j >= 0; j--) {
if (a[j][j] == 0) {
System.out.println("Error2");
System.exit(0);
}
result[j] /= a[j][j];
for (int i = 0; i < j; i++) {
result[i] -= a[j][i] * result[j];
}
}
}
// 求出A的转置和A的乘机,和A的转置和b的乘机
public static void produce(double a[][], double b[], int m, int n,
double c[][], double d[]) {
for (int row = 0; row < n; row++)
for (int column = 0; column < n; column++)
for (int count = 0; count < m; count++)
c[row][column] += a[count][row] * a[count][column];
for (int row = 0; row < n; row++)
for (int count = 0; count < m; count++)
d[row] += a[count][row] * b[count];
}
public static void main(String[] args) {
int m = 6;
double[] a = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
double[] b = { 1.0, 2.7, 5.8, 6.6, 7.5, 9.9 };
for(int n = 1;n<=6;n++){
System.out.println("当n="+(n-1)+"时:");
double[][] new_a = new double[m][n];
g(new_a, a, m, n);
System.out.println("A");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
System.out.print(new_a[i][j] + "\t");
System.out.println();
}
System.out.println("b");
for(int i=0;i<m;i++)
System.out.println(b[i]);
double[][] aa = new double[m][n];
double[] bb = new double[n];
produce(new_a, b, m, n, aa, bb);
System.out.println("AA");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
System.out.print(aa[i][j] + "\t");
System.out.println();
}
System.out.println("Ab");
for(int i=0;i<n;i++)
System.out.println(bb[i]);
double[]r=new double[n];
res(aa,bb,r,n);
System.out.println("结果:");
for(int i=0;i<n;i++)
System.out.println(r[i]);
}}
}