2022年度プログラミング演習A・B

第6回レポート課題の解説

演習1

ガウスの消去法における前進消去のアルゴリズムを実現するコードを書き、

$$ A= \begin{pmatrix} 2 & 1 & -2 & 3\\ 2 & 0 & 4 & 1\\ 3 & 0 & 5 & 2\\ 1 & -1 & 2 & 1 \end{pmatrix} ,\quad b= \begin{pmatrix} 11\\ -5\\ -5\\ 4 \end{pmatrix} $$

に対する変形の結果を表示してください。ただし、$A$ が $4$ 次以外の正方行列の場合にも正しく動作するコードにすること。

演習2

演習1のコードにガウスの消去法における後退代入のアルゴリズムを実現するコードを追加し、

$$ A= \begin{pmatrix} 2 & 1 & -2 & 3\\ 2 & 0 & 4 & 1\\ 3 & 0 & 5 & 2\\ 1 & -1 & 2 & 1 \end{pmatrix} ,\quad b= \begin{pmatrix} 11\\ -5\\ -5\\ 4 \end{pmatrix} $$

に対して $Ax=b$ の厳密解を求めてください。ただし、$A$ が $4$ 次以外の正方行列の場合にも正しく動作するコードにすること。

(別解)

後退代入の際の分子に現れる積和の形は、ベクトルの内積(横ベクトルと縦ベクトルの行列としての積)を利用すると簡単に計算できます。

演習3(オプション)

ピボット選択を行うガウスの消去法のアルゴリズムを実現するコードを書き、ピボット選択が必要な $A$ と $b$ の例を与えて $Ax=b$ の厳密解を求めてください。

ピボット選択が必要な例として

$$ A= \begin{pmatrix} 0 & 1 & -2 & 3\\ 1 & 2 & 4 & 3\\ 2 & 0 & 5 & 2\\ 4 & 8 & 0 & 4 \end{pmatrix} ,\quad b= \begin{pmatrix} 1\\ 1\\ 1\\ 1 \end{pmatrix} $$

とすると、ピボット選択を行わない上記のコードでは次に示すように解を求めることができません。

ピボット選択を行うガウスの消去法のコードは、次のようになります。

(別解)

ピボット選択の処理をより簡潔に書くと、次のようになります。

(参考)

ガウスの消去法の前進消去では、注目する対角成分が $0$ かどうかに関わらず常にピボット選択を行う方が、得られる解の計算誤差が大抵の場合は少なくなることが知られています。そのため、そちらの方が一般的です。

ただし、それは行の入れ替え回数が増えることを意味し、行列の次数が大きい場合には特にメモリ上での値の入れ替えを非常に多く行うことになります。

この非効率への対策として、行列 $A$ の行およびベクトル $b$ の成分をメモリ上で実際には入れ替えずに、配列を用意してその成分を入れ替えることで本来の行番号とメモリ上の行番号の対応関係を管理するという方法があります。

$Ax=b$ が解けない場合の対応もついでに含めて上記を実装すると、次のようになります(複雑なので、無理に理解しなくて大丈夫です)。

なお、今回扱ったのはピボット選択の中でも行の入れ替えのみを伴う部分ピボット選択と呼ばれる方法であり、他に列の入れ替えも伴う完全ピボット選択と呼ばれる方法があります。