Kaan Ozturk
Kaan Ozturk

Reputation: 3

Sympy How To Set Value of every symbol in a list

i have been trying to solve a numerical problem. I used sympy to create symbolic equations such as :

a = symbols('a0:8')

b = symbols('b0:8')

c = symbols('c0:8')

d = symbols('d0:8')

and then i have created 33 equations that consist of only these symbols. When i try to solve for all these symbols linearly. I just keep getting an empty set as result.

I have collected all the symbols in a list as :

symbollist=[]
for i in a:
      symbollist.append(i)
for i in b:
      symbollist.append(i)
for i in c:
      symbollist.append(i)
for i in d:
      symbollist.append(i)
print(symbollist)

output of this is :

[a0, a1, a2, a3, a4, a5, a6, a7, b0, b1, b2, b3, b4, b5, b6, b7, c0, c1, c2, c3, c4, c5, c6, c7, d0, d1, d2, d3, d4, d5, d6, d7]

and my total equation list is:

[a0 - 3.0, a1 - 3.7, a2 - 3.9, a3 - 4.2, a4 - 5.7, a5 - 6.6, a6 - 7.1, a7 - 6.7, b0 - b1 + 2*c0 + 3*d0, b1 - b2 + 6*c1 + 27*d1, b2 - b3 + 2*c2 + 3*d2, b3 - b4 + 2*c3 + 3*d3, b4 - b5 + 2*c4 + 3*d4, b5 - b6 + 4*c5 + 12*d5, b6 - b7 + 6*c6 + 27*d6, 2*c0 - 2*c1 + 6*d0, 2*c1 - 2*c2 + 18*d1, 2*c2 - 2*c3 + 6*d2, 2*c3 - 2*c4 + 6*d3, 2*c4 - 2*c5 + 6*d4, 2*c5 - 2*c6 + 12*d5, 2*c6 - 2*c7 + 18*d6, a0 - a1 + b0 + c0 + d0, a1 - a2 + 3*b1 + 9*c1 + 27*d1, a2 - a3 + b2 + c2 + d2, a3 - a4 + b3 + c3 + d3, a4 - a5 + b4 + c4 + d4, a5 - a6 + 2*b5 + 4*c5 + 8*d5, a6 - a7 + 3*b6 + 9*c6 + 27*d6, 2*c0, 2*c7, b0 - 1, b7 + 0.67]

Can you tell me how to solve these equations and get values of each a,b,c,d ?

Upvotes: 0

Views: 687

Answers (1)

smichr
smichr

Reputation: 19115

The following will help:

from sympy import *
var('a:8 b:8 c:8 d:8')
eq=[a0 - 3.0, a1 - 3.7, a2 - 3.9, a3 - 4.2, a4 - 5.7, a5 - 6.6, a6 - 7.1, a7 - 6.7, b0 - b1 + 2*c0 + 3*d0, b1 - b2 + 6*c1 + 27*d1, b2 - b3 + 2*c2 + 3*d2, b3 - b4 + 2*c3 + 3*d3, b4 - b5 + 2*c4 + 3*d4, b5 - b6 + 4*c5 + 12*d5, b6 - b7 + 6*c6 + 27*d6, 2*c0 - 2*c1 + 6*d0, 2*c1 - 2*c2 + 18*d1, 2*c2 - 2*c3 + 6*d2, 2*c3 - 2*c4 + 6*d3, 2*c4 - 2*c5 + 6*d4, 2*c5 - 2*c6 + 12*d5, 2*c6 - 2*c7 + 18*d6, a0 - a1 + b0 + c0 + d0, a1 - a2 + 3*b1 + 9*c1 + 27*d1, a2 - a3 + b2 + c2 + d2, a3 - a4 + b3 + c3 + d3, a4 - a5 + b4 + c4 + d4, a5 - a6 + 2*b5 + 4*c5 + 8*d5, a6 - a7 + 3*b6 + 9*c6 + 27*d6, 2*c0, 2*c7, b0 - 1, b7 + 0.67]
reps={}
do=True
while do:
  do=False
  for i in eq:
   i=i.subs(reps)
   f=i.free_symbols
   if len(f)==1:
    reps[f.pop()]=solve(i)[0]
    do=True
for i in ordered(reps):
  print(i,reps[i].n(2))
for i in eq:
  if i.subs(reps).free_symbols:print(i)

The printout will show solutions for all variables except d7 which must mean that the equations are over-specified.

Upvotes: 2

Related Questions