简体   繁体   中英

Solving linear system

I have 16 equations:

a, b, c, d, e, f, g = symbols('a, b, c, d, e, f, g', real=True)
z00, z01, z02, z03 = symbols('z00, z01, z02, z03', real=True)
z10, z11, z12, z13 = symbols('z10, z11, z12, z13', real=True)
z20, z21, z22, z23 = symbols('z20, z21, z22, z23', real=True)
z30, z31, z32, z33 = symbols('z30, z31, z32, z33', real=True)    

Eq(z00, g)
Eq(z03, b + d + f + g)
Eq(-z00 + 6*z01 - 12*z02 + 8*z03, 8*b + 4*d + 2*f + g)
Eq(-8*z00 + 36*z01 - 54*z02 + 27*z03, 27*b + 9*d + 3*f + g)
Eq(z30, a + c + e + g)
Eq(z33, a + b + c + d + e + f + g)
Eq(-z30 + 6*z31 - 12*z32 + 8*z33, a + 8*b + c + 4*d + e + 2*f + g)
Eq(-8*z30 + 36*z31 - 54*z32 + 27*z33, a + 27*b + c + 9*d + e + 3*f + g)
Eq(-z00 + 6*z10 - 12*z20 + 8*z30, 8*a + 4*c + 2*e + g)
Eq(-z03 + 6*z13 - 12*z23 + 8*z33, 8*a + b + 4*c + d + 2*e + f + g)
Eq(z00 - 6*z01 + 12*z02 - 8*z03 - 6*z10 + 36*z11 - 72*z12 + 48*z13 + 12*z20 - 72*z21 + 144*z22 - 96*z23 - 8*z30 + 48*z31 - 96*z32 + 64*z33, 8*a + 8*b + 4*c + 4*d + 2*e + 2*f + g)
Eq(8*z00 - 36*z01 + 54*z02 - 27*z03 - 48*z10 + 216*z11 - 324*z12 + 162*z13 + 96*z20 - 432*z21 + 648*z22 - 324*z23 - 64*z30 + 288*z31 - 432*z32 + 216*z33, 8*a + 27*b + 4*c + 9*d + 2*e + 3*f + g)
Eq(-8*z00 + 36*z10 - 54*z20 + 27*z30, 27*a + 9*c + 3*e + g)
Eq(-8*z03 + 36*z13 - 54*z23 + 27*z33, 27*a + b + 9*c + d + 3*e + f + g)
Eq(8*z00 - 48*z01 + 96*z02 - 64*z03 - 36*z10 + 216*z11 - 432*z12 + 288*z13 + 54*z20 - 324*z21 + 648*z22 - 432*z23 - 27*z30 + 162*z31 - 324*z32 + 216*z33, 27*a + 8*b + 9*c + 4*d + 3*e + 2*f + g)
Eq(64*z00 - 288*z01 + 432*z02 - 216*z03 - 288*z10 + 1296*z11 - 1944*z12 + 972*z13 + 432*z20 - 1944*z21 + 2916*z22 - 1458*z23 - 216*z30 + 972*z31 - 1458*z32 + 729*z33, 27*a + 27*b + 9*c + 9*d + 3*e + 3*f + g)

and would like to express (solve) all those z.. in terms of a , b , c , ...

So what I did was to take left- and right hand side of the equations and turned them into matrices like so:

