数值计算之Hilbert


public class Hilb {

public static void MathOne(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 MathTwo(double[][] a, double[] b, double[] result, int n) {
   MathOne(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("ErrorOne");
     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("ErrorTwo");
     System.exit(0);
    }
    result[j] /= a[j][j];
    for (int i = 0; i < j - 1; i++) {
     result[i] -= a[j][i] * result[j];
    }
   }
   System.out.println("**********************************************");
   System.out.println("This is L:");
  
   for (int i = 0; i < n; i++) {
    for (int j = 0; j <=i; j++)
     System.out.print(a[i][j] + "\t");
    System.out.println();
   }

}

public static void fun(double[][] a, double[] b, int n) {
   for (int i = 0; i < n; i++)
    for (int j = 0; j <= i; j++)
     a[i][j] = 1.0 / (i + j + 1);
   for (int i = 0; i < n; i++) {
    b[i] = 0;
    for (int j = n + i; j > i; j--)
     b[i] += 1.0 / j;
   }
   System.out.println("**********************************************");
   System.out.println("This is a:");
  
   for (int i = 0; i < n; i++) {
    for (int j = 0; j <= i; j++)
     System.out.print(a[i][j] + "\t");
    System.out.println();
   }
   System.out.println("**********************************************");
   System.out.println("This is b:");

   for (int i = 0; i < n; i++)
    System.out.println(b[i]);

}

public static void main(String[] args) {
   System.out.println("Please enter the value of n:");
   int m=SavitchIn.readLineInt();
   int n = m;
   double[][] a = new double[n][n];
   double[] b = new double[n];
   double[][] c = new double[n][n];
   fun(a, b, n);
   for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
     c[i][j] = a[i][j];
   double[] r = new double[n];
   double[] result = new double[n];
   MathTwo(a, b, result, n);
   System.out.println("**********************************************");
   System.out.println("Solution:");
  
   for (int i = 0; i < n; i++)
    System.out.println(result[i]);
   for (int i = 0; i < n; i++) {
    double x = 0;
    for (int j = 0; j < n; j++)
     x += c[i][j] * result[j];
    r[i] = b[i] - x;
   }
   System.out.println("**********************************************");
   System.out.println("Residual:");
   for (int i = 0; i < n; i++)
   
    System.out.println(r[i]);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值