在传递给 sum() 之前强制评估索引表达式
Force evaluate index expression before passing to sum()
我想编写一个(以某种方式)增强的求和函数,它一次接受多个索引,但我不明白如何让它工作。这是我目前拥有的:
(%i1) nsum(indexes, expr) :=
if indexes = []
then expr
else nsum(rest(indexes), sum(expr, first(indexes),1, N)) $
(%i2) nsum([i,j], i+j), nouns;
sum: index must be a symbol; found intosym(first(indexes))
#0: nsum(indexes=[k,j],expr=k+j)
我认为这可以通过强制 Maxima 在传递给 sum
函数之前将 first(indexes)
扩展为一个符号来解决。我尝试了 ''(...)
和 ev(..., nouns)
,但没有成功。
经过一些阅读和尝试,我得出了以下解决方案,它使用 apply
函数来预评估 sum
的参数:
nsum(indexes, expr) :=
if indexes = []
then expr
else nsum(rest(indexes), apply(sum, ['expr, indexes[1], 1, N])) $
UPD1:
不幸的是,上面的代码有些问题,因为它只适用于相对简单的表达式。在我的例子中,直接的方法在 nsum
失败的地方工作得很好:
(%i1) rot[i](f) := sum(sum(sum(sum(
G[r,i]*G[q,j]*w[i,j,k]*('diff(f[k], y[q]) + sum(K[k,q,m]*f[m], m, 1, N)),
r, 1, N),
j, 1, N),
k, 1, N),
q, 1, N) $
(%i2) rot2[i](f) := nsum( [r,j,k,q],
G[r,i]*G[q,j]*w[i,j,k]*('diff(f['k], y[q]) + sum(K[k,q,m]*f[m], m, 1, N))) $
(%i3) rot[1](f);
(%o3) ... Yelds the result.
(%i4) rot2[1](f);
apply: subscript must be an integer; found: k
lambda([i,j],diff(ys[i],x[j]))(i=k,j=1)
UPD2:
代码确实有效。 'k
不小心留在了 rot2
定义中,而不仅仅是 k
。
我想编写一个(以某种方式)增强的求和函数,它一次接受多个索引,但我不明白如何让它工作。这是我目前拥有的:
(%i1) nsum(indexes, expr) :=
if indexes = []
then expr
else nsum(rest(indexes), sum(expr, first(indexes),1, N)) $
(%i2) nsum([i,j], i+j), nouns;
sum: index must be a symbol; found intosym(first(indexes))
#0: nsum(indexes=[k,j],expr=k+j)
我认为这可以通过强制 Maxima 在传递给 sum
函数之前将 first(indexes)
扩展为一个符号来解决。我尝试了 ''(...)
和 ev(..., nouns)
,但没有成功。
经过一些阅读和尝试,我得出了以下解决方案,它使用 apply
函数来预评估 sum
的参数:
nsum(indexes, expr) :=
if indexes = []
then expr
else nsum(rest(indexes), apply(sum, ['expr, indexes[1], 1, N])) $
UPD1:
不幸的是,上面的代码有些问题,因为它只适用于相对简单的表达式。在我的例子中,直接的方法在 nsum
失败的地方工作得很好:
(%i1) rot[i](f) := sum(sum(sum(sum(
G[r,i]*G[q,j]*w[i,j,k]*('diff(f[k], y[q]) + sum(K[k,q,m]*f[m], m, 1, N)),
r, 1, N),
j, 1, N),
k, 1, N),
q, 1, N) $
(%i2) rot2[i](f) := nsum( [r,j,k,q],
G[r,i]*G[q,j]*w[i,j,k]*('diff(f['k], y[q]) + sum(K[k,q,m]*f[m], m, 1, N))) $
(%i3) rot[1](f);
(%o3) ... Yelds the result.
(%i4) rot2[1](f);
apply: subscript must be an integer; found: k
lambda([i,j],diff(ys[i],x[j]))(i=k,j=1)
UPD2:
代码确实有效。 'k
不小心留在了 rot2
定义中,而不仅仅是 k
。