第3-7回のおさらい

数値計算演習
チェックポイント
(第3-7回)
6/8 公開
6/15 改訂
第3,4回
• 行列の積
行列積要素 𝑐𝑖𝑗 の計算を数式表現できるか
行列積要素 𝑐𝑖𝑗 の積和計算を行う変数の初期値は?
縦ベクトル(行列) 𝐴 の長さ
→ 𝐴を転置した横ベクトル 𝐵 = 𝐴𝑡 と𝐴との
内積(行列積、但し演算順序に注意)
• 配列のメモリ領域確保
重複確保問題に注意--一度受けたmatrix型の値を解放(free_matrix()) せずに
他のmatrix型の値で上書きしていないか
(matrix型の値=配列用に確保したメモリ領域のアドレス)
• 3×3の行列式 det3x3()
たすきがけ法をプログラムで記述できるか
第5,6回 Gaussの消去法
• 前進消去(A[NN][NN+1])
k
対角要素
特定順
A[0][0] A[0][1] A[0][2] A[0][3]
=b[0]
0
A[1][1] A[1][2] A[1][3]
for (k=0; k<NN-1; k++) {
k
=b[1]
// 対角要素特定
0
A[i][k] A[2][2] A[2][3]
tmp = A[k][k];
i
→0
=X[2]
// 適用行(i), 列(j) 範囲
for (i=k+1; i<NN; i++)
A[i][k]を0にする→
for (j=k; j<NN+1; j++)
k 行をA[i][k]/A[k][k]
// j=kの時、A[ i ][ k ] -> 0 にする
倍して i 行から引く
// 操作を j>k でも同様に適用
A[ i ][ j ] -= A[ k ][ j ] * A[ i ][ k ]/tmp;
}
i 行要素 k 行要素
倍率
対角要素引数 k に
j=k の時、 A[ i ] [ k ] は 0 となる
対して、前進消去操作
 for ( j =k ; … ) の前に倍率値
の変数表現を考える
A[ i ][ k ]/A[ k ][ k ] の保存が必要
第5,6回 Gaussの消去法
• 後退代入(A[NN][NN+1])
X導出順
A[0][0] A[0][1] A[0][2] A[0][3]
=b[0]
for (i=NN-1; i>=0; i--) {
0
A[1][1] A[1][2] A[1][3]
i
// 解は下の行より求める
=b[1]
// 解X[ j ] ( i < j < NN) はA[ j ][NN]
0
0
A[2][2] A[2][3]
// に求まっている状況で解
=X[2]
// X[ i ]=A[ i ][NN] を求める
// i 行式
i 行の式
// A[i][i]*X[i] +A[i][i+1]*A[i+1][NN]
𝐴 𝑖 𝑖 ∗𝑋 𝑖 +𝐴 𝑖 𝑖+1 ∗𝑋 𝑖+1 +
// +..+A[i][NN-1]*A[NN-1][NN]
⋯ + 𝐴 𝑖 𝑁 − 1 ∗ 𝑋 𝑁 − 1 = 𝑏[𝑖]
// =A[i][NN]
// のX[i]を解きA[i][NN] に格納
𝐴 𝑖 𝑖 ∗ 𝑋 𝑖 + 𝐴 𝑖 𝑖 + 1 ∗ 𝐴 𝑖 + 1 [𝑁] +
⋯ + 𝐴 𝑖 𝑁 − 1 ∗ 𝐴 𝑁 − 1 [𝑁] = 𝐴[𝑖][𝑁]
for ( j=NN-1; j > i; j-- )
A[ i ][NN] -= A[ i ][ j ] * A[ j ][NN]; 𝐴 𝑖 𝑖 ∗ 𝑋 𝑖
A[ i ][NN] /= A[ i ][ i ];
= 𝐴 𝑖 𝑁 − (𝐴 𝑖 𝑖 + 1 ∗ 𝐴 𝑖 + 1 [𝑁] +
⋯ + 𝐴 𝑖 𝑁 − 1 ∗ 𝐴 𝑁 − 1 [𝑁])
}
𝑨 𝒊 𝑵 を元にして、最終的に𝑨 𝒊 𝑵 の中身が 𝑿 𝒊 となる様に計算
第6回問3:逆行列拡張 (hint2と同じ)
• 作業領域 𝐴 𝑏), (𝐴 𝐼 の双方に対応する拡張
列数を行数から決定せず、列数Mも関数引数に指定
select_pivot(A,N,M), replace_matrix(A,B,N,M,index),
gauss(B,N,M)
行単位処理の及ぶ列範囲を意識する
ガウスの消去法の後退代入
• 作業領域のN列以降は各列が独立した連立方程式
• ある列の各行間には依存関係あり(下の行から解く)
• 連立方程式の右辺由来の領域に解を順次格納するのは同じ
• 補 (数値解析講義第5回p.36)
Gauss-Jordan 法:作業領域 (𝐴 𝐵) の𝐴領域の各列に
• 対角成分を1 に変換
• 対角成分以外の行全体に前進消去の適用
を順次行い𝐴領域を単位行列に変換する事で𝐵領域に
𝐴−1 𝐵 を生成。𝐵 = 𝐼 の場合𝐴−1 を導出。
厳密にはGaussの消去法と異なる(後退代入の無用化)
第7回 LU分解
• A=LU に分解 (数値解析講義第7回 p.5-8)
𝐴𝑥 = 𝑏 を 𝑈𝑥 = 𝑦, 𝐿𝑦 = 𝑏 に分解
• L,Uの生成 (数値解析講義第7回 p.18-20)
Lの対角成分𝑙𝑘𝑘 は1
Gaussの消去法の前進消去の倍率𝑎𝑖𝑘 𝑎𝑘𝑘 をL要素𝑙𝑖𝑘 に蓄積
Gaussの消去法の前進消去の結果をUとする
補:前進消去で𝑎𝑖𝑘 = 0の所を𝑎𝑖𝑘 = 𝑙𝑖𝑘 とすればメモリ節約
• 前進代入 (数値解析講義第7回 p.6,7,21)
𝐿𝑦 = 𝑏 を 𝑦 について解く、解は上の行から求める
• 後退代入 (数値解析講義第7回 p.8,21)
𝑈𝑥 = 𝑦 を 𝑥 について解く、Gaussの消去法のものと同じ