IT 入門 B2 ー 連立一次方程式( 2 ) ー. ガウスの消去法の問題点 – 浮動小数点数の特殊な値 – 数学関数 ピボット選択つきガウスの消去法 演習 授 業 内 容 授 業 内 容.

Slides:



Advertisements
Similar presentations
メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
Advertisements

プログラミング論 第八回数字の計算,整数の入出力. 本日の内容 前回の課題(続き) 前回の課題(続き) 数字の計算をする 数字の計算をする – 加減乗除を行う – インクリメント演算子とデクリメン ト演算子.
第 11 章 関数について 11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 数学関数の自作.
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
A B x y z 復習 構造体変数 普通の変数 x y z 構造体変数 x y z 箱のイメージ 引き出しのイメージ
プログラミング演習(1組) 第7回
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
コンピュータープログラミング(C言語)(3) 1.関数と分割コンパイル (復習) 2.キーボード入力
初年次セミナー 第4回 整数と実数の取り扱い.
プログラミング入門2 第7回 文字列 数学関数 ファイルの入出力 芝浦工業大学情報工学科 青木 義満
4.3 連立1次方程式   Ax = b   (23) と書くことができる。
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
原子動力工学特論 課題 3、4 交通電子機械工学専攻   齋藤 泰治.
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
IT入門B2 ー 連立一次方程式 ー.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
問題 1 キーボードから入力した数の合計を計算するプログラムを 作成せよ。最初に、何個の数を入力するかその数を入力 するようにする。
数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回)
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
フーリエ級数展開 ~矩形波について~ 長江 栞 中島 涼 中村 勇樹
プログラミング演習I 行列計算と線形方程式の求解
LU分解を用いた連立一次方程式.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
知能情報工学演習I 第12回(後半第6回) 課題の回答
講義では、Cプログラミングの基本を学び 演習では、やや実践的なプログラミングを通して学ぶ
同じ構造をした「引き出し」変数を構造体変数と呼ぶ
第7回 条件による繰り返し.
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
整数データと浮動小数データ.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
疑似乱数, モンテカルロ法によるシミュレーション
実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング演習I 2003年4月30日(第3回) 木村巌.
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
x y 復習 変数とその種類 変数とは何か? →データ(数値)を入れておく箱 変数名 変数名とは何か?
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
情報科学 第6回 数値解析(1).
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
1.Scheme の式とプログラム.
実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画
知能情報工学演習I 第8回(後半第2回) 課題の回答
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング演習I 数値計算における計算精度と誤差
知能情報工学演習I 第12回( C言語第6回) 課題の回答
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
情報処理Ⅱ 第2回 2004年10月12日(火).
モバイルプログラミング第2回 C言語の基礎 (1).
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
第4回 配列.
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
第5回 配列.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

IT 入門 B2 ー 連立一次方程式( 2 ) ー

ガウスの消去法の問題点 – 浮動小数点数の特殊な値 – 数学関数 ピボット選択つきガウスの消去法 演習 授 業 内 容 授 業 内 容

ガウスの消去法 前進消去と後退代入の組み合わせにより連立一次方程式の解 を求める手法 #include int main(void) { int i, j, k; … /* 前進消去 */ for (k=0; k<N-1; k++) { for (i=k+1; i<N; i++) { r = a[i][k]/a[k][k]; for (j=k+1; j<N; j++) { a[i][j] = a[i][j] - a[k][j]*r; } b[i] = b[i] - b[k]*r; } /* 後退代入 */ for (i=N-1; i>=0; i--) { r = 0.0; for (j=i+1; j<=N-1; j++) { r += a[i][j]*x[j]; } x[i] = (b[i] - r)/a[i][i]; } … return 0; }

ガウスの消去法 前回の授業で作成したガウスの消去法のプログラムを利用し て,以下の連立一次方程式の解を計算してみよう: ただし 結果はどうなるか?

実行例 のとき, を前回作成したガウスの消去法のプログラムを利 用して解を計算して見ると, ・ "nan" とは何か? ・なぜ,正しい解が計算されないのか? $./a.out x[0] = nan x[1] = nan x[2] = nan x[3] = nan

