【问题标题】:Eliminating redund terms消除冗余条款
【发布时间】: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


【解决方案1】:

如果符号要根据某些标准进行比较——比如索引总和? - 然后使用该名称标准,然后您将不会创建冗余符号。如果总和很重要,那么

>>> m,n,o,p=1,2,3,4
>>> Symbol("C%s"%sum((m,n,o,p)))
C10

如果不是总和是不变量,而只是所用数字的任何排列,那么对所用数字进行二进制编码会更好。例如,假设您在可能的 10 个值(0 - 9)中有下标 1、2 和 5:

>>> sub = (1,2,5)
>>> ['1' if i in sub else '0' for i in range(10)]
['0', '1', '1', '0', '0', '1', '0', '0', '0', '0']
>>> int(''.join(_), 2)
400
>>> Symbol("C%s"%_)
C400

那么C400就可以作为符号名来表示下标是1、2、5。不管我们把数字放在小端还是大端。

或者最简单:只需对索引进行排序(如 Oscar 建议的那样)并在名称中使用它们:

>>> sub = (2, 1, 5)
>>> Symbol("C_{%s}" % ','.join(str(i) for i in sorted(sub)))
C_{1,2,5}

【讨论】:

  • 您好,感谢您再次回复。名称是标准,使用总和不是最好的方法,因为我将失去对变量的跟踪。有没有允许不创建冗余符号的功能?
猜你喜欢
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多