由于某些原因,我的Jacobi方法覆盖了x_old变量。
public static double[] Jacobi(double[][] A, double[] b, double tol) {
int m = b.length;
double[] x = b;
double err = tol*100;
while(err > tol) {
double[] x_old = x;
for(int i = 0; i < m; i++) {
double sum = 0.0;
for(int j = 0; j < m; j++) {
if(i != j){
sum += A[i][j]*x_old[j];
}
}
System.out.println(sum);
x[i] = (b[i]-sum)/A[i][i];
}
printVector(x);
printVector(x_old);
err = norm(subtract(x,x_old));
}
return x;
}测试代码
double[][] A = {{1.48 , 5.244, 0, -2},{4, 2, 4, 7}, {9, 2, 11, -3}, {-1, 0.2, 3, 12}};
double[][] B = {{92 , 1.3, 0.5, 0.5},{2, 23.3, 1, 0.3}, {0, -2, 28, 3.3}, {-1, 0.2, 3, 12}};
double[][] v = {{2 , 1, 1, 0},{4, 3, 3, 1}, {8, 7, 9, 5}, {6, 7, 9, 8}};
double[] x = {-2, 4, 13.2, 0.22};
double[] y = {1.5, -3, 8.87, 0.6};
double[] c = MyMath.Jacobi(B,y,1e-10);结果:
0.8349999999999993 9.06445652173913 3.015575667102071 0.516473922373577
0.007228260869565225 -0.5177878335510356 0.20908658331778313 0.0069605064688685785
显然,程序退出是因为错误变为零。我不明白这是怎么回事。有什么想法吗?
还有一个附注,我有另一个重写A的函数。
public static double[][] cholesky(double[][] A) {
int m = A.length; // rows
double akk, akjkk;
for(int k = 0 ; k < m ; k++){
akk = A[k][k];
for(int j = k+1 ; j < m ; j++){
akjkk = A[k][j]/akk;
for(int i = j ; i < m ; i++){
A[j][i] -= A[k][i]*akjkk;
}
}
for(int i = k ; i < m ; i++){
A[k][i] /= Math.sqrt(akk);
}
}
return A;
}我确信有一个显而易见的解决方案,但是当我将一个矩阵U传递给函数,然后稍后尝试访问U时,我收到了被覆盖的版本。有没有一种方法可以在不在函数中复制矩阵的情况下改变这一点?
发布于 2016-02-27 00:35:26
如果任何人对这段代码的工作原理感到好奇:
public static double[] Jacobi(double[][] A, double[] b, double tol) {
int m = b.length;
double[] x_old = new double[m];
double[] x = new double[m];
double err = tol*10;
while(err > tol) {
System.arraycopy(x,0,x_old,0,m);
for(int i = 0; i < m; i++) {
double sum = 0.0;
for(int j = 0; j < m; j++) {
if(i != j){
sum += A[i][j]*x_old[j];
}
}
x[i] = (b[i]-sum)/A[i][i];
}
err = norm(subtract(x,x_old));
}
return x;
}这可能是设置x= x_old时的内存分配问题。IIRC在java中使用等号实际上引用了旧的变量(我对b也引用了两次)。习惯于Matlab。我唯一的问题是,我是否可以设置double[][] MatrixInsideFunction = A;,或者是否必须再次执行复制数组。
https://stackoverflow.com/questions/35642569
复制相似问题