Принудительная оценка выражения индекса перед передачей в 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 расширить first(indexes) в символ, прежде чем перейти к sum функция. Я старался ''(...) а также ev(..., nouns), но безуспешно.

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,

Другие вопросы по тегам