局部变量的 MuPAD 评估,数组行的总和
MuPAD evaluation of local variables, Sum of row of array
我在 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
执行相同的操作时,结果更加奇怪,但可能会揭示更多关于 "error's" 来源的信息,尤其是 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))
幂正确,但系数不正确。这似乎与这个问题中首先提到的归结抽象问题有关。
表达式[[a,b,c],[d,e,f],[g,h,i]]
不是MuPAD中的数组。这是一个“list of lists." I'm guessing that's not what you're after. Lists are commonly used to initialize arrays and matrices and other objects (more here). For these examples, either arrays or matrices will work, but note that these two data types have different advantages.
使用array
:
reset();
C := array([[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);
哪个returns
请注意 row/column 索引相对于您的问题的不同表示方式。同样,修改你的另一个例子
reset();
C := matrix([[a,b,c],[d,e,f],[g,h,i]]);
product(C[3, t], t = 1..3);
S := j -> product(C[j, t], t = 1..3);
S(3);
结果
如果你碰巧想为此使用列表,你可以这样做
reset();
C := [[a,b,c],[d,e,f],[g,h,i]];
_plus(op(C[3]));
S := j -> _plus(op(C[j]));
S(3);
哪个returns
_plus
is the functional form of +
and op
从列表中提取每个元素。还有其他方法可以做到这一点,但这是最简单的方法之一。
我发布此答案只是为了提供问题中实际问题的工作示例。 提议使用矩阵而不是列表列表。
基本上,这是对实际问题的修改抄本。
实用解决方案
我试图解决的实际问题如下:
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 := matrix(nops(C(n,m)),m,C(n,m));
此外,我们还需要多项式系数。
每个这样的系数取决于向量 alpha 和 n 的幂:
multinomial := (n, aVec) -> fact(n) / product(fact(aVec[k]), k = 1..nops(aVec))
比如第二个作文出现的次数是:
multinomial(n,A[2,1..m])
对所有成分求和得出:
sum(multinomial(n,A[i,1..m])*product(x[t]^A[i,t], t = 1..m), i = 1..nops(C(n,m)));
最后证明结果反变换:
simplify(%)
我在 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
执行相同的操作时,结果更加奇怪,但可能会揭示更多关于 "error's" 来源的信息,尤其是 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))
幂正确,但系数不正确。这似乎与这个问题中首先提到的归结抽象问题有关。
表达式[[a,b,c],[d,e,f],[g,h,i]]
不是MuPAD中的数组。这是一个“list of lists." I'm guessing that's not what you're after. Lists are commonly used to initialize arrays and matrices and other objects (more here). For these examples, either arrays or matrices will work, but note that these two data types have different advantages.
使用array
:
reset();
C := array([[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);
哪个returns
请注意 row/column 索引相对于您的问题的不同表示方式。同样,修改你的另一个例子
reset();
C := matrix([[a,b,c],[d,e,f],[g,h,i]]);
product(C[3, t], t = 1..3);
S := j -> product(C[j, t], t = 1..3);
S(3);
结果
如果你碰巧想为此使用列表,你可以这样做
reset();
C := [[a,b,c],[d,e,f],[g,h,i]];
_plus(op(C[3]));
S := j -> _plus(op(C[j]));
S(3);
哪个returns
_plus
is the functional form of +
and op
从列表中提取每个元素。还有其他方法可以做到这一点,但这是最简单的方法之一。
我发布此答案只是为了提供问题中实际问题的工作示例。
基本上,这是对实际问题的修改抄本。
实用解决方案
我试图解决的实际问题如下:
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 := matrix(nops(C(n,m)),m,C(n,m));
此外,我们还需要多项式系数。 每个这样的系数取决于向量 alpha 和 n 的幂:
multinomial := (n, aVec) -> fact(n) / product(fact(aVec[k]), k = 1..nops(aVec))
比如第二个作文出现的次数是:
multinomial(n,A[2,1..m])
对所有成分求和得出:
sum(multinomial(n,A[i,1..m])*product(x[t]^A[i,t], t = 1..m), i = 1..nops(C(n,m)));
最后证明结果反变换:
simplify(%)