【问题标题】:Householder's method not returning desired valuesHouseholder 的方法没有返回所需的值
【发布时间】:2019-10-10 14:40:03
【问题描述】:

我正在接受数值方法的诅咒。作为家庭作业的一部分,我被要求实施户主方法。为了做到这一点,我应该研究 Burden 和 Faires 的数值分析。我已经根据这本书中解释的步骤编写了该方法;但是,我没有得到想要的结果。

代码如下:

public static double[][] householder(int n, double[][] matrix) {
double a, rsq, prod = 0, q = 0;
double[] v = new double[n];
double[] u = new double[n];
double[] z = new double[n];

//step 1
for(int k = 0; k < n - 2; k++) {

  //step 2
  for(int j = k + 1; j < n; j++)
    q += Math.pow(matrix[j][k], 2);

  //step 3
  if(matrix[k+1][k] == 0)
    a = -1 * (Math.sqrt(q));
  else
    a = -1 * (Math.sqrt(q) * matrix[k + 1][k] / Math.abs(matrix[k+1][k]));


  //step 4
  rsq = Math.pow(a, 2) - (a * matrix[k + 1][k]);

  //step 5
  v[k + 1] = matrix[k + 1][k] - a;
  for(int j = k + 2; j < n; j++)
    v[j] = matrix[j][k];

  //step 6
  for(int j = k; j < n; j++) {
    double temp = 0;
    for(int i = k + 1; i < n; i++)
      temp += matrix[j][i] * v[i];
    u[j] = (1 / rsq) * temp;
  }

  //step 7
  for(int i = k + 1; i < n; i++)
    prod += v[i] * u[i];

  //step 8
  for(int j = k; j < n; j++)
    z[j] = u[j] - ((prod / (2 * rsq)) * v[j]);

  //step 9
  for(int l = k + 1; l < n - 1; l++) {
    //step 10
    for(int j = l + 1; j < n; j++) {
      matrix[j][l] = matrix[j][l] - (v[l] * z[j]) - (v[j] * z[l]);
      matrix[l][j] = matrix[j][l];
    }
    //step 11
    matrix[l][l] = matrix[l][l] - 2 * (v[l] * z[l]);
  }

  //setp 12
  matrix[n - 1][n - 1] = matrix[n - 1][n - 1] - 2 * (v[n - 1] * z[n - 1]);

  //step 13
  for(int j = k + 2; j < n; j++)
    matrix[k][j] = matrix[j][k] = 0;

  //step 14
  matrix[k + 1][k] = matrix[k + 1][k] - (v[k + 1] * z[k]);
  matrix[k][k + 1] = matrix[k + 1][k];

}
//step 15
return matrix;

}


为了测试方法,我使用了本书中作为示例提供的矩阵:

public static void main(String args[]) {
double matrix[][] ={
  {4, 1, -2, 2},
  {1, 2, 0, 1},
  {-2, 0, 3, -2},
  {2, 1, -2, -1}
};
matrix = householder(matrix.length, matrix);
for (int i=0; i< matrix.length ; i++) {
  for (int j=0; j < matrix[0].length ; j++) {
    System.out.printf("%.4f", matrix[i][j]);
    System.out.print(" | ");
  }
  System.out.println();
}

}


当我使用书中提供的矩阵时,结果值应该与书中的值相同,但事实并非如此。我不知道自己做错了什么,所以如果有人可以提供帮助,我会跳槽。


这是算法: Householder's Method by Numerical Analysis
这些是所需的值:Matrix with desired values after Householder's method

【问题讨论】:

    标签: java math numerical-methods


    【解决方案1】:

    代码中有几个小错误:

    • q 在第 2 步循环之前未设置为 0。
    • v[k] 在第 5 步中未设置为 0。
    • prod 在第 7 步之前未设置为 0。

    其余的看起来不错。我没有测试它。告诉我它是否有效!

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 1970-01-01
      • 2021-04-02
      • 2013-10-31
      • 2017-08-15
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多