我解决了以下等式:
为了解决它,我想使用矩阵指数:
我想了 3 种方法来做到这一点:
- 我可能会错过它,但 Oj-Algo 可以有一种简单的方法来计算 exp(A)(我在 MatrixStore javadoc 中没有找到它)
- 我从 EigenValue 方法 ([A] = [V][D][V] -1 ) 得到矩阵 D 和 V 然后我计算
然后首先出现的问题是我如何应用 x->exp(x*t) 函数到 D 的所有对角线元素?
- 最后一个想法与 2 基本相同。但我之前将标量矩阵乘积存储在一个新矩阵 ([X] = [D]*(-t)) 中,然后我计算:
你能帮我找到我应该使用的最佳方式/方法/课程吗?谢谢
注意:这个问题是“后续问题”:初始问题
编辑:这是我现在尝试过的,这是最好的方法吗?:
import static org.ojalgo.function.PrimitiveFunction.EXP;
public class SolveDifferentialEquationTest
{
private static final PhysicalStore.Factory<Double, PrimitiveDenseStore> matrixFactory = PrimitiveDenseStore.FACTORY;
public static void main(String[] args)
{
SparseStore<Double> matrix;
final PhysicalStore<Double> diagMatrix;
final PhysicalStore<Double> eigenVectorMatrix;
final PhysicalStore<Double> inverseEigenVectorMatrix;
final Eigenvalue<Double> eigenvalue;
final int time = 100;
PhysicalStore<Double> initialVector;
final PhysicalStore<Double> finalVector;
int dim = 2000;
matrix = SparseStore.PRIMITIVE.make(dim, dim);
initialVector = matrixFactory.makeZero(dim,1);
// fill matrix and initialVector
//...
//Decompose matrix
eigenvalue = Eigenvalue.PRIMITIVE.make(matrix);
eigenvalue.decompose(matrix);
diagMatrix = eigenvalue.getD().copy();
eigenVectorMatrix = eigenvalue.getV().copy();
InverterTask<Double> inverter = InverterTask.PRIMITIVE.make(eigenVectorMatrix);
try {
inverseEigenVectorMatrix = inverter.invert(eigenVectorMatrix).copy();
} catch (RecoverableCondition e) {
throw new RuntimeException(e);
}
// Construct exp(Dt)
diagMatrix.multiply(time);
diagMatrix.modifyDiagonal(EXP);
// Compute
finalVector = inverseEigenVectorMatrix.multiply(diagMatrix)
.multiply(eigenVectorMatrix)
.multiply(initialVector)
.copy();
}
}