IT入門B2 ー 連立一次方程式 ー 授 業 内 容 • 行列,ベクトルの表現法と行列の演算 • 連立一次方程式の解法 • ガウスの消去法 – 具体例 – 前進消去 – 後退代入 – ピボット選択 • 演習 行列,ベクトルの表現法 C言語で,行列やベクトルを表現するには? • ベクトル:配列の利用 double x[N]; ⇒ x[0]~x[N-1]のN個の要素を確保 • 行列:2次元配列の利用 double a[N][N]; ⇒ a[0][0], a[0][1], … , a[0][N-1], a[1][0], a[1][1], … , a[1][N-1], …… a[N-1][0], a[N-1][1], … , a[N-1][N-1] の(N×N)個の要素を確保 行列,ベクトルの表現 #include <stdio.h> int main(void) { int i, j; double x[3] = {-33.0, 9.0, 6.0}; double a[3][3] = {{2.0, 4.0, 6.0}, {3.0, 8.0, 7.0}, {5.0, 7.0, 21.0}}; printf("a = \n"); for (i=0; i<3; i++) { for (j=0; j<3; j++) { printf(" %.2f", a[i][j]); } printf("\n"); } printf("x = \n"); for (i=0; i<3; i++) { printf("%6.2f\n", x[i]); } return 0; } 行列の演算 n×n行列 A と n次元ベクトル x の積を計算するプログラムを 作ってみよう. 計算結果を n次元ベクトル y に代入することにすると, y A x これを具体的に記述すると, y0 a00 y a 1 10 y a n 1 n 1, 0 a01 a11 an 1,1 a0 n 1 x0 a1n 1 x1 an 1,n 1 xn 1 ベクトル y の各成分は yi ai 0 x0 ai1x1 ai,n1xn1 (i 0, 1, , n 1) と記述できる. ベクトル y の計算 for(i = 0; i < n; i++){ yi の計算 } 各成分 yi の計算: yi ai 0 x0 ai1x1 ai,n1xn1 各項 aij x j( j 0,1,…,n1)の総和を計算する. 成分 yi の計算 y[i] = 0.0; for(j = 0; j < n; j++){ y[i] += a[i][j]*x[j]; } y[i] += a[i][j]*x[j]; は y[i] = y[i] + a[i][j]*x[j]; と同じ意味. まとめると,行列 A とベクトル x の積 y を計算するプログラ ムは以下のようにして実現できる: ベクトル y の計算 for(i = 0; i < n; i++){ y[i] = 0.0; for(j = 0; j < n; j++){ y[i] += a[i][j]*x[j]; } } 演 習 以下の行列 A とベクトル x の積( A x )を計算するプログラ ムを作ってみよう: 2 4 6 33 A 3 8 7 , x 9 5 7 21 6 連立一次方程式の解法 • 直接解法 – ガウスの消去法 – LU分解法 … • 反復解法 – ヤコビ法 – ガウス・ザイデル法 … ガウスの消去法を用いて連立一次方程式の解を計算する プログラムを作成しよう ガウスの消去法 まず,具体例として3元連立方程式 2 x 4 y 6 z 6 3 x 8 y 7 z 15 5 x 7 y 21z 24 を解くことを考えよう. [第1列消去] 2 x 4 y 6 z 6 3 x 8 y 7 z 15 5 x 7 y 21z 24 ① ② ③ ②,③からxを消去: ②①×3/2 2 x 4 y 6 z 6 0 x 2 y 2 z 6 5 x 7 y 21z 24 ③①×5/2 2 x 4 y 6 z 6 0 x 2 y 2 z 6 0 x 3 y 6 z 9 ① ②’ ③ ① ②’ ③’ [第2列消去] 2 x 4 y 6 z 6 0 x 2 y 2 z 6 0 x 3 y 6 z 9 ① ②’ ③’ ③’からyを消去: ③’②’×(-3/2) 2 x 4 y 6 z 6 0 x 2 y 2 z 6 0 x 0 y 3 z 18 ① ②’ ③” 各列の係数を順次消去していく:前進消去 2 x 4 y 6 z 6 0 x 2 y 2 z 6 0 x 0 y 3 z 18 ① ②’ ③” ③”から z6 zの値を②’に代入し y 9 y, zの値を①に代入し x 33 求まった変数の値を順次代入しながら 解を計算する:後退代入 ガウスの消去法 前進消去と後退代入の組み合わせにより連立一次方程式の 解を求める手法 以下,連立一次方程式 a01 a0,n 1 x0 b0 a00 a11 a1,n 1 x1 b1 a10 a x b a a n 1 , 0 n 1 , 1 n 1 , n 1 n 1 n 1 の解を計算するプログラムを作成することを目標とする. 前進消去のプログラムでの実現 a00 x0 a01 x1 a0,n1 xn1 b0 a10 x0 a11 x1 a1,n1 xn1 b1 an1,0 x0 an1,1 x1 an1,n1 xn1 bk に対し,第0列消去,第1列消去,… と繰り返し, 同じ解を持つ以下の方程式へと変形する: a00 x0 a01 x1 a0,n 1 xn 1 b0 a11 x1 a1,n 1 xn 1 b1 an 2,n 2 xn 2 an 2,n 1 xn 1 bn 2 an 1,n 1 xn 1 bn 1 前進消去のプログラムでの実現 a00 x0 a01 x1 a0,n1 xn1 b0 a10 x0 a11 x1 a1,n1 xn1 b1 an1,0 x0 an1,1 x1 an1,n1 xn1 bk に対し,第k列消去を,k 0, 1, 2, … , (n2) について 繰り返し行えばよい. 前進消去 for(k=0; k<=n-2; k++){ 第k列消去 } 前進消去のプログラムでの実現 [第k列消去] a00 x0 a01 x1 a02 x2 a0,n 1 xn 1 b0 a11 x1 a12 x2 a1,n 1 xn 1 b1 akk xk ak ,k 1 xk 1 ak ,n 1 xn 1 bk ak 1,k xk ak 1,k 1 xk 1 ak 1,n 1 xn 1 bk 1 an 1,k xk an 1,k 1 xk 1 an 1,n 1 xn 1 bn 1 akk xk ak ,k 1 xk 1 ak ,n 1 xn 1 bk ak 1,k 1 xk 1 ak 1,n 1 xn 1 bk 1 an 1,k 1 xk 1 an 1,n 1 xn 1 bn 1 [第k列消去] akk xk ak ,k 1 xk 1 ak ,n 1 xn 1 bk ak 1,k xk ak 1,k 1 xk 1 ak 1,n 1 xn 1 bk 1 an 1,k xk an 1,k 1 xk 1 an 1,n 1 xn 1 bn 1 (k 1)式 (n 1)式 ak 1,k akk an 1,k akk (k )式 (k )式 (k ) (k 1) (n 1) aik (i )式 (k )式 akk (k 1 i n 1) aik aik aik ai ,k 1 ak ,k 1 xk 1 ai ,n 1 ak ,n 1 xn 1 bi bk akk akk akk [第k列消去] (k 1 i n 1) aik aik aik ai ,k 1 ak ,k 1 xk 1 ai ,n 1 ak ,n 1 xn 1 bi bk akk akk kk a ai ,k 1 ai ,n 1 bi 第k列消去 for (i=k+1; i<=n-1; i++) { r = a[i][k]/a[k][k]; for (j=k+1; j<=n-1; j++) { a[i][j] = a[i][j] – a[k][j]*r; } b[i] = b[i] – b[k]*r; } 後退代入のプログラムでの実現 a00 a01 a11 a0,n2 a1,n2 an 2 , n 2 a0,n 1 x0 b0 a1,n1 x1 b1 an2,n 1 xn2 bn2 an1,n1 xn1 bn1 an 1,n 1 xn 1 bn 1 xn 1 第(n1)行: 第(n2)行: an 2,n 2 xn 2 an 2,n 1 xn 1 bn 2 xn 2 第 i 行: aii xi n 1 aij x j bi xi j i 1 bi bn 1 an 1,n 1 bn 2 an 2,n 1 xn 1 an 2 , n 2 n 1 a x j i 1 aii ij j (i n 1, n 2,,1,0) 後退代入のプログラムでの実現 bi xi n 1 a x j i 1 aii ij j (i n 1, n 2,,1,0) for (i=n-1; i>=0; i--) { 考えてみよう } 演 習 ガウスの消去法を実現するプログラムを完成させて,下記の 連立一次方程式の解を計算してみよう: Ax b, ただし 4 12 8 4 4 1 7 18 9 5 , b . A 2 9 20 20 25 3 11 15 14 18
© Copyright 2024 ExpyDoc