83
83
84
84
## Gauss の消去法
85
85
86
- Gauss の消去法を使えば、システマティックに連立一次方程式を解くことができます。掃き出し法とも呼ばれます。
86
+ 線形代数で習う Gauss の消去法を使えば、システマティックに連立一次方程式を解くことができます。そのため、このアルゴリズムを用いれば連立方程式を解くプログラムを簡単に作ることができます。Gauss の消去法は、 掃き出し法とも呼ばれます。
87
87
88
88
Gauss の消去法は、前進消去と後退代入の二段階から成ります。
89
89
90
- 簡単に Gauss の消去法を説明しておきます。
90
+ 先に線形代数の復習として、 簡単に Gauss の消去法を説明しておきます。
91
91
92
92
次のように $n$ 個の未知数 $x_1, x_2, x_3, \dots , x_n$ に対して、$m$ 個の方程式を考えます。
93
93
206
206
\right.
207
207
$$
208
208
209
- これで $x_n$ から順番に求めていくことで連立方程式を解くことができます 。
209
+ これで $x_n$ はすぐに求めることができます。さらに、$x_n$ の解を代入すれば、$x_{n-1}$ もすぐに求まります。これを繰り返していくことで、連立方程式を解くことができます 。
210
210
211
- 実際に連立方程式を解いてみましょう 。
212
- Gauss の消去法を次の方程式系について行うと、以下のようになります 。
211
+ 実際に具体的な連立方程式を解いてみましょう 。
212
+ Gauss の消去法を次の方程式系について行ってみます 。
213
213
214
214
$$
215
215
\left\{
221
221
\right.
222
222
$$
223
223
224
- まずは、前進消去を行います。
224
+ まずは、前進消去を行います。基本変形を繰り返して、行階段行列を作っていきます。
225
225
226
226
$$
227
227
\begin{alignat*}{2}
305
305
\right.
306
306
$$
307
307
308
- Gauss の消去法を使えば、このようにシステマティックに連立方程式を解けます。
309
- これなら、プログラムを作るのは簡単そうです。
310
-
311
308
:::info
312
309
313
310
次のように、前進消去の段階で行簡約行列を作れば、後退代入を行う必要がなくなります。これは、Gauss-Jordan の消去法と呼ばれます。
314
- しかし、実は先程のように行簡約行列まで計算しないで途中で止める Gauss の消去法の方が計算量が少なくなるので、Gauss の消去法を使って説明をしました。
311
+ Gauss-Jordan の消去法の方が良さそうですが、実は先程のように行簡約行列まで計算しないで途中で止める Gauss の消去法の方が計算量が少し少なくなります。そのため、Gauss の消去法の方がよく使われます。
312
+
313
+ Gauss-Jordan の消去法で先程の連立方程式を解いてみます。
315
314
316
- 行簡約行列は次のようになります 。
315
+ 拡大係数行列に基本変形を繰り返すと、次のような行簡約行列が得られます 。
317
316
318
317
$$
319
318
\tilde{B} =
350
349
351
350
これで連立方程式を解くことができました。
352
351
353
- 実際に連立方程式を解いてみます 。
354
- これを次の方程式系について行うと、以下のようになります 。
352
+ 実際に具体的な連立方程式を解いてみます 。
353
+ Gauss-Jordan の消去法を次の方程式系について行っていきます 。
355
354
356
355
$$
357
356
\left\{
@@ -464,7 +463,7 @@ $i$ 行、$i$ 列が pivot となるので、$i$ 行目を pivot の値で割っ
464
463
465
464
次は、後退代入を行います。
466
465
467
- $x_n$ は $ d_n$ になります。求まった $x_n$ をそれよりも上の式に代入して 、$b_{j, n}x_n(1\leq j\leq n-1)$ を右辺に移動させ、$d_j(1\leq j\leq n-1)$ の値を更新します。これを繰り返すと、後退代入ができます 。
466
+ $x_n = d_n$ になります。求まった $x_n$ をそれよりも上の式すべてに代入して 、$b_{j, n}x_n(1\leq j\leq n-1)$ を右辺に移動させ、$d_j(1\leq j\leq n-1)$ の値を更新します。こうすると、$x_{n-1}$ が求まります。これを繰り返すと連立一次方程式が解けます 。
468
467
469
468
プログラムは次のようになります。計算量は、$O(n^3)$ です。
470
469
@@ -474,7 +473,8 @@ $x_n$ は $d_n$ になります。求まった $x_n$ をそれよりも上の式
474
473
475
474
## 部分ピボット選択
476
475
477
- 次のような連立方程式を解こうとすると、次のようなエラーが出てしまいます。
476
+ さきほどのプログラムを使えば、多くの様々な連立一次方程式が解けます。
477
+ しかし、次の連立方程式を解くと、次のようにエラーが出てしまいます。
478
478
479
479
$$
480
480
\left\{
488
488
489
489
<ViewSource path = " /gaussian-elimination/gaussian_elimination_error.ipynb" />
490
490
491
- これは、前進消去の際に 0 で割る操作ができてしまったためです 。
492
- これを解決するために、部分ピボット選択を行います。誤差を小さくする役割もあります。
491
+ これは、前進消去の際に 0 で割る操作が起こってしまったからです 。
492
+ これを解決するために、部分ピボット選択を行います。部分ピボット選択には、 誤差を小さくする役割もあります。
493
493
494
494
部分ピボット選択は、pivot 列の pivot 行以降の行で絶対値が最大になる行を pivot に使うように変形することです。
495
495
496
- 先程の連立方程式なら、次のようになります 。
496
+ 先程の連立方程式なら、次のように計算していきます。1 つ目から、2 つ目への変形が部分ピボット選択によるものです 。
497
497
498
498
$$
499
499
\begin{alignat*}{2}
556
556
\end{alignat*}
557
557
$$
558
558
559
- 部分ピボット選択を使うと、次のようになります 。
559
+ 部分ピボット選択を入れると、次のようなプログラムになります 。
560
560
561
561
<ViewSource path = " /gaussian-elimination/gaussian_elimination_revised.ipynb" />
562
562
0 commit comments