我可以在符号计算中进行这种简化吗?

时间:2015-03-27 15:30:52

标签: python sympy

我可以使用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))

2 个答案:

答案 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))
  

enter image description here

请注意s上的小写sum(这不是已定义的函数),因为数学会在您使用时自动展开Sum。我们可以用

恢复原文
 %/. sum->Sum

 (2 + a[1] + a[2] + q[3])/(b[1] + b[2] + c[3] + c[4])