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 之外的所有变量的解,这一定意味着方程式被过度指定。
我一直在尝试解决一个数值问题。我使用 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 之外的所有变量的解,这一定意味着方程式被过度指定。