Skip to main content
11 events
when toggle format what by license comment
Jun 27, 2020 at 18:33 comment added Federico Poloni Great! I am glad to be of help, @cyfirx .
Jun 27, 2020 at 16:49 comment added cyfirx Following your advice I have implemented something similar to the GTH algorithm to solve my problem nicely. Thank you very much!
Jun 27, 2020 at 16:48 vote accept cyfirx
Jun 23, 2020 at 5:58 comment added Federico Poloni Numerically, there are dedicated algorithms to compute this vector with very high precision; see e.g. ams.org/journals/mcom/2002-71-237/S0025-5718-01-01325-4/… . In your case, the algorithms in their Section 3 (GTH-like algorithm) should do the job, since essentially you just have to compute an accurate LU decomposition to find the nullspace.
Jun 23, 2020 at 5:55 comment added Federico Poloni Irreducible M-matrices have a kernel of dimension 1, spanned by a vector with positive entries: this is a consequence of the Perron--Frobenius theorem, and should be treated in Berman--Plemmons (it's a while since I used that book though, so I don't have an exact reference). So you should have only one zero singular value, in exact arithmetic, and the other ones are spurious. That is the first interesting bit of information.
Jun 22, 2020 at 22:53 comment added cyfirx Yes, you're right! If I interpret the matrix as a directed graph (ignoring the diagonal elements) there is a path between any two given nodes, thus the entire graph is strongly connected. But I don't see how this helps with the nullspace calculation.
Jun 22, 2020 at 15:31 comment added Federico Poloni There is probably something inside the scipy graph libraries, but I am not sure exactly where to look. Also, it is possible that this comes from free from the structure of your problem.
Jun 22, 2020 at 15:29 comment added Federico Poloni I am glad to hear that the M-matrix tip helped! No, that is a different kind of reduction: you reorder column and row indices symmetrically so that your matrix becomes block triangular with irreducible blocks. Essentially, you wish to split the directed graph associated with the matrix into strongly connected components. This is purely a symbolic operation, without actual floating-point computations in it.
Jun 22, 2020 at 15:18 comment added cyfirx Numerical investigations thus far have supported the assumption that they are indeed M-matrices but I am not sure how to implement the block-triangularisation (I assume this means to split the matrix into blocks and perform row operations on the entire matrix until each block is zero above or below it's diagonal) and then extract the nullspace vector. Will I find a library function to do this eg scipy or will I need to write my own?
Jun 22, 2020 at 15:07 comment added cyfirx Thanks for the summary. I have attempted a linear programming approach which improves the accuracy but fails for a significant number of cases and does not perform well. For this reason I have begun to investigate M-matrices as you have suggested and I think I may be able to prove my A is an M-matrix using the characterisation detailed in "R. Plemmons, Nonnegative Matrices in the Mathematical Science" p149, however I need time to check this and familiarise myself with some issues with the notation.
Jun 22, 2020 at 7:07 history answered Federico Poloni CC BY-SA 4.0