0

行列式を見つけるためのアルゴリズムを作成する必要があります。これは再帰関数で実行されます。

ここに画像の説明を入力してください

ここで、は、のth行とth列A_ijを削除したときに表示されるマトリックスです。が次元の場合、の次元はです。またはの使用は許可されていません。ijAAn x nA_ij(n-1) x (n-1)Minor[]Det[]

このアルゴリズムを作成するにはどうすればよいですか?


これは私がこれまでに持っているコードです:

det1[Mi_ /; Dimensions[Mi][[1]] == Dimensions[Mi][[2]]] :=
  Module[{det1}, 
    det1 = Sum[ 
      If[det1 == 1, Break[], (-1)^(1 + j) *Mi[[1, j]]*det1[Drop[Mi, {1}, {j}]]], 
      {j, 1, Length[Mi]}]; 
    Return[det1 // MatrixForm, Module]
] 
4

2 に答える 2

9

コードが機能しないのはなぜですか?

  1. MatrixFormは書式設定(表示)に使用されますが、MatrixFormでラップされた行列は計算に使用できません。あなたは単にそれを削除する必要があります。

  2. 再帰の停止条件について考えてみてください。1*1行列の行列式は、行列の1つの要素にすぎません。合計を書き直し、Ifこれに基づいてください。行列のサイズが1の場合、その要素を返します(Break[]再帰から抜け出すことはできません)。

  3. 関数と同じ名前のローカル変数を使用しないでください。これにより、グローバル関数がマスクされ、再帰的に呼び出すことができなくなります。

  4. 最後に、これによって機能が損なわれることはありませんが、明示的なReturnものは必要ありません。aの最後の値がCompoundExpression返されるだけです。


要約すると、det[m_] := If[Length[m] == 1, m[[1,1]], (Laplace expansion here)]。別の方法は、パターンマッチングを使用してサイズ1の行列を識別することです。

Clear[det]
det[{{x_}}] := x
det[m_] := (Laplace expansion)
于 2011-12-14T16:54:59.993 に答える
1

これで問題は解決しますか?

Clear[det];
det[{{x_}}] := x;
det[a_ /; MatrixQ[a] && SameQ @@ Dimensions[a]] := 
 Sum[(-1)^(1 + i) a[[1, i]] det[Drop[a, {1}, {i}]], {i, 1, Length[a]}];
det::gofish = "Unable to handle this type of input: ``";
det[a___] := (Message[det::gofish, HoldForm[det][a]]; $Failed)

例:これ:

In[]:=

m = {{a, b, c}, {c, d, e}, {f, g, h}};
Det[m] === Expand[det[m]]

与える:

Out[]= 

True
于 2011-12-14T23:19:38.360 に答える