我可以使用SymPy或其他软件简化这样一系列的总和吗?
我可以简化这类序列的总和{i}
:
summation(i, (i, 1, n))
我不知道如何使用下标{a_i}
a_1, a_2, a_3, a_4 = symbols("a_1 a_2 a_3 a_4")
说,我有一个等式a_1 + a_2 + ... + a_100 - x = 0
。答案是:
x = a_1 + a_2 + ... + a_100
。
太长了。我希望将其缩短为其他符号i
和函数summation
,例如x = summation(a_i, (i, 1, 100 ))
。
代码Sum(Indexed("x", i), (i, 1, 4)).doit()
将获得结果x[1] + x[2] + x[3] + x[4]
。但是,我想扭转这个过程。我希望代码somefunction(x[1]+x[2]+x[3]+x[4])
获得结果Sum(Index("x", i), (i, 1, 4))
。
答案 0 :(得分:0)
你可以用反射来做到这一点:
local = locals()
sum(local['a_' + i] for i in range(1, n + 1))
答案 1 :(得分:0)
mathemetica解决方案(主要是为了表明这是多么痛苦)
pp[list_] /; Length@Union[Head /@ list] > 1 :=
Total[ pp /@ GatherBy[list, Head] ]
pp[list_] /;
Length@list > 1 && (Sort[Flatten[List @@ # & /@ list ]] ==
(rg = Range[list[[1, 1]], list[[-1, 1]]])) :=
sum[Head[list[[1]]][i], {i, rg[[1]], rg[[2]]}]
pp[list_] := Plus @@ list
(a[1] + a[2] + q[3] + 2)/(b[1] + b[2] + c[3] + b[3] + c[4]) /.
x_Plus :> (pp@(List @@ x))
请注意s
上的小写sum
(这不是已定义的函数),因为数学会在您使用时自动展开Sum
。我们可以用
%/. sum->Sum
(2 + a[1] + a[2] + q[3])/(b[1] + b[2] + c[3] + c[4])