我正在接受数字方法的诅咒。作为家庭作业的一部分,我被要求实施《住户方法》。为了做到这一点,我本应该研究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
答案 0 :(得分:0)
代码中有几个小错误:
q
在步骤2中循环之前未设置为0。v[k]
在步骤5中未设置为0。prod
在步骤7之前未设置为0。其余的看起来不错。我没有测试。告诉我是否可行!