我试着用IndexBase求和,但不明白如何进行序列替换:
A = sympy.IndexedBase('A')
i = sympy.Symbol('i', integer=True)
N = sympy.Symbol('N', integer=True)
S = sympy.Sum(A[i], (i, 0, N))
Trace = sympy.Sum(A[i, i], (i, 0, N))
S.subs([(A, range(3)), (N, 2)]).doit() # python3 range
# result: 3
S.subs([(A, [8, 16, 32]), (N, 2)]).doit()
# result: A[0] + A[1] + A[2]
S.subs([(A, numpy.arange(3)), (N, 2)]).doit()
# result: A[0] + A[1] + A[2]
Trace.subs([(A, numpy.diag([2, 4, 8])), (N, 2)]).doit()
# result: A[0, 0] + A[1, 1] + A[2, 2]
唯一有效的情况是range
的替换。你能解释一下,在一般情况下如何替代它?在
通常用索引对象
A[i]
代替索引数据库A
。如果在替换之前由doit
显式写出总和,则此方法有效。在或者
^{pr2}$类似地,
Trace.subs(N, 2).doit().subs([(A[i, i], values[i]) for i in range(3)])
返回56。在Python范围的替换之所以有效,是因为它被
^{3}$subs
联合到SymPy的Range
对象中,这是SymPy表达式的一部分。在看起来人们应该可以用SymPy的
SeqFormula
对象进行类似的替换:但是随后的
doit
在这里失败了,它看起来像是一个bug。在相关问题 更多 >
编程相关推荐