2010-02-23 14 views
0

J'essaie d'écrire un solveur général pour un système linéaire dans Maxima en utilisant linsolve(eqlist, varlist), mais sans avoir à spécifier explicitement la dimension du problème.Résolution de systèmes linéaires dans Maxima

Cela fonctionne, mais fixe la dimension à 3:

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

Cela ne veut pas:

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

Toute idée sur la façon d'obtenir ce travail?


arrière-plan derrière le problème: ce système linéaire se pose lors de la résolution la somme finie de puissances entières, à savoir la somme des carrés, finiment beaucoup de cubes, ou pouvoirs généraux p. Bien que la somme finie des carrés soit simple, la solution générale est étonnamment compliquée: une discussion peut être trouvée ici: Finite Summation by Recurrence Relations, Part 2.

Répondre

1

Apparemment dans Maxima, les listes et les tableaux ne sont PAS le même objet sous-jacent.

Les tableaux sont plus complexes et un peu de désordre pour fonctionner (comme suggéré in this posting à la liste de diffusion Maxima).

Le problème disparaît si nous restons loin de tableaux et de travailler avec des listes à la place:

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