ガウス・ザイデル法のプログラム方法

ガウス・ザイデル法のプログラム方法
電気情報工学科 ∗ 5 年 通年 コンピュータシミュレーション
2015 年 10 月 9,16 日 (金)
後期第 2,3 回目(通期第 16,17 回目)
概要
反復法のひとつであるガウス・ザイデル法の具体的な計算方法を示す.
1 はじめに
ここでは,簡単な 3 × 3 の行列を例として,ヤコビ法およびガウス・ザイデル法の漸化
式を示し,それをもとにプログラムを作成していく流れを示す.とくに,プログラムはゼ
ロから作成することは時間を要すると思うので,サンプルプログラムを示し,その穴埋め
をしていくことにする.
2 ガウス・ザイデル法を使った計算
2.1
連立一次方程式
ガウス・ザイデル法のような反復法は大きな連立方程式の計算に適している.しかし,
ここではその計算原理を分かり易くするため,次の連立方程式を計算する.

   
3 2 1  x1  10

   
1 4 1  x2  = 12
(1)

    
2 2 5 x3
21
この方程式の解析解は,
   
 x1  1
   
 x2  = 2
   
x3
3
∗
独立行政法人 国立高等専門学校機構 秋田工業高等専門学校 電気情報工学科
1
(2)
であるが,ガウス・ザイデル法でこれを求めることにする.前に示したようにガウス・ザ
イデル法の漸化式は
{
[
]}
(k+1)
(k+1)
(k+1)
(k)
(k)
(k)
xi(k+1) = a−1
b
−
a
x
+
a
x
+
a
x
+
·
·
·
+
a
x
+
a
x
·
·
·
+
a
x
i
i1 1
i2 2
i3 3
ii−1 i−1
ii+1 i+1
in n
ii


i−1
n

∑
∑


1 

(k)
(k+1) 
=
b
−
(3)
a
x
−
a
x


i
i
j
i
j
j
j



aii 
j=1
j=i+1
である.これは,反復の k 番目の近似解から,より精度の良い k + 1 番目の解を求める方
法を表している.
これを,式 (1) に当てはめると
]
1[
10 − 2x2(k) − x3(k)
3
]
1[
= 12 − x1(k+1) − x3(k)
4
]
1[
= 21 − 2x1(k+1) − 2x2(k+1)
5
x1(k+1) =
(4)
x2(k+1)
(5)
x3(k+1)
(6)
である.当然,これは x1(k+1) → x2(k+1) → x3(k+1) の順序で計算を進める.もう少しくだけた
見方をすると,この式は連立方程式式 (1)
3x1 + 2x2 + x3 = 10
(7)
x1 + 4x2 + x3 = 12
(8)
2x1 + 2x2 + 5x3 = 21
(9)
から,各行の x1 , x2 , x3 を解いている式と
1
(10 − 2x2 − x3 )
3
1
x2 = (12 − x1 − x3 )
4
1
x3 = (21 − 2x1 − 2x2 )
5
x1 =
(10)
(11)
(12)
と同一である.式 (7) から式 (10) を,式 (8) から式 (11) を,式 (9) から式 (12) を導いてい
る.ガウス・ザイデル法の漸化式 (4),(5),(6) は,連立方程式を変形した式 (10),(11),(12) と
同じである.
2.2
プログラム例(穴埋め)
漸化式が求められたので,実際のプログラムを書いてみよう.サンプルプログラムをリ
スト 1 に示すので,空欄に必要なプログラムを考えて書いてみよう.
2
リスト 1: ガウス・ザイデル法のプログラム例(穴埋め)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# i n c l u d e < s t d i o . h>
# i n c l u d e <math . h>
# define N (3)
# d e f i n e EPS ( 1 e −15)
i n t main ( v o i d ) {
d o u b l e a [N+ 1 ] [N+ 1 ] , x [N+ 1 ] , b [N+ 1 ] ;
d o u b l e dx , absx , sum , new ;
int i , j ;
/ / 係数行列の定義
a [1][1]=3.0; a [1][2]=2.0;
a [2][1]=1.0; a [2][2]=4.0;
a [3][1]=2.0; a [3][2]=2.0;
a [1][3]=1.0;
a [2][3]=1.0;
a [3][3]=5.0;
/ / 被同次項の定義
b [1]=10.0;
b [2]=12.0;
b [3]=21.0;
/ / 解の初期化
x [1]=0.0;
x [2]=0.0;
x [3]=0.0;
/ / ガウスザイデル法
do {
/ / 評価用 dx , a b s x の初期化
dx = 0 . 0 ;
absx =0.0;
/ / ===================================================================
//
/ / ここに ( 3 ) 式中の係数行列の和の計算を書く( i != j の時だけ計算することに注意)
//
/ / ===================================================================
/ / 計算結果を new x に代入する
new x = 1 . 0 / a [ i ] [ i ] ∗ ( b [ i ] −sum ) ;
/ / 評価用に dx と a b s x を計算する
dx+= f a b s ( new x −x [ i ] ) ;
a b s x+= f a b s ( new x ) ;
/ / 計算結果を新しい x [ i ] とする
x [ i ]= new x ;
}
} w h i l e ( dx / a b s x > EPS ) ;
/ / 終了条件 / / 計算結果の出力
f o r ( i =1; i <=N; i ++){
3
54
55
56
57
58
}
p r i n t f ( ” x[%d ]=%25.20 f \ n ” , i , x [ i ] ) ;
return 0;
}
3 レポート提出
3.1
課題
以下の課題を取り組み,レポートとして提出すること.特に,体裁をきれいに記述し
て,しっかりとした報告書になるようにすること.
[問 1] ヤコビ法とガウス・ザイデル法の計算原理を説明しなさい.説明には漸
化式の導出過程を言葉と数式をしっかりと記述すること.
[問 2] 次の連立方程式をガウス・ザイデル法で計算しなさい.

   
3 2 1  x1  10

    
1 4 1  x2  = 12

   
2 2 5 x4
21
[問 3] [問 2] の連立方程式を,ヤコビ法で計算しなさい.
[問 4] [問 2] の連立方程式を,手計算で計算し,結果がガウス・ザイデル法およ
びヤコビ法と一致することを確認しなさい.
3.2
提出方法
期限
用紙
提出場所
表紙
内容
10 月 23 日 (金) 17:00
A4
坂本研究室の入口のポスト
表紙を 1 枚つけて,以下の項目を分かりやすくきれいに記述すること.
授業科目名「コンピュータシミュレーション」
課題名「課題 連立方程式 (反復法)」
5E 学籍番号 氏名
提出日
2 ページ以降に課題を記述すること.
4