0

私はまだマキシマの初心者なので、我慢してください。行列の随伴を計算するための独自の式を書こうとしています (maxima には既に 1 つの組み込み式があることは知っていますが、学習演習として自分で試していました)。これまでのところ(3x3マトリックスの場合):

/* cofactor of some submatrix of the matrix, by deleting row i and column j */
cof(i, j, M) := determinant(submatrix(i, M, j));

/* for 3 x 3 matrix */
C3(M) := matrix( [cof(1,1,M), cof(1,2,M), cof(1,3)],
                 [cof(2,1,M), cof(2,2,M), cof(2,3)],
                 [cof(3,1,M), cof(3,2,M), cof(3,3)] );

/* function for calculating adjoint sign for x at position i, j */
adj_f(i, j, x) := -1^(i+j) * x;

/* adjugate for a 3x3 matrix M */
adj3(M) := matrixmap(lambda([i,j,x], adj_f(i,j,x), transpose(C3(M))));

これがおそらく最善の方法ではないことはわかっています。ただし、matrixmap または fullmapl を使用するときに i および j 要素にアクセスする方法があるかどうか疑問に思っていましたか?

(私は wxMaxima を使用していますが、Lisp の経験はあまりありません。コードに触れずにこれを回避しようとしていました)。

4

2 に答える 2

1

matrixmap の代わりに genmatrix を試してください。genmatrix の第 1 引数は、i と j を引数とする関数です。

(%i2) cof (i, j, M) := determinant (submatrix (i, M, j)) $
(%i3) adj_sign (i, j) := (-1)^(i + j) $
(%i4) M : matrix([1, 2, 3], [-1, 2, 3], [1, -2, 3]) $
(%i5) my_inverse (M) := (1 / determinant (M)) * genmatrix (lambda ([i, j], cof (j, i, M) *  adj_sign (i, j)), 3, 3) $
(%i6) M1 : my_inverse (M);
(%o6) matrix([1/2,-1/2,0],[1/4,0,-1/4],[0,1/6,1/6])

返事が遅れて申し訳ありません。誰かが検索して見つけた場合に備えて、これをここに残します。

于 2012-05-31T06:08:28.913 に答える
1

まあ、あなたはmatrixmapでそれを行うことはできません

 -- Function: matrixmap (<f>, <M>)
     Returns a matrix with element `i,j' equal to `<f>(<M>[i,j])'.

     See also `map', `fullmap', `fullmapl', and `apply'.

i と j は M の (i,j) 番目の要素の関数ではないためです。

必須のソリューションは、次のようになります。

adj3(M) :=
block([adjugate: transpose(C3(M))],
  for i: 1 thru 3 do
    for j: 1 thru 3 do
      adjugate[i,j]: adj_f(i,j,adjugate[i,j]),
  adjugate)$

C3 関数にはいくつかの「M」が欠落しており、adj_f が必要であることに注意してください。

adj_f(i, j, x) := (-1)^(i+j) * x;

(そうでなければ、すべての i,j に対して -( (1)^(i+j) ) = -1 です)。

于 2011-04-04T09:19:05.390 に答える