2015-07-22 4 views
2

Я хочу написать (как-то) расширенную функцию суммы, которая принимает сразу несколько индексов, но я не могу понять, как заставить ее работать. Вот то, что я в настоящее время:Принудительное выражение выражения индекса перед переходом к 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.

+2

Я думаю, что техника «apply» работает должным образом. Я считаю, что если я изменил '' k' на 'k' в определении' rot2' (т. Е. Удалил цитату), тогда 'rot2' дает в этом случае тот же результат, что и' rot'. –

+1

@RobertDodier: Ах, похоже, я просто замалчивал эту цитату. Спасибо, что заметили это! – firegurafiku

+0

@RobertDodier Можно ли избавиться от дополнительной оценки? Рассмотрим, '(% i1) display2d ложь $ (% i2) убить (l1, l2, l0) $ (% i3) l2: l1 $ (% i4) l1: l0 $ (% i5) expr: expr0 $ (% i6) применяется ('sum, [expr, i, 0, l2]); (% o6) expr0 * (l0 + 1) (% i7) sum (expr0, i, 0, l2); (% o7) expr0 * (l1 + 1) ' – slitvinov