240 likes | 366 Views
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],
E N D
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("x = \n"); for (i=0; i<3; i++) { printf("%6.2f\n", x[i]); } printf("a = \n"); for (i=0; i<3; i++) { for (j=0; j<3; j++) { printf(" %.2f", a[i][j]); } printf("\n"); } return 0; }
行列の演算 n×n行列A とn次元ベクトルx の積を計算するプログラムを作ってみよう. 計算結果をn次元ベクトルy に代入することにすると, これを具体的に記述すると,
ベクトルy の各成分は と記述できる. ベクトルy の計算 for(i = 0; i < n; i++){ の計算 }
各成分の計算: 各項 (j =0,1,…,n-1)の総和を計算する. 成分の計算 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 の積( )を計算するプログラムを作ってみよう:
連立一次方程式の解法 • 直接解法 • ガウスの消去法 • LU分解法 … • 反復解法 • ヤコビ法 • ガウス・ザイデル法 … ガウスの消去法を用いて連立一次方程式の解を計算する プログラムを作成しよう
ガウスの消去法 まず,具体例として3元連立方程式 を解くことを考えよう.
① ② ③ ① ②’ ③ ① ②’ ③’ [第1列消去] ②,③からxを消去: ②-①×3/2 ③-①×5/2
① ②’ ③’ ① ②’ ③” [第2列消去] ③’からyを消去: ③’-②’×(-3/2) 各列の係数を順次消去していく:前進消去
① ②’ ③” ③”から z = 6 zの値を②’に代入し y = 9 y, zの値を①に代入し x=-33 求まった変数の値を順次代入しながら 解を計算する:後退代入
ガウスの消去法 前進消去と後退代入の組み合わせにより連立一次方程式の 解を求める手法 以下,連立一次方程式 の解を計算するプログラムを作成することを目標とする.
前進消去のプログラムでの実現 に対し,第0列消去,第1列消去,… と繰り返し, 同じ解を持つ以下の方程式へと変形する:
前進消去のプログラムでの実現 に対し,第k列消去を,k = 0, 1, 2, … , (n-2) について 繰り返し行えばよい. 前進消去 for(k=0; k<=n-2; k++){ 第k列消去 }
前進消去のプログラムでの実現 [第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; } [第k列消去] 第k列消去
後退代入のプログラムでの実現 第(n-1)行: 第(n-2)行: 第i 行:
後退代入のプログラムでの実現 for (i=n-1; i>=0; i--) { } 考えてみよう
演 習 ガウスの消去法を実現するプログラムを完成させて,下記の連立一次方程式の解を計算してみよう: ただし