【发布时间】:2020-09-29 20:30:11
【问题描述】:
我正在尝试使用对称属性来简化某些计算的参数数量。
在这个问题中,我使用下面的脚本来生成所需的所有线性方程。
from sympy import *
import sympy as sym
init_printing(use_latex='mathjax')
b1=sym.Array([[Rational(-1/2),sqrt(3)/2,0],[-sqrt(3)/2,Rational(-1/2),0],[0,0,1]])
Sigma=[]
for i in range(0,3):
for j in range(0,3):
for k in range(0,3):
for l in range(0,3):
y = symbols(('C_{%d%d%d%d}')%(i+1,j+1,k+1,l+1), commutative=True)
args = []
for m in range(0,3):
for n in range(0,3):
for o in range(0,3):
for p in range(0,3):
x= symbols(('C_{%d%d%d%d}')%(m+1,n+1,o+1,p+1), commutative=True)
M=sym.Array([x])
Sigmatotal_tmp=tensorproduct(b1[m][i],b1[n][j],b1[o][k],b1[p][l],M)
args.append(Sigmatotal_tmp[0])
Sigma.append(y-Add(*args))
solve(Sigma)
在我的问题 C_{mnop}=C_{opmn}=C_{nmop}=..... 我想使用索引的总和来消除类似的东西:
if sum(m,n,o,p)= sum(n,o,p,m):
keep m,n,o,p
但这需要写很多 if 语句,因为我打算最多 10 个索引。
有什么偷偷摸摸的方法吗?
谢谢!!
【问题讨论】:
-
我并不完全清楚你想要做什么,但你可以使用
sorted([m, n, o, p])来获得适合比较它们的东西,如果你把它变成tuple你可以使用它作为dict/set键。您还可以使用itertools.permutations以不同的方式编写循环。itertools.product也有助于您的嵌套循环。 -
对不起,如果问题不清楚。该代码将生成例如 C1112,C1121,C1211,C2111,它们都是等效的; C1112=C1121=C1211=C2111 购买用 C1112 替换 C1121,C1211,C211 这大大减少了要求解的方程数量:)
-
你在使用
numpy吗?如果没有,请删除标签。
标签: python-3.x numpy scipy sympy