Resolver sistemas lineales en Maxima
-
22-09-2019 - |
Pregunta
Estoy tratando de escribir un solucionador general para un sistema lineal en Maxima usando linsolve(eqlist, varlist)
, pero sin tener que especificar explícitamente la dimensión del problema.
Esto funciona, pero fija la dimensión a 3:
linsolve( [ eq[0],eq[1],eq[2] ], [ a[0],a[1],a[2] ])
Esto no:
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)
)
¿Alguna idea sobre cómo hacer que esto funcione?
Antecedentes detrás del problema: Este sistema lineal surge al resolver la suma finita de los poderes enteros, es decir, la suma de finitamente cuadrados, cubos o poderes generales
p
. Aunque la suma finita de los cuadrados es directa, la solución general es sorprendentemente complicada: se puede encontrar una discusión aquí: Suma finita por relaciones de recurrencia, Parte 2.
Solución
Aparentemente en Maxima, las listas y las matrices no son el mismo objeto subyacente.
Las matrices son más complejas y un poco desordenadas para trabajar (como se sugiere En esta publicación a la lista de correo de Maxima).
El problema desaparece si nos mantenemos alejados de las matrices y trabajamos con listas: en su lugar:
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)
)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow