質問

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