Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
第 3 回Fortran 勉強会
辻野 智紀
本日のお題
高次代数方程式の数値計算 Newton 法
二分法
多元連立 1 次方程式の数値計算 ガウスの消去法
ピボットの選択
実習の前準備
以下のページから , データファイルをダウンロードしておいてください .
http://www.rain.hyarc.nagoyau.ac.jp/~satoki/main/calc/NagoyaFortran/seminar3.tar.gz
多元連立 1 次方程式の計算
連立方程式の解法
線形代数学を学んだとき , 行列を用いて連立方程式を解く , ガウスの消去法 という計算手法を勉強しましたね .
ここでは , それを数値計算で行ってみようということをします .
まずは , ガウスの消去法がどのようなものであったか復習します .
ガウスの消去法(手計算 ver. )
左のような連立方程式は , 右のような行列の形に表記される .
ガウスの消去法(手計算 ver. )
a (1,1) = 1 を基準にして , 2 行目を 1 行目 x (-2) で足し , 3 行目を 1 行目 x (-4) で足す .
↓
1 列目終了
ガウスの消去法(手計算 ver. )
a (2,2) = -2 を自身で割って , 1 にする .それに伴って , 2 行目はすべて , -2 で割る .
↓
ガウスの消去法(手計算 ver. )
a (2,2) = 1 を基準にして , 3 行目を 2 行目 x 6 で足す .
2 列目終了
↓
ガウスの消去法(手計算 ver. )
a (3,3) = 7 を自身で割って , 1 にする .それに伴って , 3 行目はすべて , 7 で割る .
↓
3 列目終了
ガウスの消去法(手計算 ver. )
これにより , z が速やかに得られ , それを 2 行目に代入することで , y を得る . さらにそれらを 1 行目に
代入することで , x を得る .つまり ...
こういうこと
数値計算するために一般化
これを一般化し , 数値計算に応用する .
このように 3 x 4 行列と定義する
前進消去
まず , 行列の成分を 0 にしていく操作を行う .これを 前進消去 という .
a (k,k) を 1 とする .
前進消去
その列で , その行より下にある成分の値をゼロにし , それに伴って , 行全体を次のように計算す
る .
前進消去
あとは , その繰り返し ,
前進消去最終行まで到達したら , 最右列の値が x (nmax) の
値となる .つまり ,
から , x (nmax) は
後退代入
あとは , 既知の情報から , x (i) の値を計算していく .
この作業を 後退代入 とよぶ .
一般化まとめ
ここでは , 例として 3 本の方程式を出したが ,nmax 個の方程式での計算は ,
以下のように一般化される .
実習 1: ガウスの消去法
ガウスの消去法で連立方程式を計算するプログラムを作成してみましょう .
ガウスの消去法で解くデータは先ほど解凍した , source/data ディレクトリの "Gauss_method.dat" に入ってあります .
中身は , 3x4 行列で , 先ほどスライドで具体的に手計算したデータとなってあります .
みなさん , ガウスの消去法のプログラムはうまく動作していますか?
次に , ガウスの消去法の致命的な問題点を見ていきましょう .
ガウスの消去法の問題点
data ディレクトリの中の , "Pivot.dat" というファイルがあるのを確認してください .
ガウスの消去法のプログラムに , このデータファイルからデータを読み込ませてください .
データの個数などは , "Gauss_method.dat" とまったく同じですので , プログラムの記述で変更する点は , open 文のファイル名のみです .
これを実行してみてください .
ガウスの消去法の問題点
実行結果は , いかがでしょうか?
おそらく , "NaN" が表示されているはずです . "NaN" というのは , Fortran の算術エラーで ,
"Not a Number" の略です . 簡単に言うと , 計算機が有限の数値を用いて表
現できないような演算が起きたときの結果として表示されます .
NaN の例
以下に , NaN の典型的な例を挙げます . 0 で割ろうとした . 無限大 / 無限大
負の平方根を計算しようとした . 負の対数 etc...
先ほどデータとして読み込んだ"Pivot.dat"
の中身を見てみてください .
どこで , 算術エラーが発生したかわかりますか?
ここです
0.0 !!!
しかし , なぜこの 0.0 が算術エラーなのでしょうか?
わかりますか?
問題点の正体
ガウスの消去法は , 行列の対角成分で行の各成分を割るという作業がありました .
しかし , 対角成分がゼロであった場合 , どうなるでしょう .
0.0 で各成分を割るのですから , 当然 NaN が返されるはずです .
これがガウスの消去法の致命的な問題点です .
問題点の克服〜ピボットの選択〜
各行の前進消去を行う前に , 消去するための基準となる , その行の対角行列をその列のもっとも値の大きい値の行と入れ替えておけば , 回避できます .
このような , 対角成分をピボットと呼び , 上の操作をピボットの選択と呼びます .
とくに , ここでの操作を部分的ピボッティングとも言います .
実習 2: 放射フラックスの計算 プログラムができたら , 先ほどダウンロードした
ファイルからデータを読み込ませ , その数値をもとに , ガウスの消去法を実行します .
入力したデータは , 大気の高度別の上向きフラックスと , 観測波長のデータですので , これをガウスの消去法で計算することで , 放射をもとに計算した , 大気の鉛直温度分布が導出できます . これをグラフにプロットしてみましょう .
詳細は配布資料参照 .
ガウスの消去法が何の役に ...
ガウスの消去法は単に連立方程式を計算するプログラムですが , 連立方程式を計算する場面は意外に多くあります .
例えば , 以下のように微分方程式の計算過程でその役目がまわってくることがあります .
拡散方程式を CrankNicolson 法で解く . 多項式によるフィッティングでの多項式の係数を求
める . 最小自乗法での係数を決定する .
ラプラス・ポアソン方程式を差分法で解く . ...etc.
参考文献
会田勝『大気と放射過程』東京堂出版 東京大学理学部地球物理学科
『数値計算入門』
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