1

(配布資料より) ガウス・ザイデル法とヤコビ法が収束するためには、係数行列が対角優勢であるかどうか、つまり、対角要素がその列のすべての要素の中で最大の値を持つ必要があるかどうかを確認する必要があります。 . 対角線がまだ支配的でない場合は、ピボットを使用します。行列が対角優勢であるためには、次の条件が満たされている必要があります: (これは収束とも呼ばれます)

//convergence 
abs(A[i][i]) > summation(abs(A[i][j]),j=1 to n) where j != i for all i...n
//swapping rows in a matrix for partial pivoting
A:rowswap(A,source_index,destination_index)

収束を実装するためにマキシマで使用できる定義済みの関数はありますか、またはスワッピングでループを実行する必要があり、どの制約を使用する必要がありますか? 行列のサイズが 3x3 で、要素がゼロでないと仮定します。

関連する質問をいくつか見ましたが、答えはmatlabにあります。

リンク:行列が対角優勢(行優勢)かどうかをチェックする機能はありますか

では、どうすればマキシマでそれを行うことができますか?

4

1 に答える 1

1

あなたが説明したものを実装するコードは次のとおりです。

is_diag_dom_row (mat, i) :=
  is(2*abs(mat[i][i]) - lsum(abs(x), x, mat[i]) > 0)$

is_diag_dom (mat) :=
  every(lambda([i], is_diag_dom_row (mat, i)),
        makelist(i,i,length(mat)))$

swapped_matrix_rows (mat, i1, i2) :=
  makelist (
    mat[if is(i=i1) then i2 elseif is(i=i2) then i1 else i],
    i, makelist(i,i,length(mat)))$

row_swap (mat, i1, i2) := apply(matrix, swapped_matrix_rows(mat, i1, i2))$

書きやすくするために、両方の操作を論理的な部分に分割しました。の余分なコピーを追加するmat[i][i]ことは、i ≠ j の合計を試みるよりもはるかに簡単にリストを合計できることを意味します。対角優位性を列ごとにチェックしたい場合は、転置して行ごとに行うのがおそらく最も簡単です。Maxima はほとんど行列を行のリストと見なすからです。(col必要に応じて列を抽出する機能がありますが)。

于 2012-08-25T13:50:22.587 に答える