You have 4 equations with 16 unknowns, so there are going to be a lot of 
solutions. 

Many SymPy functions struggle with M[i, j] construction which creates 
MatrixElement instead of an ordinary Symbol. I would use a Matrix filled 
with Symbols: 

M = sp.Matrix(sp.symarray('M', (4, 4)))
sp.solve(a - M*b, list(M))

This returns

{M_3_0: (-M_3_1*(a0 + a1 + a2 + a3) - M_3_2*a1 - M_3_3*(a1 + 2*a2 + 3*a3) + 
a0)/a0, M_2_0: (-M_2_1*(a0 + a1 + a2 + a3) - M_2_2*a1 - M_2_3*(a1 + 2*a2 + 3
*a3) + a1)/a0, M_1_0: (-M_1_1*(a0 + a1 + a2 + a3) - M_1_2*a1 - M_1_3*(a1 + 2
*a2 + 3*a3) + a2)/a0, M_0_0: (-M_0_1*(a0 + a1 + a2 + a3) - M_0_2*a1 - M_0_3
*(a1 + 2*a2 + 3*a3) + a3)/a0}

which, as previously mentioned, is a lot of solutions. You can plug in some 
arbitrary numbers for the free variables here. 



On Saturday, March 10, 2018 at 7:38:00 AM UTC-5, Matthias Geier wrote:
>
> Dear list. 
>
> I have this equation: 
>
>     a = M * b, 
>
> where a and b are column vectors and M is a 4x4 matrix. 
> a and b consist of quite simple expressions, M is unknown: 
>
> >>> import sympy as sp 
> >>> a0, a1, a2, a3 = sp.symbols('a:4') 
> >>> a = sp.Matrix([a3, a2, a1, a0]) 
> >>> b = sp.Matrix([a0, a3 + a2 + a1 + a0, a1, 3 * a3 + 2 * a2 + a1]) 
> >>> M = sp.MatrixSymbol('M', 4, 4) 
> >>> sp.Eq(a, M * b) 
> Eq(Matrix([[a3], [a2], [a1], [a0]]), M*Matrix([ 
> [               a0], 
> [a0 + a1 + a2 + a3], 
> [               a1], 
> [ a1 + 2*a2 + 3*a3]])) 
>
> What's the most straightforward way to solve this for M? 
>
> I have actually found a way, but it seems a bit non-obvious to me: 
>
> >>> def get_value(i, j): 
> ...     return b[i].as_coefficients_dict()[a[j]] 
> ... 
> >>> M_inv = sp.Matrix(4, 4, get_value) 
> >>> M_inv.inv() 
> Matrix([ 
> [ 2, -2,  1,  1], 
> [-3,  3, -2, -1], 
> [ 0,  0,  1,  0], 
> [ 1,  0,  0,  0]]) 
>
> This is the solution I'm looking for, but I was hoping there is a 
> better way to get it. 
> Also, the way I did it I had to know that I could look for the inverse 
> and then undo the inverse afterwards, but I would prefer if there is a 
> solution without this manual step. 
>
> Thanks in advance! 
>
> cheers, 
> Matthias 
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/2bf0325e-6eab-48f2-8299-e1df21998030%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to