千里马:如何分解有限总和?

时间:2017-02-03 05:01:26

标签: math symbolic-math 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. 如何从像这篇文章顶部的表达式中计算出一个总和?
  2. 如何让Maxima知道我在这里讲的是什么?
  3. 如何让Maxima在输出中保留我的订单?
  4. 提前致谢。

1 个答案:

答案 0 :(得分:0)

这是一种了解我想要的方式。

(%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(...),这使得它成为一个所谓的名词表达式,这意味着它以符号形式维护而不进行评估。

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

Maxima无法将a1 + a2 + a3之类的表达式收回到符号求和中,但也许您不需要这样的操作。