Java 覆盖旧x的jacobi方法

Java 覆盖旧x的jacobi方法,java,scope,numerical-methods,Java,Scope,Numerical Methods,出于某种原因,我的Jacobi方法正在覆盖x_旧变量 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

出于某种原因,我的Jacobi方法正在覆盖x_旧变量

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;
}
导致

0.83499999993 9.06445652173913 3.015575667102071 0.516473922373577

[0.00722826089695225-0.5177878335510356 0.20908658331778313 0.0069605064685785] [0.00722826089695225-0.5177878335510356 0.20908658331778313 0.0069605064685785]

显然,程序退出是因为错误变为零。我不明白这是怎么回事。有什么想法吗

还有一个旁注,我有另一个函数,它覆盖了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;
}
publicstaticdouble[]cholesky(double[]A){
int m=A.length;//行
双akk,akjkk;
对于(int k=0;k

我确信有一个明显的解决方案,但是当我将矩阵U传递到函数中,然后稍后尝试访问U时,我会收到被覆盖的版本。有没有一种方法可以在不复制函数中的矩阵的情况下更改此代码?

如果有人好奇此代码是否有效:

    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;
}
publicstaticdouble[]Jacobi(double[]A,double[]b,double tol){
int m=b.长度;
double[]x_old=新的double[m];
双精度[]x=新双精度[m];
双误差=tol*10;
while(err>tol){
数组副本(x,0,x_old,0,m);
for(int i=0;i

当设置x=x_old时,可能是内存分配问题。在java中使用等号的IIRC实际上引用了旧变量(我在b中也做了两次)。习惯了Matlab。对于cholesky函数,根据我的理解,我认为唯一真正的解决方案是在函数的范围内调用一个新变量,我希望这可以避免内存问题,但如果我想存储原始a并创建一个相同大小的新矩阵,我相信总体内存消耗不会有太大改变。我唯一的问题是是否可以设置
double[][]MatrixInsideFunction=A或者如果我必须再次执行复制数组。

每次通过
while
循环,您都在声明
old_x
。这就是你想要的吗?哈哈,不,我在之前发布的一个问题中被告知要这么做。我想至少在解决这个问题方面不会有什么坏处。
    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;
}