Maxima:如何分解有限和?

Maxima: How to factor out a finite sum?

这个问题是关于 Maxima 输出的人道表现。

总之,我要怎么做

b*d4 + b*d3 + b*d2 + b*d1 + a*sin(c4 + alpha) + a*sin(c3 + alpha) + a*sin(c2 + alpha) + a*sin(c1 + alpha)

长得像

b*sum_{i=1}^{4} d_i + a*sum_{j=1}^{4}sin(c_i + \alpha)

其中sum_{*}^{*}*是求和符号和带下标的表达式?

或更深入,如何在这里正确地建模有限的项目集?

考虑一组有限的实体 $x_i$(这里尝试使用 tex),编号从 1 到 n,其中 n 是已知的。设函数 $F$ 取决于这些实体的几个特征 $c_ji = c_j(x_i), j = 1..k$(k - 也已知)使得 $F = F(c_11,...,c_kn)$.

现在,当我尝试在 Maxima 中实现它并用它做事时,它会产生各种总和和乘积,其中编号的项目表示为 $c_1*a + c_2*a + c_3*a + c_4*a + d_1*b + d_2*b + d_3*b + d_4 *b$,您可以在纸上记为 $a*\sum_{i=1}^{4}c_i + b*sum_{i=1}^{4}d_i$。

那么我怎样才能让 Maxima 做那种表情收缩呢?

更具体地说,这是一个实际的代码示例: (最大输出标记为“>>>”)

/* let's have 4 entities: */
n: 4 $

/* F is a sum of similar components corresponding to each entity F = F_1 + F_2 + F_3 + F_4 */
F_i: a*sin(alpha + c_i) + b*d_i;
>>> b*d_i + a*sin(c_i + alpha)

/* defining the characteristics */
c(i) := concat(c, i) $
d(i) := concat(d, i) $

/* now let's see what F looks like */

/* first, we should model the fact that we have 4 entities somehow: */
F_i(i) := subst(c(i), c_i, subst(d(i), d_i, F_i)) $

/* now we can evaluate F: */
F: sum(F_i(i), i, 1, 4);
>>> b*d4 + b*d3 + b*d2 + b*d1 + a*sin(c4 + alpha) + a*sin(c3 + alpha) + a*sin(c2 + alpha) + a*sin(c1 + alpha)

/* at this point it would be nice to do something like:                */
/*     pretty(F);                                                      */
/* and get an output of:                                               */
/*     $b*\sum_{i=1}^{4}d_i + a*\sum_{j=1}^4 sin(c_j + \alpha)$        */
/* not to mention having Maxima write things in the same order as I do */

所以,总结起来,这里有三个问题:

  1. 如何从类似 post 上面的表达式中分解出总和?
  2. 如何正确地让 Maxima 知道我在这里说的是什么?
  3. 如何让 Maxima 在输出中保留我的顺序?

提前致谢。

这里有一种方法可以满足您的需求。

(%i1) n: 4 $
(%i2) F(i) := a*sin(alpha + c[i]) + b*d[i];
(%o2)                  F(i) := a sin(alpha + c ) + b d
                                              i       i
(%i3) 'sum(F(i), i,1,4);
                        4
                       ====
                       \
(%o3)                   >    (a sin(c  + alpha) + b d )
                       /             i               i
                       ====
                       i = 1
(%i4) declare (nounify(sum), linear);
(%o4)                                done
(%i5) 'sum(F(i), i,1,4);
                        4                         4
                       ====                      ====
                       \                         \
(%o5)                a  >    sin(c  + alpha) + b  >    d
                       /          i              /      i
                       ====                      ====
                       i = 1                     i = 1
(%i6)

这里最重要的是,我将我们称之为 "c sub i" 和 "d sub i" 的内容分别写为 c[i]d[i]。这些是名为 cd 的索引变量,i 是索引。没有必要实际存在名为 cd 的数组或列表,并且 i 可能有也可能没有特定值。

我把F写成了一个普通的函数。我已经避免通过 concat 构建变量名,并避免将这些名称替换为表达式。我想强调的是,这样的操作几乎肯定不是最好的方法。

%i3 中,请注意,我将求和写为 'sum(...),这使它成为一个 so-called 名词表达式,这意味着它以符号形式维护而不计算。

默认情况下,求和不被视为线性求和,因此在 %i4 中我将求和声明为线性求和,以便 %o5 中的结果符合预期。

Maxima 没有办法将 a1 + a2 + a3 等表达式收集回符号求和,但也许您不需要这样的操作。