"nan" とは何か? double 型のような浮動小数点を扱う際,多くの計算機では IEEE754 と呼ばれる 2 進浮動小数点の規格に従って処理が行わ れる. IEEE754 の規格書 IEEE754 では,計算過程において発生する可能性がある数の 中で,通常の浮動小数点数では表現できない特別な値が定義 されている. 例 ・ nan ・ inf

"nan" とは何か? 非数 NaN ( Not a Number ) 0/0, 等の無効演算の結果として生成される特殊な数. "nan" と表示される. 計算過程のある部分で一度 NaN として評価されると,それ 以降はすべて NaN として評価される. 無限大 オーバーフローが起きた時に処理を続行可能とするため に導入された特殊な数. "inf" と表示される. 一度 inf として評価されても,最終的な結果は浮動小数点 数になる場合がある.

"nan" とは何か? プログラム例 #include int main(void) { double a, b; a = 0.0/0.0; printf("a = %f\n", a); b = a + 1.0; printf("b = %f\n", b); a = 1.0/0.0; printf("a = %f\n", a); b = 1.0/a; printf("b = %f\n", b); return 0; }

 i kk ik kin ni kk ik nknik ki kk ik kkki b a a bbx a a a aax a a a aa                        1 1, 1,1,1 1, 1,1, なぜ,正しい解が計算されないのか? 前進消去の第 k 列消去において の場合,それ以降の計算過 程において無効演算が発生する:

なぜ,正しい解が計算されないのか? そこで, の中で最大のものを探す,つまり となる p を見つけ,第 k 行と第 p 行を入れ替える: この操作を部分ピボット選択という.

数学関数 指数関数や三角関数といった数学関数は,標準ライブラリと して準備されている. - 主な数学関数 - sqrt() : double 型数値の平方根を計算. pow() : double 型数値の任意の底と指数の累乗値を計算. exp() : double 型数値の e を底とする累乗値を計算. log() : double 型数値の自然対数を計算. log10() : double 型数値の常用対数を計算. sin(), cos(), tan() : 三角関数値を計算.引数の単位はラジアン. asin(), acos(), atan() : double 型数値の逆三角関数値を計算. abs() : int 型整数値の絶対値を計算. fabs() : double 型数値の絶対値を計算.

数学関数 数学関数を利用するには,その関数が定義されたヘッダファ イルをインクルードする必要がある: abs() : それ以外の関数 : また,ヘッダファイル を利用する場合は,コンパイ ル時に -lm オプションを付加する必要がある: #include … $ gcc –lm filename.c

数学関数 #include int main(void) { double a, b, c; a = sqrt(5.0); b = exp(10.0); c = sin(M_PI/6.0); ← M_PI : π の値のマクロ printf("a = %.20f\n", a); ← 小数点以下を 20 桁表示 printf("b = %e\n", b); ← 指数形式で表示 printf("c = %f\n", c); return 0; } プログラム例

部分ピボット選択を行うプログラムの作成 (1) の中で最大のものを探す. 絶対値 を計算する関数 : fabs(a) fabs(a[k+1][k]),fabs(a[k+2][k]), …,fabs(a[n-1][k]) の中で最大 の値 fabs(a[p][k]) を探し, p を記憶. (2) 第 k 行と第 p 行を入れ替える. a[k][j] と a[p][j] (j=k+1,k+2,…,n-1), b[k] と b[p] をそれぞれ入れ替える.

#include int main(void) { … /* 前進消去 */ for (k=0; k<N-1; k++) { /* 部分ピボット選択 */ for (i=k+1; i<N; i++) { r = a[i][k]/a[k][k]; for (j=k+1; j<N; j++) { a[i][j] = a[i][j] - a[k][j]*r; } b[i] = b[i] - b[k]*r; } /* 後退代入 */ for (i=N-1; i>=0; i--) { r = 0.0; for (j=i+1; j<=N-1; j++) { r += a[i][j]*x[j]; } x[i] = (b[i] - r)/a[i][i]; } … return 0; } 部分ピボット選択付きガウスの消去法

部分ピボット選択付きガウスの消去法を実現するプログラム を完成させ,下記の連立一次方程式の解を計算してみよう: ただし 演 習 演 習