Transcript PowerPoint
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
これを具体的に記述すると,
a01
y0 a00
y a
a11
1 10
y a
n1 n1,0 an1,1
a0n1 x0
a1n1 x1
an1,n1 xn1
ベクトル y の各成分は
yi ai0 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元連立方程式
2x 4 y 6z 6
3x 8 y 7 z 15
5x 7 y 21z 24
を解くことを考えよう.
[第1列消去]
2 x 4 y 6 z 6
3x 8 y 7 z 15
5x 7 y 21z 24
①
②
③
②,③からxを消去:
②①×3/2
2 x 4 y 6 z 6
0 x 2 y 2 z 6
5x 7 y 21z 24
③①×5/2
2x 4 y 6z 6
0x 2 y 2z 6
0x 3 y 6z 9
①
②’
③
①
②’
③’
[第2列消去]
2x 4 y 6z 6
0x 2 y 2z 6
0x 3 y 6z 9
①
②’
③’
③’からyを消去:
③’②’×(-3/2)
2 x 4 y 6z 6
0 x 2 y 2z 6
0 x 0 y 3z 18
①
②’
③”
各列の係数を順次消去していく:前進消去
2 x 4 y 6z 6
0 x 2 y 2z 6
0 x 0 y 3z 18
①
②’
③”
③”から
z6
zの値を②’に代入し
y 9
y, zの値を①に代入し
x 33
求まった変数の値を順次代入しながら
解を計算する:後退代入
ガウスの消去法
前進消去と後退代入の組み合わせにより連立一次方程式の
解を求める手法
以下,連立一次方程式
a00
a10
a
n1,0
a01
a11
an1,1
a0,n1 x0 b0
a1,n1 x1 b1
an1,n1 xn1 bn1
の解を計算するプログラムを作成することを目標とする.
前進消去のプログラムでの実現
a00x0 a01x1 a0,n1xn1 b0
a10x0 a11x1 a1,n1xn1 b1
an1,0 x0 an1,1x1 an1,n1xn1 bk
に対し,第0列消去,第1列消去,… と繰り返し,
同じ解を持つ以下の方程式へと変形する:
a00x0 a01x1 a0,n1 xn1 b0
a11x1 a1,n1 xn1 b1
an2,n2 xn2 an2,n1 xn1 bn2
an1,n1 xn1 bn1
前進消去のプログラムでの実現
a00x0 a01x1 a0,n1xn1 b0
a10x0 a11x1 a1,n1xn1 b1
an1,0 x0 an1,1x1 an1,n1xn1 bk
に対し,第k列消去を,k 0, 1, 2, … , (n2) について
繰り返し行えばよい.
前進消去
for(k=0; k<=n-2; k++){
第k列消去
}
前進消去のプログラムでの実現
[第k列消去]
a00x0 a01x1 a02x2 a0,n1xn1 b0
a11x1 a12x2 a1,n1xn1 b1
akk xk ak ,k 1xk 1 ak ,n1xn1 bk
ak 1,k xk ak 1,k 1xk 1 ak 1,n1xn1 bk 1
an1,k xk an1,k 1xk 1 an1,n1xn1 bn1
akk xk ak ,k 1 xk 1 ak ,n1 xn1 bk
ak 1,k 1 xk 1 ak 1,n1 xn1 bk 1
an1,k 1 xk 1 an1,n1 xn1 bn1
[第k列消去]
akk xk ak ,k 1xk 1 ak ,n1xn1 bk
ak 1,k xk ak 1,k 1xk 1 ak 1,n1xn1 bk 1
an1,k xk an1,k 1xk 1 an1,n1xn1 bn1
ak 1,k
(k 1)式
(k )式
akk
an1,k
(n 1)式
(k )式
akk
(k )
(k 1)
(n 1)
aik
(i)式 (k )式
akk
(k 1 i n 1)
a
a
a
ai,k 1 ak ,k 1 ik xk 1 ai,n1 ak ,n1 ik xn1 bi bk ik
akk
akk
akk
[第k列消去]
(k 1 i n 1)
aik
aik
aik
ai,k 1 ak ,k 1 xk 1 ai ,n1 ak ,n1 xn1 bi bk
akk
akk
akk
ai,k 1
ai ,n1
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;
}
後退代入のプログラムでの実現
a0,n1 x0 b0
a00 a01 a0,n2
b
a
a
a
x
11
1
,
n
2
1
,
n
1
1 1
an2,n2 an2,n1 xn2 bn2
x b
a
n1
n1,n1 n1
an1,n1 xn1 bn1 xn1
第(n1)行:
bn1
an1,n1
bn2 an2,n1 xn1
第(n2)行: an2,n2 xn2 an2,n1 xn1 bn2 xn2
an2,n2
n1
第 i 行: aii xi
n1
bi aij x j
j i 1
aii
aij x j bi xi
j i 1
(i n 1, n 2,,1,0)
後退代入のプログラムでの実現
n1
xi
bi aij x j
j i 1
aii
(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