AA = Matrix([[z00], [z03], [-z00 + 6*z01 - 12*z02 + 8*z03], [-8*z00 + 36*z01 - 54*z02 + 27*z03], [z30], [z33], [-z30 + 6*z31 - 12*z32 + 8*z33], [-8*z30 + 36*z31 - 54*z32 + 27*z33], [-z00 + 6*z10 - 12*z20 + 8*z30], [-z03 + 6*z13 - 12*z23 + 8*z33], [z00 - 6*z01 + 12*z02 - 8*z03 - 6*z10 + 36*z11 - 72*z12 + 48*z13 + 12*z20 - 72*z21 + 144*z22 - 96*z23 - 8*z30 + 48*z31 - 96*z32 + 64*z33], [8*z00 - 36*z01 + 54*z02 - 27*z03 - 48*z10 + 216*z11 - 324*z12 + 162*z13 + 96*z20 - 432*z21 + 648*z22 - 324*z23 - 64*z30 + 288*z31 - 432*z32 + 216*z33], [-8*z00 + 36*z10 - 54*z20 + 27*z30], [-8*z03 + 36*z13 - 54*z23 + 27*z33], [8*z00 - 48*z01 + 96*z02 - 64*z03 - 36*z10 + 216*z11 - 432*z12 + 288*z13 + 54*z20 - 324*z21 + 648*z22 - 432*z23 - 27*z30 + 162*z31 - 324*z32 + 216*z33], [64*z00 - 288*z01 + 432*z02 - 216*z03 - 288*z10 + 1296*z11 - 1944*z12 + 972*z13 + 432*z20 - 1944*z21 + 2916*z22 - 1458*z23 - 216*z30 + 972*z31 - 1458*z32 + 729*z33]])
bb = Matrix([[g], [b + d + f + g], [8*b + 4*d + 2*f + g], [27*b + 9*d + 3*f + g], [a + c + e + g], [a + b + c + d + e + f + g], [a + 8*b + c + 4*d + e + 2*f + g], [a + 27*b + c + 9*d + e + 3*f + g], [8*a + 4*c + 2*e + g], [8*a + b + 4*c + d + 2*e + f + g], [8*a + 8*b + 4*c + 4*d + 2*e + 2*f + g], [8*a + 27*b + 4*c + 9*d + 2*e + 3*f + g], [27*a + 9*c + 3*e + g], [27*a + b + 9*c + d + 3*e + f + g], [27*a + 8*b + 9*c + 4*d + 3*e + 2*f + g], [27*a + 27*b + 9*c + 9*d + 3*e + 3*f + g]])

Then I tried:

from sympy.solvers.solveset import linsolve
linsolve((AA, bb), [z00])
linsolve((AA, bb), [z00, z01, z02, z03, z10, z11, z12, z13, z20, z21, z22, z23, z30, z31, z32, z33])

but I got EmptySet() . I know at that at least z00 should equal to g so I was expecting at least some sort of non-empty answer.

Please, does anyone know how to solve these equations, ie why do I get that EmptySet() ?

Try solve()

_Z = symbols('z0(0:4),z1(0:4),z2(0:4),z3(0:4)', real=True)
solve(AA - bb, _Z)

Not sure why linsolve() like below returns EmptySet , but I'm guessing it's related to the order of the symbols in the expressions.

linsolve(AA - bb, _Z)

But the code below works

A = Matrix([[ 1,    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],
        [-1,    6, -12,    8,    0,    0,     0,   0,   0,     0,    0,     0,    0,   0,     0,   0],
        [-8,   36, -54,   27,    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,   1],
        [ 0,    0,   0,    0,    0,    0,     0,   0,   0,     0,    0,     0,   -1,   6,   -12,   8],
        [ 0,    0,   0,    0,    0,    0,     0,   0,   0,     0,    0,     0,   -8,  36,   -54,  27],
        [-1,    0,   0,    0,    6,    0,     0,   0, -12,     0,    0,     0,    8,   0,     0,   0],
        [ 0,    0,   0,   -1,    0,    0,     0,   6,   0,     0,    0,   -12,    0,   0,     0,   8],
        [ 1,   -6,  12,   -8,   -6,   36,   -72,  48,  12,   -72,  144,   -96,   -8,  48,   -96,  64],
        [ 8,  -36,  54,  -27,  -48,  216,  -324, 162,  96,  -432,  648,  -324,  -64, 288,  -432, 216],
        [-8,    0,   0,    0,   36,    0,     0,   0, -54,     0,    0,     0,   27,   0,     0,   0],
        [ 0,    0,   0,   -8,    0,    0,     0,  36,   0,     0,    0,   -54,    0,   0,     0,  27],
        [ 8,  -48,  96,  -64,  -36,  216,  -432, 288,  54,  -324,  648,  -432,  -27, 162,  -324, 216],
        [64, -288, 432, -216, -288, 1296, -1944, 972, 432, -1944, 2916, -1458, -216, 972, -1458, 729]])
assert A * Matrix(_Z) == AA
linsolve((A, bb))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM