强制在传递给sum()之前评估索引表达式

时间:2015-07-22 14:36:02

标签: symbolic-math quote maxima computer-algebra-systems

我想编写一个(某种程度上)增强的求和函数,它一次获取多个索引,但我无法理解如何使其工作。这是我现在拥有的:

(%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)

我认为可以通过在传递给first(indexes)函数之前强制Maxima将sum扩展为符号来解决此问题。我尝试了''(...)ev(..., nouns),但没有成功。

1 个答案:

答案 0 :(得分:1)

经过一些阅读和尝试后,我来到以下解决方案,该解决方案使用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定义中,而不只是init