public static void InverseDeterminant(DualMatrix matrix, out DualMatrix inverse, out DualNumber determinant)
        {
            int n = matrix.Rows;
            if (matrix.Columns != n)
            {
                throw new ArgumentException("The matrix is not a square matrix.");
            }

            DualNumber[,] a = matrix.ToArray();

            if (!spdmatrixcholesky(ref a, n, false))
            {
                throw new ArithmeticException();
            }

            determinant = spdmatrixcholeskydet(ref a, n);

            int info = 0;
            spdmatrixcholeskyinverse(ref a, n, false, ref info);

            for (int i = 0; i < n; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    a[i, j] = a[j, i];
                }
            }

            inverse = new DualMatrix(a);
        }
        public static DualMatrix Inverse(DualMatrix matrix)
        {
            int n = matrix.Rows;
            if (matrix.Columns != n)
            {
                throw new ArgumentException("The matrix is not a square matrix.");
            }

            DualNumber[,] a = matrix.ToArray();
            int info = 0;
            spdmatrixinverse(ref a, n, false, ref info);
            if (info != 1)
            {
                throw new ArithmeticException();
            }

            for (int i = 0; i < n; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    a[i, j] = a[j, i];
                }
            }

            return new DualMatrix(a);
        }