210 likes | 330 Views
Excel との連携 2. 実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画. 今日のポイント. 関数グラフ描画のためのテクニックを身につける. CSV ファイルとは ( 再掲 ). コンマ区切り ( Comma Separated Values ) 形式 のテキストファイル データをコンマ ( , ) で区切り、改行を用いて 2 次元的に配列 コンマを含むデータは 二重引用符 ( " ) でくくられる。. ファイル出力例.
E N D
Excelとの連携 2 実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画 今日のポイント 関数グラフ描画のためのテクニックを身につける
CSVファイルとは(再掲) • コンマ区切り(Comma Separated Values)形式のテキストファイル • データをコンマ(,)で区切り、改行を用いて2次元的に配列 • コンマを含むデータは二重引用符(")でくくられる。 ファイル出力例 fprintf(fp,"%f, %f, %f\n", a, b, sum); ファイル入力例 fscanf(fp,"%lf, %lf, %lf", &a, &b, &sum);
オプション 例14.1.1 CSVファイルへの出力(コマンドプロンプトを使わない場合) /* ex14_1_1.c */ #include <stdio.h> int main(void) { double a, b, sum; FILE *fp; a = 2.345; b = 5.678; sum = a + b; fp=fopen("foo.csv","w"); fprintf(fp,"%f, %f, %f\n", a, b, sum); fclose(fp); return 0; } 教科書p.129参照 コンマがなければCSVじゃない
実数列を生成するプログラム(悪い例) /* forflt1.c */ #include <stdio.h> int main(void) { float x; // double にするとどうなる? for (x = 0; x <= 1; x += 0.01) { printf(" x = %g\n", x); } return 0; } %gは%fと%eのいいとこどり
実行結果(悪い例) Z:\nyumon2>cl forflt1.c ... Z:\nyumon2>forflt1 x = 0 x = 0.01 ... x = 0.999999 0.84 あたりから誤差が蓄積
実数列を生成するプログラム(よい例) /* forflt2.c */ #include <stdio.h> int main(void) { int i; float x; for (i = 0; i <= 100; i++) { x = i/100.0; // 100 にするとどうなる? // 100. では? printf(" x = %g\n", x); } return 0; }
実行結果(よい例) Z:\nyumon2>cl forflt2.c ... Z:\nyumon2>forflt2 x = 0 x = 0.01 ... x = 1
オプション 数学関数の利用例 /* pi.c */ #include <stdio.h> #include <math.h> int main(void) { printf("PI = %.20g\n", 4.0*atan(1.0)); return 0; } 教科書pp.16~18参照 小数以下20桁 atan(x):arctan(x), すなわち tan-1(x)を計算(ラジアン)
リサージュ図形を生成するプログラム1 /* Lissaje1.c */ #include <stdio.h> #include <math.h> int main(void) { int i; double th, x, y, PI=3.14159265358979; for (i = 0; i <= 200; i++) { th = PI*(i/100.0); x = cos(5*th); y = sin(7*th); printf("% .5f, % .5f\n", x, y); } return 0; } 数字の組み合わせを変えてみると… 空白を入れておくと 負の数のときも揃う
コマンドプロンプトで実行 Z:\nyumon2>cl lissaje1.c ... ... Z:\nyumon2>lissaje1 > lissaje1.csv
Excelによるリサージュ図形描画 • CSVファイルをダブルクリックして、Excelを起動 • Microsoft Excelブック(*.xls)形式で保存 • プロットしたいデータ列を2列分選択 • 「グラフウィザード」をクリック • 「散布図」を選択し、「形式(T)」でマーカーなしの折れ線グラフを選択 • 「次へ>」を2回クリックし、「タイトルとラベル」タブを表示 • 「X/数値軸(A)」に x、「Y/数値軸(V)」に yを記入 • 「完了」をクリック 忘れない うちに保存 最後に上書き保存
Excelにおけるリサージュの修正 • 必ずグラフエリアを選択した状態で行う • 「グラフ(C)」メニューの「グラフオプション(C)...」に よる変更 • 「目盛線」タブでY軸の目盛線の削除 • 「凡例」タブで凡例の削除 • 右クリックでの「~書式設定(O)…」による変更 • 「軸の書式設定(O)...」の「目盛」タブでX(Y)/数値軸との交点(C)変更 • 「プロットエリアの書式設定(O)...」で領域の背景色削除
オプション リサージュ図形を生成するプログラム2 /* Lissaje2.c */ #include <stdio.h> #include <math.h> int main(void) { int i; double th, x, y, PI=3.14159265358979; for (i = 0; i <= 200; i++) { th = PI*(i/100.0); x = (cos(5*th)+sin(7*th))/2; y = (sin(5*th)+cos(7*th))/2; printf("% .5f, % .5f\n", x, y); } return 0; }
対数グラフに表示させる例 /* sinc2.c */ #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int i; double x, y, PI=3.14159265358979; for (i = 1; i <= 300; i++) { x = i/10.; y = sin(PI*x)/(PI*x); y += (0.01*rand())/RAND_MAX; printf("%.5g, %.5g\n", x, y*y); } return 0; } RAND_MAXに必要 ノイズを加えている (省略してもよい)
コマンドプロンプトで実行 Z:\nyumon2>cl sinc2.c ... ... Z:\nyumon2>sinc2 > sinc2.csv
Excel で対数グラフを描く • CSVファイルを開き、*.xls形式で保存 • 「グラフウィザード」により「散布図」の折れ線 グラフを描く • X軸またはY軸の数値軸(目盛)を右クリック • 「軸の書式設定(O)...」をクリック • 「目盛」タブを選択 • 下方の「対数目盛を表示する(L)」をチェック • 「 OK 」をクリック
Excel における対数グラフの修正 • 「グラフオプション(O)…」で目盛線、補助目盛線を描く • 補助目盛線を右クリックして「目盛線の書式設定(O)...」を開き、「パターン」タブで線スタイルを点線にする • X軸またはY軸の数値軸(目盛)を右クリックして「軸の書式設定(O)...」を開き、「目盛」タブ内でX(Y)/数値軸との交点(C)を調節する • 「目盛」タブの最大値、最小値を調節する
スキルアップタイム • x を対数軸上で等間隔になるように生成し、 y= 1/(1+x2)を計算してx, y を標準出力するプログラム lorentz.cを作成せよ。 • lorentz.cをコンパイルし、その実行結果を lorentz.csv に保存せよ。 • 上記の結果を両対数グラフにせよ。
ヒント • xを等比数列にする (x = ari, i = 0,1,2... ) • x の初項は xmin(= 0.1)、公比 rは (xmax/xmin)1/N(Nは総データ点数) または 101/N(Nは1桁あたりのデータ点数) • r = pow(xmax/xmin, 1.0/N) orr = pow(10, 1.0/N) • x = xmin*pow(r,i) pow(x,y):べき乗関数 xy