Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算方阵的指数_Java_Arrays_Recursion_Matrix_Exponential - Fatal编程技术网

Java 计算方阵的指数

Java 计算方阵的指数,java,arrays,recursion,matrix,exponential,Java,Arrays,Recursion,Matrix,Exponential,我想写一个计算平方矩阵指数的方法。在本例中,矩阵是值的平方数组: [1 0] [0 10] 方法应返回以下值: [e 0] [0 e^10] 然而,当我运行我的代码时,我会得到一个值范围,这取决于我重新排列的位,并不特别接近预期值 该方法的工作方式是利用矩阵的幂级数,因此基本上对于矩阵a、n步和单位矩阵I: 经验(A)=I+A+1/2*AA+1/3*AAA++1/n*AAA 代码如下。我遇到问题的方法是指数法(矩阵A,int-nSteps)。所涉及的方法是封闭的,矩阵对象使用参数(int m

我想写一个计算平方矩阵指数的方法。在本例中,矩阵是值的平方数组:

[1 0] [0 10] 方法应返回以下值:

[e 0] [0 e^10] 然而,当我运行我的代码时,我会得到一个值范围,这取决于我重新排列的位,并不特别接近预期值

该方法的工作方式是利用矩阵的幂级数,因此基本上对于矩阵a、n步和单位矩阵I:

经验(A)=I+A+1/2*AA+1/3*AAA++1/n*AAA

代码如下。我遇到问题的方法是指数法(矩阵A,int-nSteps)。所涉及的方法是封闭的,矩阵对象使用参数(int m,int n)创建一个大小为双[m][n]的数组

    public static Matrix multiply(Matrix m1, Matrix m2){

    if(m1.getN()!=m2.getM()) return null;

    Matrix res = new Matrix(m1.getM(), m2.getN());

    for(int i = 0; i < m1.getM(); i++){
        for(int j = 0; j < m2.getN(); j++){
            res.getArray()[i][j] = 0;
            for(int k = 0; k < m1.getN(); k++){
                res.getArray()[i][j] = res.getArray()[i][j] + m1.getArray()[i][k]*m2.getArray()[k][j];
            }
        }
    }   
    return res;
}


public static Matrix identityMatrix(int M){

    Matrix id = new Matrix(M, M);

    for(int i = 0; i < id.getM(); i++){
        for(int j = 0; j < id.getN(); j++){
            if(i==j) id.getArray()[i][j] = 1;
            else id.getArray()[i][j] = 0;
        }
    }
    return id;
}


public static Matrix addMatrix(Matrix m1, Matrix m2){
    Matrix m3 = new Matrix(m1.getM(), m2.getN());
    
    for(int i = 0; i < m3.getM(); i++){
        for(int j = 0; j < m3.getN(); j++){
            m3.getArray()[i][j] = m1.getArray()[i][j] + m2.getArray()[i][j];
        }
    }       
    return m3;
}


public static Matrix scaleMatrix(Matrix m, double scale){
    Matrix res = new Matrix(m.getM(), m.getN());
    for(int i = 0; i < res.getM(); i++){
        for(int j = 0; j < res.getN(); j++){
            res.getArray()[i][j] = m.getArray()[i][j]*scale;
        }
    }
    return res;
}


public static Matrix exponential(Matrix A, int nSteps){
    
    Matrix runtot = identityMatrix(A.getM());
    Matrix sum = identityMatrix(A.getM());
    
    double factorial = 1.0;
    
    for(int i = 1; i <= nSteps; i++){

        sum = Matrix.multiply(Matrix.scaleMatrix(sum, factorial), A);
        runtot = Matrix.addMatrix(runtot, sum);
        factorial /= (double)i;

    }
    return runtot;
}
公共静态矩阵乘法(矩阵m1,矩阵m2){
如果(m1.getN()!=m2.getM())返回null;
矩阵res=新矩阵(m1.getM(),m2.getN());
对于(int i=0;i对于(int i=1;i我的方法是保留两个蓄能器:

  • 总和,即exp(A)的近似值
  • 数列M_n的第n项,即A^n/n
注意,M_n有一个很好的递归关系:M_{n+1}=M_n*a/(n+1)

这将产生:

public static Matrix exponential(Matrix A, int nSteps){

    Matrix seriesTerm = identityMatrix(A.getM());
    Matrix sum = identityMatrix(A.getM());

    for(int i = 1; i <= nSteps; i++){
        seriesTerm = Matrix.scaleMatrix(Matrix.multiply(seriesTerm,A),1.0/i);
        sum = Matrix.addMatrix(seriesTerm, sum);
    }
    return sum;
}
公共静态矩阵指数(矩阵A,int nSteps){
矩阵seriesTerm=identityMatrix(A.getM());
矩阵和=identityMatrix(A.getM());

对于(int i=1;i)你想开发自己的矩阵指数实现有什么原因吗?与之相反,比如说,使用哪种方法有一个有效的实现?@paisanco我正在通过一系列练习来改进我的java,这就是其中之一。很公平,只要检查一下,就没有人回答“只使用JBLAS”别担心,这是最不受欢迎的项目。另外,这种方法对于e的值来说非常有效,但是对于e^10,它似乎超出了大约10倍。是我刚刚错误地实现了您的代码,还是您也遇到了这个问题?我承认我没有试过这段代码:)。如果它对e有效,我想它是正确的;我并不惊讶事情很快就失控了,因为双精度并没有那么大,我们在这里讨论了很多运算。如果你想检查正确性,你可以尝试用相同的近似值计算e^10(标量)。另外,用[[0-PI][PI 0]],看看你离-I2有多近。