数値計算演習 チェックポイント (第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の消去法のものと同じ
© Copyright 2024 Paperzz