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

时间:2019-05-03 17:27:08

标签: python linear-algebra sympy numeric

我一直在尝试解决数字问题。我用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的值吗?

1 个答案:

答案 0 :(得分:0)

以下内容将有所帮助:

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以外的所有变量的解决方案,这必须表示方程已被过度指定。