我正在尝试使用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部分.

有帮助吗?

解决方案

显然,在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)
)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top