数值计算之五

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

<script type="text/javascript" id="wumiiRelatedItems"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值