30
 Fortran 勉強会 辻野 智紀

第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

第 3  回Fortran  勉強会

辻野 智紀

Page 2: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

本日のお題

高次代数方程式の数値計算 Newton  法

二分法

多元連立 1  次方程式の数値計算 ガウスの消去法

ピボットの選択

Page 3: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

実習の前準備

以下のページから ,  データファイルをダウンロードしておいてください .

http://www.rain.hyarc.nagoya­u.ac.jp/~satoki/main/calc/Nagoya­Fortran/seminar­3.tar.gz

Page 4: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

多元連立 1  次方程式の計算

Page 5: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

連立方程式の解法

線形代数学を学んだとき ,  行列を用いて連立方程式を解く ,  ガウスの消去法 という計算手法を勉強しましたね .

ここでは ,  それを数値計算で行ってみようということをします .

まずは ,  ガウスの消去法がどのようなものであったか復習します .

Page 6: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法(手計算 ver. )

左のような連立方程式は , 右のような行列の形に表記される .

Page 7: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法(手計算 ver. )

a (1,1) = 1 を基準にして , 2 行目を 1 行目 x (-2) で足し , 3 行目を 1 行目 x (-4) で足す .

1 列目終了

Page 8: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法(手計算 ver. )

a (2,2) = -2 を自身で割って , 1 にする .それに伴って , 2 行目はすべて , -2 で割る .

Page 9: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法(手計算 ver. )

a (2,2) = 1 を基準にして , 3 行目を 2 行目 x 6 で足す .

2 列目終了

Page 10: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法(手計算 ver. )

a (3,3) = 7 を自身で割って , 1 にする .それに伴って , 3 行目はすべて , 7 で割る .

3 列目終了

Page 11: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法(手計算 ver. )

これにより , z が速やかに得られ , それを 2 行目に代入することで , y を得る . さらにそれらを 1 行目に

代入することで , x を得る .つまり ...

こういうこと

Page 12: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

数値計算するために一般化

これを一般化し , 数値計算に応用する .

このように 3 x 4 行列と定義する

Page 13: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

前進消去

まず , 行列の成分を 0 にしていく操作を行う .これを 前進消去 という .

a (k,k) を 1 とする .

Page 14: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

前進消去

その列で , その行より下にある成分の値をゼロにし , それに伴って , 行全体を次のように計算す

る .

Page 15: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

前進消去

あとは , その繰り返し ,

Page 16: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

前進消去最終行まで到達したら , 最右列の値が x (nmax) の

値となる .つまり ,

から , x (nmax) は

Page 17: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

後退代入

あとは , 既知の情報から , x (i) の値を計算していく .

この作業を 後退代入 とよぶ .

Page 18: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

一般化まとめ

ここでは , 例として 3 本の方程式を出したが ,nmax 個の方程式での計算は ,

以下のように一般化される .

Page 19: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

実習 1:  ガウスの消去法

ガウスの消去法で連立方程式を計算するプログラムを作成してみましょう .

ガウスの消去法で解くデータは先ほど解凍した , source/data  ディレクトリの "Gauss_method.dat" に入ってあります .

中身は , 3x4  行列で ,  先ほどスライドで具体的に手計算したデータとなってあります .

Page 20: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

みなさん ,  ガウスの消去法のプログラムはうまく動作していますか?

次に ,  ガウスの消去法の致命的な問題点を見ていきましょう .

Page 21: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法の問題点

data  ディレクトリの中の , "Pivot.dat"  というファイルがあるのを確認してください .

ガウスの消去法のプログラムに ,  このデータファイルからデータを読み込ませてください .

データの個数などは , "Gauss_method.dat"  とまったく同じですので ,  プログラムの記述で変更する点は , open  文のファイル名のみです .

これを実行してみてください .

Page 22: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法の問題点

実行結果は ,  いかがでしょうか?

おそらく , "NaN"  が表示されているはずです . "NaN"  というのは , Fortran  の算術エラーで , 

"Not a Number"  の略です . 簡単に言うと ,  計算機が有限の数値を用いて表

現できないような演算が起きたときの結果として表示されます .

Page 23: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

NaN  の例

以下に , NaN  の典型的な例を挙げます . 0  で割ろうとした . 無限大 /  無限大

負の平方根を計算しようとした . 負の対数 etc...

Page 24: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

先ほどデータとして読み込んだ"Pivot.dat"

の中身を見てみてください .

どこで ,  算術エラーが発生したかわかりますか?

Page 25: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ここです

0.0 !!!

しかし ,  なぜこの 0.0  が算術エラーなのでしょうか?

わかりますか?

Page 26: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

問題点の正体

ガウスの消去法は ,  行列の対角成分で行の各成分を割るという作業がありました .

しかし ,  対角成分がゼロであった場合 ,  どうなるでしょう .

0.0  で各成分を割るのですから ,  当然 NaN  が返されるはずです .

これがガウスの消去法の致命的な問題点です .

Page 27: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

問題点の克服〜ピボットの選択〜

各行の前進消去を行う前に ,  消去するための基準となる ,  その行の対角行列をその列のもっとも値の大きい値の行と入れ替えておけば ,  回避できます .

このような ,  対角成分をピボットと呼び ,  上の操作をピボットの選択と呼びます .

とくに ,  ここでの操作を部分的ピボッティングとも言います .

Page 28: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

実習 2:  放射フラックスの計算 プログラムができたら ,  先ほどダウンロードした

ファイルからデータを読み込ませ ,  その数値をもとに ,  ガウスの消去法を実行します .

入力したデータは ,  大気の高度別の上向きフラックスと ,  観測波長のデータですので ,  これをガウスの消去法で計算することで ,  放射をもとに計算した ,  大気の鉛直温度分布が導出できます . これをグラフにプロットしてみましょう .

詳細は配布資料参照 .

Page 29: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

ガウスの消去法が何の役に ...

ガウスの消去法は単に連立方程式を計算するプログラムですが ,  連立方程式を計算する場面は意外に多くあります .

例えば ,  以下のように微分方程式の計算過程でその役目がまわってくることがあります .

拡散方程式を Crank­Nicolson  法で解く . 多項式によるフィッティングでの多項式の係数を求

める . 最小自乗法での係数を決定する .

ラプラス・ポアソン方程式を差分法で解く . ...etc.

Page 30: 第 3 回 Fortran 勉強会 - Kobe Universityfourtran/Nagoya-Fortran/seminar-3… · 連立方程式の解法 線形代数学を学んだとき, 行列を用いて連立方程 式を解く,

  

参考文献

会田勝『大気と放射過程』東京堂出版 東京大学理学部地球物理学科

『数値計算入門』

Wikipedia http://ja.wikipedia.org/wiki/

%E3%83%A9%E3%83%B3%E3%83%99%E3%83%AB%E3%83%88%E3%81%AEW%E9%96%A2%E6%95%B0

http://ja.wikipedia.org/wiki/NaN