Решение линейных систем в Maxima

Я пытаюсь написать общий решатель для линейной системы в Maxima, используя linsolve(eqlist, varlist), но без явного указания размерности проблемы.

Это работает, но фиксирует размер до 3:

linsolve( [ eq[0],eq[1],eq[2] ], [ a[0],a[1],a[2] ])

Это не:

solution(p):=(  
  array(eq,p+1), /* creating arrays of length p+1 */
  array(a,p+1),

  for i:0 thru p do (
    eq[i]: sum(binom(j+1,i)*a[j],j,i,p) = binom(p,i)
  ),

  linsolve(eq,a)
)

Любое понимание того, как заставить это работать?


Предыстория проблемы: эта линейная система возникает при решении конечной суммы целых степеней, то есть суммы конечного числа квадратов, кубов или общих степеней p. Хотя конечная сумма квадратов проста, общее решение на удивление сложное: обсуждение можно найти здесь: Конечное суммирование по рекуррентным соотношениям, часть 2.


person Assad Ebrahim    schedule 23.02.2010    source источник


Ответы (1)


По-видимому, в Maxima списки и массивы НЕ являются одним и тем же базовым объектом.

Массивы более сложны и немного запутаны при работе (как предложено в это сообщение в список рассылки Maxima).

Проблема исчезнет, ​​если мы воздержимся от массивов и вместо этого будем работать со списками:

solution(p):= block([a, eq],        /* give subroutine variables local scope */
    v : makelist(a[i], i, 0, p),    /* create list of unknowns (0-indexed) */
   eq : makelist(sum(binom(j+1,i)*a[j],j,i,p) = binom(p,i), i, 0, p),  
                                    /* create list of equations (0-indexed) */
   linsolve(eq, v)
)
person Assad Ebrahim    schedule 23.02.2010