我在 MuPAD 5.7.0 版(MATLAB R2011b)中发现了一个奇怪的行为,我想知道这是否是一个错误,如果不是,我做错了什么。理想情况下,我还想知道为什么 MuPAD 会这样做。
考虑大小为 3x3 的数组C
,其中的元素具有一些示例值。我想将此数组视为数组数组,因此使用级联索引。
当两个索引都是不同嵌套范围的局部变量时,即当第一个索引的范围比第二个索引的范围宽时,显然会出现问题。如果第一个索引是常数,则没有问题。
当我输入:
reset();
C := [[a,b,c],[d,e,f],[g,h,i]];
sum((C[3])[t], t = 1..3);
S := j -> sum((C[j])[t], t = 1..3);
S(3);
我得到以下结果:
我希望代码中的第 3 行和第 5 行(输出中的第 2 行和第 4 行)产生相同的结果g+h+i
:相反,第 5 行产生a+e+i
,这似乎是 的对角线C
。
当我对product
而不是做同样的事情时sum
,结果甚至更奇怪,但可能会揭示更多关于“错误”来源的信息,特别是 DOM_VAR(0,2)
:
reset();
C := [[a,b,c],[d,e,f],[g,h,i]];
product((C[3])[t], t = 1..3);
eval(product((C[3])[t], t = 1..3));
S := j -> product((C[j])[t], t = 1..3);
S(3);
eval(S(3));
我得到:
我可能在这里走错了路,但我怀疑创建了一个闭包,试图保存周围作用域的局部变量,这些变量在创建闭包时是不确定的。此外,替换似乎在某个时候停止,它被eval()
.
实际问题
我试图解决的实际问题如下:
reset();
aVec := Symbol::accentUnderBar(Symbol::alpha)
问题:计算形式的多项式
hold(sum(x(i), i=i_0..i_k)^n)
在Wikipedia上,定义了以下形式:
sumf := freeze(sum):
hold(sum(x[i], i=1..m)^n)=sumf(binomial(n,aVec)*product(x[t]^aVec[t], t = 1..m), abs(aVec)=n);
为了实现这一点,我们需要定义向量 alpha 的集合,其和等于 m。这些对应于长度为 m 和可能的零元素的 n 的可能组合的集合:
C := (n,m) -> combinat::compositions(n, MinPart = 0, Length = m)
例如,总和
n := 3:
m := 3:
sumf(x[i], i=1..m)^n = sum(x[i], i=1..m)^n;
将要求这些权力组合,其中每一个都是一个向量 alpha:
A := C(n,m)
此外,我们需要多项式系数。每个这样的系数取决于向量 alpha 和幂 n:
multinomial := (n, aVec) -> fact(n) / product(fact(aVec[k]), k = 1..nops(aVec))
例如,第二个组合出现的次数是:
multinomial(n, A[2])
对所有组合求和产生:
sum(multinomial(n,A[i])*product(x[t]^A[i][t], t = 1..m), i = 1..nops(A))
幂是正确的,但系数不正确。这似乎与此问题中首先陈述的归结抽象问题有关。