計算機工学 第1回 計算機利用の基礎1 計算機の仕組み 1 1 計算機はどのようなハードウェアによって構成されているのか 1 2 計算機の五大装置 制御の流れ データの流れ 制御装置 記憶装置に記録されているプログラムを解読し その指示に従ってその他の装置 を制御する 演算装置 四則演算 条件判断 論理演算を行う 上記2つを合わせて CPU(Central Processing Unit)と呼ぶ 記憶装置 プログラムやデータを記憶しておく装置 主記憶装置 いわゆるメモリ と補助 記憶装置がある 入力装置 計算機へ情報を送り込む装置 出力装置 計算機から情報を送り出す装置 外部記憶装置 情報を格納しておく装置 制御信号によって計算結果を保存したり 保存デー タを記憶装置に送ったりする クロック周波数 CPU(Central Processing Unit)の動作速度を表す クロック周波数によって 計算機内部 の各回路間で処理の同期がとられる クロック周波数が高いほど処理能力も高くなるが 周囲の部品の動作周波数に上限があるため むやみに上げることはできない -1-
- 2 -
- 3 -
a x x - a x - a x x a x - a p p x - a = 113.5-114 = 0.5 Æ 0.5mm x - a x = 113.5-114 113.5 = 0.0044 Æ 0.44% x - a = 66.4-65 =1.4 Æ1.4m x - a x = 66.4-65 66.4 = 0.021 Æ 2.1% - 4 -
結果を得た 平均値はいくらか 有効数字を考慮して答えなさい 丸め誤差 四捨五入や切り上げ 切り捨てを行うことを 丸める と言い 丸めに伴う誤差を丸 め誤差と呼ぶ 例題2 3 5.678 1.234=4.601296596 であるが 以後の計算を進めるときは有効数 字4桁の 4.601 を用いれば十分である 打ち切り誤差 近似値を求めるために計算機で反復計算を行うことがある 何度反復させても真 の値に近づくだけで 真の値そのものになることはない このようなとき計算を 適当なところで打ち切って近似値とする これによって生じる誤差を打ち切り誤 差と呼ぶ 例題2 4 四則演算のみを用いて x = 2 を計算する 真の x が求まれば x 2 = 2 となるはず である x = 1.4 のとき x 2 = 1.96 x = 1.41のとき x 2 = 1.9881 x = 1.5 のとき x 2 = 2.25 x = 1.42 のとき x 2 = 2.0164 x = 1.414 のとき x 2 = 1.999396 x = 1.415 のとき x 2 = 2.002225 桁数 2 近似値 打ち切り誤差 1.4 0.0142 3 1.41 0.0042 4 1.414 0.0002 桁落ち 計算結果が 0 に近くなるような加減算を行うとき 有効数字の桁数が極端に小さくなる こと 例題2 5 12.345-12.344=0.001 有効数字 5 桁の計算結果が有効数字 1 桁になってしまう 計算機の内部でこのような極端な桁 落ちが生じると計算誤差が大きくなる そこで計算順序やアルゴリズムの工夫が必要となる 2 2 計算機内部における数 オーバーフロー 計算機では数を扱う際に決まった記憶容量を割り当てる 計算機による演算結 果がその記憶容量の上限を超えることをオーバーフローと呼ぶ アンダーフロー 計算機による演算結果によって 記憶容量の桁数すべてが 0 になることをアン ダーフローと呼ぶ CPU が扱うことができるのは 16 ビット 2 進数で 16 桁 32 ビット 2 進数で 32 桁 64 ビット 2 進数で 64 桁 といった決まった大きさの数である そこで 16 ビットでの整数表現を -5-
考えてみる 符号なし整数 2 進数 16 桁を 10 進数に変換すると あるいは 216 を計算すると 0 65535 の範 囲の数を表現できる 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 符号付き整数 2 進数 16 桁のうち 1 桁で正負の符号を表現するので 数字に使えるのは残りの 15 桁となる つまり-32768 32767 の範囲の数を表現できる 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 正負 数が実数の時は 計算機では各桁の値の並びである 仮数部 と小数点の位置を示す 指数部 で表現する これを浮動小数点数と呼ぶ 例えば 123.456 は 1.23456 102 であり 1.23456E02 のように 0.000123456 は 1.23456 10-4 であり 1.23456E-04 のように表す 32 ビット実数を考えてみると 2 進数 32 桁のうち1桁で正負の符号 7 桁で指数部 残り 24 桁で仮数部を表現する なお 指数部が負であっても正の数となるようゲタを履かせて表現を行っ ている 表現できる数の範囲や精度はシステムによって異なるが 有効数字は約 7 桁 おおよそ 1 10-38 1 1038 の範囲の数を扱える 1 2 3 4 5 6 7 8 9 10 11 12 指 数 部 正負 17 18 19 20 13 14 15 16 29 30 仮 数 部 21 22 23 24 25 26 27 28 31 32 第3回 データ解析1 要約と視覚化 3 1 要約と視覚化 データの集まりを いくつかの数値に要約して示す グラフによって視覚化する データの性質を表す特徴量 平均値 中央値 分散 標準偏差 データの値の散らばり方 分布 正規分布 t 分布 F 分布 二項分布 仮説が正しいか検定 t 検定 c2 検定 -6-
- 7 -
- 8 -
- 9 -
- 10 -
x = n  i n x i n x 1 x 2 x 3 x 4 x n n 1 + 1 + 1 + + 1 x 1 x 2 x 3 x n - 11 -
Â(x i - x m ) 2 n Â(x i - x m ) 2 n -1 Â(x i - x m ) 2 n Â(x i - x m ) 2 n -1 Â(x i - x m ) 2 (n -1)n - 12 -
- 13 -
- 14 -
c c ms 2 s f (x) = 1 2ps e- (x-m) 2 2s 2-15 -
- 16 -
- 17 -
- 18 -
- 19 -
r -1 r 1 r r 2 ± ±± ±± ±± ±± - 20 -
r r r r = 0 r r 0 r a = 0.05 t = r n - 2 1- r 2-21 -
ここで r 標本の相関係数 n 標本数 4 このとき有意確率 p は Excel によって p=tdist(abs(t), n-2, 2) で計算できる 実際に計算すると t=5.961 p=2.029 10-6 0.05 であるので 帰無仮説を棄却 つま り 母相関係数 r が 0 ではないことが分かる 例題7 3 例題3 1で 鼓膜温度と直腸温度を同時に測定したデータを示した 相関係 数の算出と母相関係数の検定を行い 両者の温度に相関があるかどうか判別しなさい 鼓膜温度 37.1 35.1 35.5 34.9 35.4 37.0 35.0 35.4 35.2 35.8 直腸温度 37.6 35.8 36.4 35.4 36.0 37.3 35.7 36.3 35.9 36.5 演習7 ある化学反応において 素材量と生成量の関係を 20 回測定したところ 以下のデータを得た 散 布図を描いた後 相関係数の算出と母相関係数の検定を行い 素材量と生成量に相関があるかど うか判別しなさい 素材量 200 1000 1420 230 1097 1760 660 370 1050 922 生成量 200 600 900 400 1200 1040 400 400 400 800 素材量 500 60 638 1800 300 868 1220 389 400 1760 生成量 600 250 720 1200 360 360 760 240 600 1040 相関係数 r 検定統計量 t 有意確率 p 値 したがって 素材量と生成量には 第8回 データ解析6 回帰分析 8 1 回帰分析 regression analysis とは 前節では 2つの変数 x と y の関係 相関 を分析した 2変数の間に関係があることが分かっ たならば 具体的にどんな関係があるのか知りたくなる 回帰分析では 変数 x と y の関係を示す式を求めることができる 言い換えると ある変数 x 説明変数または独立変数と呼ぶ からある変数 y 目的変数または従属変数と呼ぶ を予測する 回帰関数を求め 回帰が有意であるか この回帰関数がよく当てはまっているかを検定する方法 である - 22 -
y = ax + b - 23 -
- 24 -
S = Â ( ax 1 + b) - y 1 2 + ( ax 2 + b) - y 2 2 + ( ax 3 + b) - y 3 2 +L = ax i + b i ( ) - y i 2-25 -
第 10 回 数値計算1 C言語の基礎 10ー1 プログラミング言語 プログラミング言語とは コンピュータに仕事をさせるための作業手順書である その作業の 目的に合わせて 事務処理用 COBOL 科学技術用 FORTRAN, BASIC, Pascal システム記 述用 C 記号処理用 LIPS, PROLOG など 種々のプログラミング言語が開発されている 10 2 C言語の特徴 C言語の命令はハードウェアに近い 比較的低レベルの機能を持っている プログラムの構造が関数を基本とした集合体であり プログラムは関数の集合として作成で きる ファイル入出力 文字列操作 算術演算などの機能を ひとつの関数として扱える 10 3 C言語の復習 例題 10 1 自分の名前を画面に表示させるプログラム printf 関数 printf( 出力したい文字など ) 例題 10 2 整数 9 と実数 9.80665 をそれぞれ画面に表示させるプログラム printf 関数 printf( 出力したい数字の書式, 出力したい変数の名前) %d 整数型を 10 進数で出力 %f 実数型 表示桁数は f の前の数字で指定 例題 10 3 整数の入力を求め それを画面に表示させるプログラム scanf 関数 scanf( 入力したい数字の書式, 出力したい変数を示すポインタ) 例題 10 4 2つの整数の入力を求め その和を画面に表示させるプログラム 例題 10 5 例題9 4で 和を求める計算を外部関数 int extern_sum()に行わせてみる 例題 10 6 2つの実数の入力を求め その実数を解とする2次方程式を画面に表示させる プログラム 例題 10 7 2つの実数の入力を求め その実数を階とする2次方程式を画面に表示させた 後 解の公式を用いて2つの実数解を求めるプログラム - 26 -
#include<stdio.h> void main() printf("kosaku Kurata"); #include<stdio.h> void main() int a; float b; a=9; b=9.80665; #include<stdio.h> printf("%d n", a); printf("%f n", b); void main() int a; #include<stdio.h> printf("input your favorite integer! n"); scanf("%d", &a); printf("your favorite integer is %d. n",a); int a, b; int extern_sum(); void main() int sum; int extern_sum() int wa; printf("a =? "); scanf("%d", &a); printf("b =? "); scanf("%d", &b); sum=extern_sum(); printf("a+b= %d n", sum); #include<stdio.h> void main() int #include<stdio.h> a, b, sum; printf("a =? "); scanf("%d", &a); printf("b =? "); scanf("%d", &b); sum=a+b; printf("a+b= %d n", sum); void main() float x1, x2, b, c; #include<stdio.h> #include<math.h> printf("x1 =? "); scanf("%f", &x1); printf("x2 =? "); scanf("%f", &x2); b=-x1-x2; c=-x1*(-x2); printf("ax^2+bx+c=0 n"); printf("(a, b, c)=(1.0, %f, %f) n", b, c); void main() float x1, x2, b, c; float kai1, kai2; printf("x1 =? "); scanf("%f", &x1); printf("x2 =? "); scanf("%f", &x2); b=-x1-x2; c=-x1*(-x2); printf("ax^2+bx+c=0 n"); printf("(a, b, c)=(1.0, %f, %f) n", b, c); kai1=(-b+sqrt(b*b-4.0*1.0*c))/2.0; kai2=(-b-sqrt(b*b-4.0*1.0*c))/2.0; printf("kai1 = %f n", kai1); printf("kai2 = %f n", kai2); wa=a+b; return(wa); - 27 -
#include<stdio.h> #include<stdio.h> void main() int i, sum; void main() int i, sum; sum=0; for(i=1;i<=10;i++) sum=sum+i; printf("%d n", sum); sum=0; for(i=1;i<=100;i++) sum=sum+i; if(sum>1000) break; printf("%d n", i); - 28 -
x = n  i n x i n x 1 x 2 x 3 x 4 x n n 1 + 1 + 1 + + 1 x 1 x 2 x 3 x n #include<stdio.h> #include<math.h> #include<conio.h> void main() int i; int data[10]=10,9,8,7,6,5,4,3,2,1; getch(); for(i=0; i<10; i++) printf("%d : %d n", i, data[i]); #include<stdio.h> #include<math.h> #include<conio.h> void main() int i; int data[10]; getch(); for(i=0; i<10; i++) data[i]=i+1; for(i=0; i<10; i++) printf("%d : %d n", i, data[i]); - 29 -
例題 11 3 #include<stdio.h> #include<math.h> #include<conio.h> void main() int int i, sum; data[10]=1,2,3,4,5,6,7,8,9,10; getch(); sum=0; for(i=0; i<10; i++) sum=sum+data[i]; printf("%d n", sum); 演習 11 例題3 2で 高齢者8人の血圧を午前と午後に測定したところ 下表のようなデータが得られ た 午後の血圧データを配列 data_pm[8]として準備し 算術平均 不偏分散 標準偏差を計算 画面表示するプログラムを作りなさい n Âx 算術平均 x= i 不偏分散 Â (x i 午後の血圧 i - x m )2 n -1 午前の血圧 - x m )2 Â (x 標準偏差 1 n n -1 患者番号 i 2 3 4 5 6 7 8 182 169 173 143 158 156 176 165 163 142 174 137 151 143 180 162 第 12 回 数値計算3 二分法 12ー1 二分法とは 方程式がある区間で根を1つだけ持つことが分かっている場合に その近似値を求める最も簡 単な方法 - 30 -
e e e e - 31 -
#include<stdio.h> #include<math.h> #include<conio.h> void main() double a, b, c; double eps; a=0.0; b=1.0; eps=0.0001; double fy(double x) double y; y=pow(x, 3.0)+x-1.0; return(y); x 2 ln x =1 y = x 2 ln x -1 ln y = x 2 ln x -1-32 -
e e - 33 -
e e #include<stdio.h> #include<math.h> #include<conio.h> void main() double a; double eps; a=1.0; eps=0.0001; double fy(double x) double y; y=pow(x, 3.0)+x-1.0; return(y); double dfy(double x) double y; y=3.0*pow(x, 2.0)+1.0; return(y); 3x 4 + x 2-25 = 0-34 -
y = 3x 4 + x 2-25 y = 3x 4 + x 2-25 S = ( ax 1 + b) - y 1 2 + ( ax 2 + b) - y 2 2 + ( ax 3 + b) - y 3 2 + ( ax 4 + b) - y 4 2-35 -
S a = 0 S b = 0 (x 0,y 0 ),(x 1, y 1 ),(x 2,y 2 ),,(x n, y n ) y = a 0 + a 1 x 1 + a 2 x 2 + a 3 x 3 + + a m x m Dy k Dy k = y k - (a 0 + a 1 x 1 k + a 2 x 2 k + a 3 x 3 k + + a m x m k ) S = Â(Dy k ) 2 n  2 = y k - (a 0 + a 1 x k 1 + a 2 x k 2 + a 3 x k 3 + + a m x k m ) k= 0 a 0,a 1,a 2,a 3,,a m S a 0,a 1,a 2,a 3,,a m a 2 n 2  y k - (a 0 + a 1 x 1 k + a 2 x 2 k + a 3 x 3 k + + a m x m k ) x 2 k = 0 k= 0 2 m a 0 (n +1) + a 1  x k + a 2  x k + + a m  x k =  y k 2 3 m +1 a 0  x k + a 1  x k + a 2  x k + + a m  x k =  x k y k m m +1 3 2m a 0  x k + a 1  x k + a 2  x k + + a m  x k =  x m k y k a 0,a 1,a 2,a 3,,a m a 0,a 1,a 2,a 3,,a m - 36 -