Решение линейных систем в Maxima - PullRequest
0 голосов
/ 23 февраля 2010

Я пытаюсь написать общий решатель для линейной системы в 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 .

1 Ответ

1 голос
/ 24 февраля 2010

Очевидно, что в 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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...