I have the following 24x24 square matrix, H, that has a non 0 determinent:
Matrix([
[ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R8, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R6, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R3, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R2, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R1, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -R0],
[-1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[-1.0, 0.0, 1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 1.0, -1.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, -1.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]])
Whenever I try to compute H.inv() to obtain the inverse of the matrix, python just hangs infinitely. It does not crash, nor return an error.
using sympy.inverse(H) returns H**-1 (as in it returns the full uninverted matrix and adds **-1 on the end), but if I then try to multiply this matrix by another matrix, e.g, a column vector, I get the same infinite hanging again.
What is the cause of this? Can sympy just not handle matrices this large or is there something wrong with the original matrix H?
Computing the inverse of a matrix like this will get much faster in SymPy soon. I have an implementation that can invert this in 24 seconds but that can also be improved. As suggested in the comments the new implementation is generally faster with integer/rational than float.
It takes a long time partly because sympy can be made more efficient but also because the answer is complicated even if the matrix itself looks simple. In fact I just tried to post the answer here but SO said
Body is limited to 30000 chars; you entered 2691249
so it is too complicated to show here.
Instead I'll just show the upper-left entry of the inverse matrix:
In [23]: ok[0, 0]
Out[23]:
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
R₀⋅R₁⋅R₁₁⋅R₂ + R₀⋅R₁⋅R₁₁⋅R₄ + R₀⋅R₁⋅R₁₁⋅R₇ + R₀⋅R₁⋅R₁₁⋅R₉ + R₀⋅R₁⋅R₂⋅R₃ + R₀⋅R₁⋅R₂⋅R₅ + R₀⋅R₁⋅R₂⋅R₉ + R₀⋅R₁⋅R₃⋅R₄ + R₀⋅R₁⋅R₃⋅R₇ + R₀⋅R₁⋅R₃⋅R₉ + R₀⋅R₁⋅R₄⋅R₅
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
+ R₀⋅R₁⋅R₄⋅R₉ + R₀⋅R₁⋅R₅⋅R₇ + R₀⋅R₁⋅R₅⋅R₉ + R₀⋅R₁⋅R₇⋅R₉ + R₀⋅R₁₀⋅R₁₁⋅R₂ + R₀⋅R₁₀⋅R₁₁⋅R₄ + R₀⋅R₁₀⋅R₁₁⋅R₇ + R₀⋅R₁₀⋅R₁₁⋅R₉ + R₀⋅R₁₀⋅R₂⋅R₃ + R₀⋅R₁₀⋅R₂⋅R₅ + R₀⋅R
R₀⋅R₁⋅R₁₁⋅R₂ + R₀⋅R₁⋅R₁₁⋅R₄ + R₀⋅R₁⋅R₁₁⋅R₇ + R₀⋅R₁⋅R₁₁⋅R₉ + R₀⋅R₁⋅R₂
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₁₀⋅R₂⋅R₉ + R₀⋅R₁₀⋅R₃⋅R₄ + R₀⋅R₁₀⋅R₃⋅R₇ + R₀⋅R₁₀⋅R₃⋅R₉ + R₀⋅R₁₀⋅R₄⋅R₅ + R₀⋅R₁₀⋅R₄⋅R₉ + R₀⋅R₁₀⋅R₅⋅R₇ + R₀⋅R₁₀⋅R₅⋅R₉ + R₀⋅R₁₀⋅R₇⋅R₉ + R₀⋅R₁₁⋅R₂⋅R₃ + R₀⋅R₁₁⋅R₂⋅
⋅R₃ + R₀⋅R₁⋅R₂⋅R₉ + R₀⋅R₁⋅R₃⋅R₄ + R₀⋅R₁⋅R₃⋅R₇ + R₀⋅R₁⋅R₃⋅R₉ + R₀⋅R₁⋅R₄⋅R₉ + R₀⋅R₁⋅R₇⋅R₉ + R₀⋅R₁₀⋅R₁₁⋅R₂ + R₀⋅R₁₀⋅R₁₁⋅R₄ + R₀⋅R₁₀⋅R₁₁⋅R₇ + R₀⋅R₁₀⋅R₁₁⋅R₉ + R₀
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
R₈ + R₀⋅R₁₁⋅R₃⋅R₄ + R₀⋅R₁₁⋅R₃⋅R₇ + R₀⋅R₁₁⋅R₃⋅R₉ + R₀⋅R₁₁⋅R₄⋅R₈ + R₀⋅R₁₁⋅R₇⋅R₈ + R₀⋅R₁₁⋅R₈⋅R₉ + R₀⋅R₂⋅R₃⋅R₅ + R₀⋅R₂⋅R₃⋅R₈ + R₀⋅R₂⋅R₃⋅R₉ + R₀⋅R₂⋅R₅⋅R₈ + R₀⋅R₂
⋅R₁₀⋅R₂⋅R₃ + R₀⋅R₁₀⋅R₂⋅R₉ + R₀⋅R₁₀⋅R₃⋅R₄ + R₀⋅R₁₀⋅R₃⋅R₇ + R₀⋅R₁₀⋅R₃⋅R₉ + R₀⋅R₁₀⋅R₄⋅R₉ + R₀⋅R₁₀⋅R₇⋅R₉ + R₀⋅R₁₁⋅R₂⋅R₃ + R₀⋅R₁₁⋅R₂⋅R₈ + R₀⋅R₁₁⋅R₃⋅R₄ + R₀⋅R₁₁⋅R
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⋅R₈⋅R₉ + R₀⋅R₃⋅R₄⋅R₅ + R₀⋅R₃⋅R₄⋅R₈ + R₀⋅R₃⋅R₄⋅R₉ + R₀⋅R₃⋅R₅⋅R₇ + R₀⋅R₃⋅R₅⋅R₉ + R₀⋅R₃⋅R₇⋅R₈ + R₀⋅R₃⋅R₇⋅R₉ + R₀⋅R₃⋅R₈⋅R₉ + R₀⋅R₄⋅R₅⋅R₈ + R₀⋅R₄⋅R₈⋅R₉ + R₀⋅R₅⋅R
₃⋅R₇ + R₀⋅R₁₁⋅R₃⋅R₉ + R₀⋅R₁₁⋅R₄⋅R₈ + R₀⋅R₁₁⋅R₇⋅R₈ + R₀⋅R₁₁⋅R₈⋅R₉ + R₀⋅R₂⋅R₃⋅R₈ + R₀⋅R₂⋅R₃⋅R₉ + R₀⋅R₂⋅R₈⋅R₉ + R₀⋅R₃⋅R₄⋅R₈ + R₀⋅R₃⋅R₄⋅R₉ + R₀⋅R₃⋅R₇⋅R₈ + R₀⋅R₃
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₇⋅R₈ + R₀⋅R₅⋅R₈⋅R₉ + R₀⋅R₇⋅R₈⋅R₉ + R₁⋅R₁₁⋅R₂⋅R₄ + R₁⋅R₁₁⋅R₂⋅R₆ + R₁⋅R₁₁⋅R₂⋅R₇ + R₁⋅R₁₁⋅R₂⋅R₈ + R₁⋅R₁₁⋅R₂⋅R₉ + R₁⋅R₁₁⋅R₄⋅R₆ + R₁⋅R₁₁⋅R₄⋅R₈ + R₁⋅R₁₁⋅R₆⋅R₇ + R
⋅R₇⋅R₉ + R₀⋅R₃⋅R₈⋅R₉ + R₀⋅R₄⋅R₈⋅R₉ + R₀⋅R₇⋅R₈⋅R₉ + R₁⋅R₁₁⋅R₂⋅R₄ + R₁⋅R₁₁⋅R₂⋅R₆ + R₁⋅R₁₁⋅R₂⋅R₇ + R₁⋅R₁₁⋅R₂⋅R₈ + R₁⋅R₁₁⋅R₂⋅R₉ + R₁⋅R₁₁⋅R₄⋅R₆ + R₁⋅R₁₁⋅R₄⋅R₈ +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₁⋅R₁₁⋅R₆⋅R₉ + R₁⋅R₁₁⋅R₇⋅R₈ + R₁⋅R₁₁⋅R₈⋅R₉ + R₁⋅R₂⋅R₃⋅R₄ + R₁⋅R₂⋅R₃⋅R₆ + R₁⋅R₂⋅R₃⋅R₇ + R₁⋅R₂⋅R₃⋅R₈ + R₁⋅R₂⋅R₃⋅R₉ + R₁⋅R₂⋅R₄⋅R₅ + R₁⋅R₂⋅R₄⋅R₉ + R₁⋅R₂⋅R₅⋅R₆ +
R₁⋅R₁₁⋅R₆⋅R₇ + R₁⋅R₁₁⋅R₆⋅R₉ + R₁⋅R₁₁⋅R₇⋅R₈ + R₁⋅R₁₁⋅R₈⋅R₉ + R₁⋅R₂⋅R₃⋅R₄ + R₁⋅R₂⋅R₃⋅R₆ + R₁⋅R₂⋅R₃⋅R₇ + R₁⋅R₂⋅R₃⋅R₈ + R₁⋅R₂⋅R₃⋅R₉ + R₁⋅R₂⋅R₄⋅R₉ + R₁⋅R₂⋅R₆⋅R₉
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
R₁⋅R₂⋅R₅⋅R₇ + R₁⋅R₂⋅R₅⋅R₈ + R₁⋅R₂⋅R₅⋅R₉ + R₁⋅R₂⋅R₆⋅R₉ + R₁⋅R₂⋅R₇⋅R₉ + R₁⋅R₂⋅R₈⋅R₉ + R₁⋅R₃⋅R₄⋅R₆ + R₁⋅R₃⋅R₄⋅R₈ + R₁⋅R₃⋅R₆⋅R₇ + R₁⋅R₃⋅R₆⋅R₉ + R₁⋅R₃⋅R₇⋅R₈ + R₁
+ R₁⋅R₂⋅R₇⋅R₉ + R₁⋅R₂⋅R₈⋅R₉ + R₁⋅R₃⋅R₄⋅R₆ + R₁⋅R₃⋅R₄⋅R₈ + R₁⋅R₃⋅R₆⋅R₇ + R₁⋅R₃⋅R₆⋅R₉ + R₁⋅R₃⋅R₇⋅R₈ + R₁⋅R₃⋅R₈⋅R₉ + R₁⋅R₄⋅R₆⋅R₉ + R₁⋅R₄⋅R₈⋅R₉ + R₁⋅R₆⋅R₇⋅R₉ +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⋅R₃⋅R₈⋅R₉ + R₁⋅R₄⋅R₅⋅R₆ + R₁⋅R₄⋅R₅⋅R₈ + R₁⋅R₄⋅R₆⋅R₉ + R₁⋅R₄⋅R₈⋅R₉ + R₁⋅R₅⋅R₆⋅R₇ + R₁⋅R₅⋅R₆⋅R₉ + R₁⋅R₅⋅R₇⋅R₈ + R₁⋅R₅⋅R₈⋅R₉ + R₁⋅R₆⋅R₇⋅R₉ + R₁⋅R₇⋅R₈⋅R₉ + R₁₀⋅
R₁⋅R₇⋅R₈⋅R₉ + R₁₀⋅R₁₁⋅R₂⋅R₄ + R₁₀⋅R₁₁⋅R₂⋅R₆ + R₁₀⋅R₁₁⋅R₂⋅R₇ + R₁₀⋅R₁₁⋅R₂⋅R₈ + R₁₀⋅R₁₁⋅R₂⋅R₉ + R₁₀⋅R₁₁⋅R₄⋅R₆ + R₁₀⋅R₁₁⋅R₄⋅R₈ + R₁₀⋅R₁₁⋅R₆⋅R₇ + R₁₀⋅R₁₁⋅R₆⋅R₉
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
R₁₁⋅R₂⋅R₄ + R₁₀⋅R₁₁⋅R₂⋅R₆ + R₁₀⋅R₁₁⋅R₂⋅R₇ + R₁₀⋅R₁₁⋅R₂⋅R₈ + R₁₀⋅R₁₁⋅R₂⋅R₉ + R₁₀⋅R₁₁⋅R₄⋅R₆ + R₁₀⋅R₁₁⋅R₄⋅R₈ + R₁₀⋅R₁₁⋅R₆⋅R₇ + R₁₀⋅R₁₁⋅R₆⋅R₉ + R₁₀⋅R₁₁⋅R₇⋅R₈ +
+ R₁₀⋅R₁₁⋅R₇⋅R₈ + R₁₀⋅R₁₁⋅R₈⋅R₉ + R₁₀⋅R₂⋅R₃⋅R₄ + R₁₀⋅R₂⋅R₃⋅R₆ + R₁₀⋅R₂⋅R₃⋅R₇ + R₁₀⋅R₂⋅R₃⋅R₈ + R₁₀⋅R₂⋅R₃⋅R₉ + R₁₀⋅R₂⋅R₄⋅R₉ + R₁₀⋅R₂⋅R₆⋅R₉ + R₁₀⋅R₂⋅R₇⋅R₉ + R₁
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
R₁₀⋅R₁₁⋅R₈⋅R₉ + R₁₀⋅R₂⋅R₃⋅R₄ + R₁₀⋅R₂⋅R₃⋅R₆ + R₁₀⋅R₂⋅R₃⋅R₇ + R₁₀⋅R₂⋅R₃⋅R₈ + R₁₀⋅R₂⋅R₃⋅R₉ + R₁₀⋅R₂⋅R₄⋅R₅ + R₁₀⋅R₂⋅R₄⋅R₉ + R₁₀⋅R₂⋅R₅⋅R₆ + R₁₀⋅R₂⋅R₅⋅R₇ + R₁₀⋅R
₀⋅R₂⋅R₈⋅R₉ + R₁₀⋅R₃⋅R₄⋅R₆ + R₁₀⋅R₃⋅R₄⋅R₈ + R₁₀⋅R₃⋅R₆⋅R₇ + R₁₀⋅R₃⋅R₆⋅R₉ + R₁₀⋅R₃⋅R₇⋅R₈ + R₁₀⋅R₃⋅R₈⋅R₉ + R₁₀⋅R₄⋅R₆⋅R₉ + R₁₀⋅R₄⋅R₈⋅R₉ + R₁₀⋅R₆⋅R₇⋅R₉ + R₁₀⋅R₇⋅R
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₂⋅R₅⋅R₈ + R₁₀⋅R₂⋅R₅⋅R₉ + R₁₀⋅R₂⋅R₆⋅R₉ + R₁₀⋅R₂⋅R₇⋅R₉ + R₁₀⋅R₂⋅R₈⋅R₉ + R₁₀⋅R₃⋅R₄⋅R₆ + R₁₀⋅R₃⋅R₄⋅R₈ + R₁₀⋅R₃⋅R₆⋅R₇ + R₁₀⋅R₃⋅R₆⋅R₉ + R₁₀⋅R₃⋅R₇⋅R₈ + R₁₀⋅R₃⋅R₈⋅R
₈⋅R₉ + R₁₁⋅R₂⋅R₃⋅R₄ + R₁₁⋅R₂⋅R₃⋅R₆ + R₁₁⋅R₂⋅R₃⋅R₇ + R₁₁⋅R₂⋅R₃⋅R₈ + R₁₁⋅R₂⋅R₃⋅R₉ + R₁₁⋅R₂⋅R₄⋅R₈ + R₁₁⋅R₂⋅R₆⋅R₈ + R₁₁⋅R₂⋅R₇⋅R₈ + R₁₁⋅R₂⋅R₈⋅R₉ + R₁₁⋅R₃⋅R₄⋅R₆ +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₉ + R₁₀⋅R₄⋅R₅⋅R₆ + R₁₀⋅R₄⋅R₅⋅R₈ + R₁₀⋅R₄⋅R₆⋅R₉ + R₁₀⋅R₄⋅R₈⋅R₉ + R₁₀⋅R₅⋅R₆⋅R₇ + R₁₀⋅R₅⋅R₆⋅R₉ + R₁₀⋅R₅⋅R₇⋅R₈ + R₁₀⋅R₅⋅R₈⋅R₉ + R₁₀⋅R₆⋅R₇⋅R₉ + R₁₀⋅R₇⋅R₈⋅R₉ + R₁
R₁₁⋅R₃⋅R₄⋅R₈ + R₁₁⋅R₃⋅R₆⋅R₇ + R₁₁⋅R₃⋅R₆⋅R₉ + R₁₁⋅R₃⋅R₇⋅R₈ + R₁₁⋅R₃⋅R₈⋅R₉ + R₁₁⋅R₄⋅R₆⋅R₈ + R₁₁⋅R₆⋅R₇⋅R₈ + R₁₁⋅R₆⋅R₈⋅R₉ + R₂⋅R₃⋅R₄⋅R₈ + R₂⋅R₃⋅R₄⋅R₉ + R₂⋅R₃⋅R
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₁⋅R₂⋅R₃⋅R₄ + R₁₁⋅R₂⋅R₃⋅R₆ + R₁₁⋅R₂⋅R₃⋅R₇ + R₁₁⋅R₂⋅R₃⋅R₈ + R₁₁⋅R₂⋅R₃⋅R₉ + R₁₁⋅R₂⋅R₄⋅R₈ + R₁₁⋅R₂⋅R₆⋅R₈ + R₁₁⋅R₂⋅R₇⋅R₈ + R₁₁⋅R₂⋅R₈⋅R₉ + R₁₁⋅R₃⋅R₄⋅R₆ + R₁₁⋅R₃⋅R
₆⋅R₈ + R₂⋅R₃⋅R₆⋅R₉ + R₂⋅R₃⋅R₇⋅R₈ + R₂⋅R₃⋅R₇⋅R₉ + R₂⋅R₄⋅R₈⋅R₉ + R₂⋅R₆⋅R₈⋅R₉ + R₂⋅R₇⋅R₈⋅R₉ + R₃⋅R₄⋅R₆⋅R₈ + R₃⋅R₄⋅R₆⋅R₉ + R₃⋅R₄⋅R₈⋅R₉ + R₃⋅R₆⋅R₇⋅R₈ + R₃⋅R₆⋅R₇⋅
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₄⋅R₈ + R₁₁⋅R₃⋅R₆⋅R₇ + R₁₁⋅R₃⋅R₆⋅R₉ + R₁₁⋅R₃⋅R₇⋅R₈ + R₁₁⋅R₃⋅R₈⋅R₉ + R₁₁⋅R₄⋅R₆⋅R₈ + R₁₁⋅R₆⋅R₇⋅R₈ + R₁₁⋅R₆⋅R₈⋅R₉ + R₂⋅R₃⋅R₄⋅R₅ + R₂⋅R₃⋅R₄⋅R₈ + R₂⋅R₃⋅R₄⋅R₉ + R₂
R₉ + R₃⋅R₆⋅R₈⋅R₉ + R₃⋅R₇⋅R₈⋅R₉ + R₄⋅R₆⋅R₈⋅R₉ + R₆⋅R₇⋅R₈⋅R₉
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⋅R₃⋅R₅⋅R₆ + R₂⋅R₃⋅R₅⋅R₇ + R₂⋅R₃⋅R₅⋅R₈ + R₂⋅R₃⋅R₅⋅R₉ + R₂⋅R₃⋅R₆⋅R₈ + R₂⋅R₃⋅R₆⋅R₉ + R₂⋅R₃⋅R₇⋅R₈ + R₂⋅R₃⋅R₇⋅R₉ + R₂⋅R₄⋅R₅⋅R₈ + R₂⋅R₄⋅R₈⋅R₉ + R₂⋅R₅⋅R₆⋅R₈ + R₂⋅R
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
₅⋅R₇⋅R₈ + R₂⋅R₅⋅R₈⋅R₉ + R₂⋅R₆⋅R₈⋅R₉ + R₂⋅R₇⋅R₈⋅R₉ + R₃⋅R₄⋅R₅⋅R₆ + R₃⋅R₄⋅R₅⋅R₈ + R₃⋅R₄⋅R₆⋅R₈ + R₃⋅R₄⋅R₆⋅R₉ + R₃⋅R₄⋅R₈⋅R₉ + R₃⋅R₅⋅R₆⋅R₇ + R₃⋅R₅⋅R₆⋅R₉ + R₃⋅R₅⋅
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
R₇⋅R₈ + R₃⋅R₅⋅R₈⋅R₉ + R₃⋅R₆⋅R₇⋅R₈ + R₃⋅R₆⋅R₇⋅R₉ + R₃⋅R₆⋅R₈⋅R₉ + R₃⋅R₇⋅R₈⋅R₉ + R₄⋅R₅⋅R₆⋅R₈ + R₄⋅R₆⋅R₈⋅R₉ + R₅⋅R₆⋅R₇⋅R₈ + R₅⋅R₆⋅R₈⋅R₉ + R₆⋅R₇⋅R₈⋅R₉
I'm trying to solve an equation system with 16 equations and 16 unknowns using sympy but it doesn't seem to solve it well.
I want to solve the system [K][d]=[f] where [K] is the coefficients matrix, [d] the unknowns and [f] are constants. I know some unknowns "d" and some constants "f", so I have same number for both equations and unknowns, but when I substitute these values into the equations and try to solve it the results for all "dx" include "dx8". I checked the matrix determinant and is positive so I should get a unique answer.
Here is the code:
import sympy as sp
import numpy as np
K = np.array([[560000000.0, 0.0, -480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0,-80000000.0, 120000000.0, 0.0, -200000000.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 393333333.3, 120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0,80000000.0, -213333333.3, -200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[-480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0, 0.0, 0.0],
[80000000.0, -180000000.0, -200000000.0, 786666666.7, 120000000.0,-180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0, -426666666.7,-200000000.0, 0.0, 0.0, 0.0],
[0.0, 0.0, -480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0],
[0.0, 0.0, 80000000.0, -180000000.0, -200000000.0, 786666666.7,120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0,-426666666.7, -200000000.0, 0.0],
[0.0, 0.0, 0.0, 0.0, -480000000.0, 120000000.0, 560000000.0,-200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -80000000.0, 80000000.0],
[0.0, 0.0, 0.0, 0.0, 80000000.0, -180000000.0, -200000000.0,393333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 120000000.0,-213333333.3],
[-80000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 560000000.0,-200000000.0, -480000000.0, 120000000.0, 0.0, 0.0, 0.0, 0.0],
[120000000.0, -213333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,-200000000.0, 393333333.3, 80000000.0, -180000000.0, 0.0, 0.0, 0.0,0.0],
[0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0, 0.0, 0.0,-480000000.0, 80000000.0, 1120000000.0, -200000000.0, -480000000.0,120000000.0, 0.0, 0.0],
[-200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0, 0.0, 0.0,120000000.0, -180000000.0, -200000000.0, 786666666.7, 80000000.0,-180000000.0, 0.0, 0.0],
[0.0, 0.0, 0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0,0.0, 0.0, -480000000.0, 80000000.0, 1120000000.0, -200000000.0,-480000000.0, 120000000.0],
[0.0, 0.0, -200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0,0.0, 0.0, 120000000.0, -180000000.0, -200000000.0, 786666666.7,80000000.0, -180000000.0],
[0.0, 0.0, 0.0, 0.0, 0.0, -200000000.0, -80000000.0, 120000000.0,0.0, 0.0, 0.0, 0.0, -480000000.0, 80000000.0, 560000000.0, 0.0],
[0.0, 0.0, 0.0, 0.0, -200000000.0, 0.0, 80000000.0, -213333333.3,0.0, 0.0, 0.0, 0.0, 120000000.0, -180000000.0, 0.0, 393333333.3]])
x = [sp.var('dx'+ str(i+1)) for i in range(8)]
y = [sp.var('dy'+ str(i+1)) for i in range(8)]
fx = [sp.var('fx'+ str(i+1)) for i in range(8)]
fy = [sp.var('fy'+ str(i+1)) for i in range(8)]
xy = list(sum(zip(x, y), ()))
fxy = list(sum(zip(fx, fy), ()))
M = sp.Matrix(K)*sp.Matrix(xy)
Ec = [sp.Eq(M[i], fxy[i]) for i in range(16)]
#known values
d_kwn = [(dy1, 0), (dy2, 0), (dy3, 0), (dy4, 0)]
f_kwn = [(fx5, 0), (fy5, 0), (fx6, 0), (fy6, -3000), (fx7, 0), (fy7, -3000),(fx8, 0), (fy8, 0), (fx1, 0), (fx2, 0), (fx3, 0), (fx4, 0)]
for var in d_kwn:
for i, eq in enumerate(Ec):
Ec[i] = eq.subs(var[0], var[1])
for var in f_kwn:
for i, eq in enumerate(Ec):
Ec[i] = eq.subs(var[0], var[1])
Sols = sp.solvers.solve(Ec)
sp.Matrix(sorted(Sols.items(), key=str))
And this is the output I'm getting:
{dx1: dx8−3.54468009860439⋅10−6,
dx2: dx8−1.8414987360977⋅10−6,
dx3: dx8−2.11496606381994⋅10−7,
dx4: dx8+2.05943267588118⋅10−7,
dx5: dx8−1.24937663359153⋅10−6,
dx6: dx8−1.55655946713284⋅10−6,
dx7: dx8−1.08797652070783⋅10−6,
dy5: −2.10639657360695⋅10−6,
dy6: −6.26959460018537⋅10−6,
dy7: −6.32191585665888⋅10−6,
dy8: −2.7105825114088⋅10−6,
fy1: 439.746516706791,
fy2: 2640.65618690176,
fy3: 2399.44807607611,
fy4: 520.14922031534}
I don't know why I'm not getting a result for dx8. I tried adding more equations because theoretically: dx1 = dx4, dx2 = dx3, dx5 = dx8, dx6 = dx7 and so on. But it gives me and empty list.
Any help will be appreciated.
If you need to use Sympy, then the following may work. First we can solve the reduced system of equations only for unknown d values. Then once we know all d values we can calculate the unknown f values by doing [K][d]=[f] for only the unknown f equation numbers (not implemented in the code below).
import sympy as sp
import numpy as np
K = np.array([[560000000.0, 0.0, -480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0,-80000000.0, 120000000.0, 0.0, -200000000.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 393333333.3, 120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0,80000000.0, -213333333.3, -200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[-480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0, 0.0, 0.0],
[80000000.0, -180000000.0, -200000000.0, 786666666.7, 120000000.0,-180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0, -426666666.7,-200000000.0, 0.0, 0.0, 0.0],
[0.0, 0.0, -480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0],
[0.0, 0.0, 80000000.0, -180000000.0, -200000000.0, 786666666.7,120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0,-426666666.7, -200000000.0, 0.0],
[0.0, 0.0, 0.0, 0.0, -480000000.0, 120000000.0, 560000000.0,-200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -80000000.0, 80000000.0],
[0.0, 0.0, 0.0, 0.0, 80000000.0, -180000000.0, -200000000.0,393333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 120000000.0,-213333333.3],
[-80000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 560000000.0,-200000000.0, -480000000.0, 120000000.0, 0.0, 0.0, 0.0, 0.0],
[120000000.0, -213333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,-200000000.0, 393333333.3, 80000000.0, -180000000.0, 0.0, 0.0, 0.0,0.0],
[0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0, 0.0, 0.0,-480000000.0, 80000000.0, 1120000000.0, -200000000.0, -480000000.0,120000000.0, 0.0, 0.0],
[-200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0, 0.0, 0.0,120000000.0, -180000000.0, -200000000.0, 786666666.7, 80000000.0,-180000000.0, 0.0, 0.0],
[0.0, 0.0, 0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0,0.0, 0.0, -480000000.0, 80000000.0, 1120000000.0, -200000000.0,-480000000.0, 120000000.0],
[0.0, 0.0, -200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0,0.0, 0.0, 120000000.0, -180000000.0, -200000000.0, 786666666.7,80000000.0, -180000000.0],
[0.0, 0.0, 0.0, 0.0, 0.0, -200000000.0, -80000000.0, 120000000.0,0.0, 0.0, 0.0, 0.0, -480000000.0, 80000000.0, 560000000.0, 0.0],
[0.0, 0.0, 0.0, 0.0, -200000000.0, 0.0, 80000000.0, -213333333.3,0.0, 0.0, 0.0, 0.0, 120000000.0, -180000000.0, 0.0, 393333333.3]])
x = [sp.var('dx'+ str(i+1)) for i in range(8)]
y = [sp.var('dy'+ str(i+1)) for i in range(8)]
fx = [sp.var('fx'+ str(i+1)) for i in range(8)]
fy = [sp.var('fy'+ str(i+1)) for i in range(8)]
xy = list(sum(zip(x, y), ()))
fxy = list(sum(zip(fx, fy), ()))
M = sp.Matrix(K)*sp.Matrix(xy)
Ec = [sp.Eq(M[i], fxy[i]) for i in range(16)]
#known values
d_kwn = [(dy1, 0), (dy2, 0), (dy3, 0), (dy4, 0)]
f_kwn = [(fx5, 0), (fy5, 0), (fx6, 0), (fy6, -3000), (fx7, 0), (fy7, -3000),(fx8, 0), (fy8, 0), (fx1, 0), (fx2, 0), (fx3, 0), (fx4, 0)]
for var in d_kwn:
for i, eq in enumerate(Ec):
Ec[i] = eq.subs(var[0], var[1])
for var in f_kwn:
for i, eq in enumerate(Ec):
Ec[i] = eq.subs(var[0], var[1])
Ec_part = []
for i in [0,2,4,6,8,9,10,11,12,13,14,15]:
Ec_part.append(Ec[i])
unknwns = [*x, *y[4:8]]
Sols = sp.linsolve(Ec_part,unknwns)
Sols = next( iter(Sols) )
#sp.Matrix(sorted(Sols.items(), key=str))
It is convenient to solve system of linear equations in Numpy itself. The type of system you are solving appears in Finite Element Analysis often with boundary conditions. Is it fine if we only use Numpy? If yes, the following code will do the job. We already know which elements of f and d are known we can use Numpy array indexing to solve the reduced set of equations as follows:
import numpy as np
# The NxN Coefficients matrix
K = np.array([[560000000.0, 0.0, -480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0,-80000000.0, 120000000.0, 0.0, -200000000.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 393333333.3, 120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0,80000000.0, -213333333.3, -200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[-480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0, 0.0, 0.0],
[80000000.0, -180000000.0, -200000000.0, 786666666.7, 120000000.0,-180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0, -426666666.7,-200000000.0, 0.0, 0.0, 0.0],
[0.0, 0.0, -480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0],
[0.0, 0.0, 80000000.0, -180000000.0, -200000000.0, 786666666.7,120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0,-426666666.7, -200000000.0, 0.0],
[0.0, 0.0, 0.0, 0.0, -480000000.0, 120000000.0, 560000000.0,-200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -80000000.0, 80000000.0],
[0.0, 0.0, 0.0, 0.0, 80000000.0, -180000000.0, -200000000.0,393333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 120000000.0,-213333333.3],
[-80000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 560000000.0,-200000000.0, -480000000.0, 120000000.0, 0.0, 0.0, 0.0, 0.0],
[120000000.0, -213333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,-200000000.0, 393333333.3, 80000000.0, -180000000.0, 0.0, 0.0, 0.0,0.0],
[0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0, 0.0, 0.0,-480000000.0, 80000000.0, 1120000000.0, -200000000.0, -480000000.0,120000000.0, 0.0, 0.0],
[-200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0, 0.0, 0.0,120000000.0, -180000000.0, -200000000.0, 786666666.7, 80000000.0,-180000000.0, 0.0, 0.0],
[0.0, 0.0, 0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0,0.0, 0.0, -480000000.0, 80000000.0, 1120000000.0, -200000000.0,-480000000.0, 120000000.0],
[0.0, 0.0, -200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0,0.0, 0.0, 120000000.0, -180000000.0, -200000000.0, 786666666.7,80000000.0, -180000000.0],
[0.0, 0.0, 0.0, 0.0, 0.0, -200000000.0, -80000000.0, 120000000.0,0.0, 0.0, 0.0, 0.0, -480000000.0, 80000000.0, 560000000.0, 0.0],
[0.0, 0.0, 0.0, 0.0, -200000000.0, 0.0, 80000000.0, -213333333.3,0.0, 0.0, 0.0, 0.0, 120000000.0, -180000000.0, 0.0, 393333333.3]])
# A logical array for indexing
N = K.shape[0] # The number of columns in K
N_2 = int(N/2);
# Prepare the 'f'
fx = np.zeros( N_2 );
fy = np.zeros( N_2 );
fx[ [0,1,2,3,4,5,6,7] ] = np.array([0]*N_2) # Known values of fx
fy[ [4,5,6,7] ] = np.array([0,-3000,-3000,0])
f = np.concatenate( (fx,fy) )
# Solve for the unknown equations only
d = np.zeros( N )
rows = np.array([0,1,2,3,4,5,6,7,12,13,14,15])
rows = rows[:, np.newaxis]
columns = np.array([0,1,2,3,4,5,6,7,12,13,14,15])
d[ columns ] = np.linalg.solve( K[ rows, columns ], f[ columns ] )
# Calculate unknown f values
f[ [8,9,10,11] ] = K[ [8,9,10,11], [8,9,10,11] ]*d[[8,9,10,11]]