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 */
所以,总结起来,这里有三个问题:
- 如何从类似 post 上面的表达式中分解出总和?
- 如何正确地让 Maxima 知道我在这里说的是什么?
- 如何让 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]
。这些是名为 c
和 d
的索引变量,i
是索引。没有必要实际存在名为 c
或 d
的数组或列表,并且 i
可能有也可能没有特定值。
我把F
写成了一个普通的函数。我已经避免通过 concat
构建变量名,并避免将这些名称替换为表达式。我想强调的是,这样的操作几乎肯定不是最好的方法。
在 %i3
中,请注意,我将求和写为 'sum(...)
,这使它成为一个 so-called 名词表达式,这意味着它以符号形式维护而不计算。
默认情况下,求和不被视为线性求和,因此在 %i4
中我将求和声明为线性求和,以便 %o5
中的结果符合预期。
Maxima 没有办法将 a1 + a2 + a3
等表达式收集回符号求和,但也许您不需要这样的操作。
这个问题是关于 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 */
所以,总结起来,这里有三个问题:
- 如何从类似 post 上面的表达式中分解出总和?
- 如何正确地让 Maxima 知道我在这里说的是什么?
- 如何让 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]
。这些是名为 c
和 d
的索引变量,i
是索引。没有必要实际存在名为 c
或 d
的数组或列表,并且 i
可能有也可能没有特定值。
我把F
写成了一个普通的函数。我已经避免通过 concat
构建变量名,并避免将这些名称替换为表达式。我想强调的是,这样的操作几乎肯定不是最好的方法。
在 %i3
中,请注意,我将求和写为 'sum(...)
,这使它成为一个 so-called 名词表达式,这意味着它以符号形式维护而不计算。
默认情况下,求和不被视为线性求和,因此在 %i4
中我将求和声明为线性求和,以便 %o5
中的结果符合预期。
Maxima 没有办法将 a1 + a2 + a3
等表达式收集回符号求和,但也许您不需要这样的操作。