如何在sympy中正确替换索引变量?

2024-09-30 06:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用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的替换。你能解释一下,在一般情况下如何替代它?在


Tags: numpytruetrace情况range序列integerresult
1条回答
网友
1楼 · 发布于 2024-09-30 06:33:13

通常用索引对象A[i]代替索引数据库A。如果在替换之前由doit显式写出总和,则此方法有效。在

S.subs(N, 2).doit().subs([(A[i], i**2) for i in range(3)])   # 5

或者

^{pr2}$

类似地,Trace.subs(N, 2).doit().subs([(A[i, i], values[i]) for i in range(3)])返回56。在


Python范围的替换之所以有效,是因为它被subs联合到SymPy的Range对象中,这是SymPy表达式的一部分。在

^{3}$

看起来人们应该可以用SymPy的SeqFormula对象进行类似的替换:

>>> n = sympy.symbols('n')
>>> S.subs([(A, sympy.sequence(n**2, (n, 0, 3))), (N, 3)]) 
Sum(SeqFormula(n**2, (n, 0, 3))[i], (i, 0, 3))

但是随后的doit在这里失败了,它看起来像是一个bug。在

相关问题 更多 >

    热门问题