Maximaで線形システムを解く
-
22-09-2019 - |
質問
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)
)
所属していません StackOverflow