1

我解决了以下等式:

在此处输入图像描述

为了解决它,我想使用矩阵指数:

在此处输入图像描述

我想了 3 种方法来做到这一点:

  1. 我可能会错过它,但 Oj-Algo 可以有一种简单的方法来计算 exp(A)(我在 MatrixStore javadoc 中没有找到它)
  2. 我从 EigenValue 方法 ([A] = [V][D][V] -1 ) 得到矩阵 D 和 V 然后我计算 然后首先出现的问题是我如何应用 x->exp(x*t) 函数到 D 的所有对角线元素?在此处输入图像描述
  3. 最后一个想法与 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();
    }
}
4

0 回答 0