使用 Special Form:
SUM(exp, ind, low, high)
可以进行求和。比如:
(C1) SUM(k^2,k,0,n); n ==== \ 2 (D1) > k / ==== k = 0
如果上下求和界限相差是整数,那么 MAXIMA 会求出这个 sum 的值:
(C2) SUM(k^2,k,0,5); (D2) 55
如果变量 SIMPSUM 的值为 TRUE,那么 MAXIMA 会化简求和表达式, 这在很多时候会求出一个 closed form. 比如,我们可以求出 D1 的 closed form:
(C3) D1,SIMPSUM; 3 2 2 n + 3 n + n (D3) --------------- 6
SUMCONTRACT 可以把两个上下界相差是常数的求和式进行合并。它有 可能会从每个求和式里分离出某些不是共同的项,然后把共同的项目 合并成一个求和式。比如:
(C4) exp1:SUM(A[i],i,0,n-1)+SUM(B[k],k,1,n); n n - 1 ==== ==== \ \ (D4) > B + > A / k / i ==== ==== k = 1 i = 0 (C5) SUMCONTRACT(exp1); n - 1 ==== \ (D5) B + > (B + A ) + A n / k k 0 ==== k = 1
这里 A[0] 和 B[n] 分别被提出来,然后中间的 1...n-1 的部分被 合并。
但是要想让 SUMCONTRACT 可以识别可合并的求和式,求和式必须有 相同的系数。比如下面这个式子,由于 SUM(A[i],i,0,n-1) 有一个 常数系数 C, 致使 MAXIMA 不知道是否可以合并这两个式子。
(C6) exp2:c*SUM(A[i],i,0,n-1)+SUM(B[k],k,1,n); n n - 1 ==== ==== \ \ (D6) > B + C > A / k / i ==== ==== k = 1 i = 0 (C7) SUMCONTRACT(exp2); n n - 1 ==== ==== \ \ (D7) > B + C > A / k / i ==== ==== k = 1 i = 0
所以一般先用 INTOSUM 把求和式前面的常数放进里 面,然后再用 SUMCONTRACT,这样才能进行有效的合并。
(C8) INTOSUM(exp2); n n - 1 ==== ==== \ \ (D8) > B + > C A / k / i ==== ==== k = 1 i = 0 (C9) SUMCONTRACT(%); n - 1 ==== \ (D9) B + > (B + C A ) + A C n / k k 0 ==== k = 1
这样,MAXIMA 正确的合并了两个求和式。
有时侯我们需要把 (a+b+c)(x+y+z) 这样的式子展开。我们使用的是 expand 函数:
(C99) (a+b+c)*(x+y+z); (D99) (C + B + A) (z + y + x) (C100) expand(%); (D100) C z + B z + A z + C y + B y + A y + C x + B x + A x
但是 expand 对求和式是不起作用的。为了展开求和式,我们需要把 SUMEXPAND 变量设为 TRUE:
(C119) SUM(F(I),I,0,M)*SUM(G(J),J,0,N); M N ==== ==== \ \ (D119) ( > F(I)) > G(J) / / ==== ==== I = 0 J = 0 (C120) %,SUMEXPAND:TRUE; M N ==== ==== \ \ (D120) > > F(I1) G(I2) / / ==== ==== I1 = 0 I2 = 0
这样,求和式的积就可以被展开了。
我们注意到展开之后,MAXIMA 给新的求和式自动生成了下标 I1 和 I2. 这个下标的名字是由两个变量 GENINDEX 和 GENSUMNUM 确定的。
GENINDEX 缺省是 I, GENSUMNUM 初始值是 1. 所以生成 I1, I2, ... 这样的下标名。你可以修改它们的值来得到你需要的下标名字。
有时侯,我们需要改变求和下标,以便得到更加简单的表达式。比如 下面这个 SUM(A[I]*X^(I-2),I,0,INF),X 的指数上面有 I-2,很不 好处理,所以我们希望用一个变量来代替 I-2,那么我们可以使用 CHANGEVAR 把 I-2 都换成 N。
(C23) SUM(A[I]*X^(I-2),I,0,INF); INF ==== \ I - 2 (D23) > A X / I ==== I = 0 (C24) CHANGEVAR(%,I-2-N,N,I); INF ==== \ N (D24) > A X / N + 2 ==== N = - 2
CHANGEVAR 接受四个参数,第1个是原来的表达式,第3个是我们要换 成的新变量 x,第4个是我们想要换掉的变量 y。第2个参数是一个表 达式 f(x,y),变量 x 和 y 的关系由 f(x,y)=0 给出。这里我们想 把 I-2 都换成 N, 那么它们之间的关系就是 I-2-N=0.
但是有时侯我们同时有几个求和表达式,它们的下标变量相同,但是 我们只希望替换其中某一个下标。比如下面这种情况:
(C25) exp3:SUM(A[I]*X^(I-2),I,0,INF)+SUM(I^2,I,0,N); INF N ==== ==== \ I - 2 \ 2 (D25) > A X + > I / I / ==== ==== I = 0 I = 0 (C26) CHANGEVAR(exp3,I-2-N,N,I); INF N - 2 ==== ==== \ N \ 2 (D26) > A X + > (N + 4 N + 4) / N + 2 / ==== ==== N = - 2 N = - 2
如果不问青红皂白就把所有的 I-2 都换成 N,就会把其它本来就简 单的式子变得复杂。这时候我们需要区分各个表达式里的下标。这可 以由 BASHINDICES 来实现:
(C32) BASHINDICES(exp3); INF N ==== ==== \ J2 - 2 \ 2 (D32) > A X + > J1 / J2 / ==== ==== J2 = 0 J1 = 0 (C33) CHANGEVAR(%,J2-2-N,N,J2); INF N ==== ==== \ N \ 2 (D33) > A X + > J1 / N + 2 / ==== ==== N = - 2 J1 = 0
在 BASHINDICES 之后,所有的求和下标都被赋予了独一无二的名字: J1, J2, J3 ...
J 后面接的数字存在变量 GENSUMNUM 里。你可以把它设置为任何你 想要的数值。
BASHINDICES 方便了 CHANGEVAR,但是其它的求和下标被变成了 J1, J2, ... 这种样子,很不好看,以后处理起来会很麻烦。所以你可以 用 NICEINDICES 把它们变成好看的下标:
(C42) NICEINDICES(%); INF N ==== ==== \ I \ 2 (D42) > A X + > I / I + 2 / ==== ==== I = - 2 I = 0
NICEINDICES 的下标名字是从 变量 NICEINDICESPREF 里选择的。这 个变量的值一般是 [I,J,K,L,M,N],它首先试图使用 I 作为每一个 求和式的下标,如果内部求和式已经用了 I,它就尝试用 J,用了 J 之后用 K, ……。
如果嵌套的求和式太深,N 都被用了之后还有一层求和,它就开始尝 试在第一个符号后面加数字,使用 I0, I1, I2, ... 这样的名字。 当然这种情况很少。
这里的和式不一定是含有 Sigma 的。
如果有一些有理式需要把分母合并,就使用 XTHRU. 比如:
(C76) exp4:((X+2)**20-2*Y)/(X+Y)**20+(X+Y)**-19-X/(X+Y)**20; 20 1 (X + 2) - 2 Y X (D76) --------- + --------------- - --------- 19 20 20 (Y + X) (Y + X) (Y + X) (C77) XTHRU(exp4); 20 (X + 2) - Y (D77) ------------- 20 (Y + X)
XTHRU 会把不管3721把所有分母都合并。但是有时我们只希望把类似 的分母进行合并。这时可以使用 COMBINE,它只把分母完全相同的项 合并。
(C78) COMBINE(exp4); 20 1 - 2 Y + (X + 2) - X (D78) --------- + --------------------- 19 20 (Y + X) (Y + X)
这样两个 (Y+X)^20 的项被合并在一起,而 (Y+X)^19 的项原封不动。
COMBINE 只能合并分母完全相同的项,我们如果使用 RNCOMBINE,就 可以把分母只相差一个常数系数的项都合并。这在很多时候是我们想 要的结果。
(C86) load("rncomb")$ (C87) exp5:X/(2*(X+Y))+Z/(X+Y); Z X (D87) ----- + --------- Y + X 2 (Y + X) (C88) COMBINE(exp5); Z X (D88) ----- + --------- Y + X 2 (Y + X) (C89) RNCOMBINE(exp5); 2 Z + X (D89) --------- 2 (Y + X)
FREEOF 可以告诉你一些变量是否没有在表达式里出现。这个函数被 作用于求和式时,情况(似乎)有点特殊:所有的下标都不被作为求和 表达式的变量。你可以看看下面两个结果的区别。
(C45) FREEOF(I,SUM(I,I,0,N)); (D45) TRUE (C46) FREEOF(N,SUM(I,I,0,N)); (D46) FALSE
但是其实这是合理的,这一点应该很好理解。看看下面这个,就是 SUM(I,I,0,N) 的 closed form. 里面确实没有 I 这个变量。Got it?
(C48) SUM(I,I,0,N),simpsum; 2 N + N (D48) ------ 2
我们刚才进行的都是确定上下界的求和,定求和(definite summation),MAXIMA 还可以计算“不定求和”(indefinite summation)。
definite summation 和 indefinite summation 的关系就像 定积分 (definite integration) 和不定积分 (indefinite integration) 的关系。
不定求和可以用 nusum 来实现,比如:
(C51) nusum(k*k!,k,0,n); Dependent equations eliminated: (1) (D51) (n + 1)! - 1 (C59) nusum(k*(k-1),k,0,n); (n - 1) n (n + 1) (D59) ----------------- 3
不定求和的反操作就是求差 (difference)。它在 MAXIMA 里是函数 UNSUM. 举一个例子:
(C68) nusum(k*(k-1),k,0,n); (n - 1) n (n + 1) (D68) ----------------- 3 (C69) unsum(%,n); (D69) (n - 1) n
sum(q[k],k,4,0) 是什么意思?从 q_4 加到 q_0?我们可以有几种 理解方法:
当 n-m >= -1 时,第3种办法和第1种一致。所以我们一般在 n-m >= -1 的情况下使用求和式。
第3种方法其实就是 finite calculus 的方法。这使我们可以得到很 多一致的结果。我们如果希望使用这种方法,就可以把变量 SUMHACK 设为 TRUE.
(C67) SUM(q[k],k,4,0),SUMHACK:TRUE; (D67) - q - q - q 3 2 1
如果 SUMHACK 为 FALSE。当 n-m=-1 时,SUM(q[k],k,m,n) 的结果 为 0. 如果 n-m<-1,MAXIMA 会报错。