Sympy 如何设置列表中每个符号的值

Sympy How To Set Value of every symbol in a list

我一直在尝试解决一个数值问题。我使用 sympy 创建符号方程式,例如:

a = symbols('a0:8')

b = symbols('b0:8')

c = symbols('c0:8')

d = symbols('d0:8')

然后我创建了 33 个仅由这些符号组成的方程式。当我尝试线性求解所有这些符号时。结果我总是得到一个空集。

我已将所有符号收集在一个列表中:

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)

这个输出是:

[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]

我的总方程列表是:

[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]

你能告诉我如何解这些方程并得到每个 a、b、c、d 的值吗?

以下内容会有所帮助:

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)

打印输出将显示除 d7 之外的所有变量的解,这一定意味着方程式被过度指定。