Java 计算方阵的指数
我想写一个计算平方矩阵指数的方法。在本例中,矩阵是值的平方数组: [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]的数组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
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有多近。