Excelとの連携 2 実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画 今日のポイント 関数グラフ描画のためのテクニックを身につける 1 CSVファイルとは(再掲) コンマ区切り(Comma Separated Values)形式の テキストファイル データをコンマ(,)で区切り、改行を用いて2次元 的に配列 コンマを含むデータは二重引用符(")でくくられる。 ファイル出力例 fprintf(fp,"%f, %f, %f\n", a, b, sum); ファイル入力例 fscanf(fp,"%lf, %lf, %lf", &a, &b, &sum); 2 例14.1.1 CSVファイルへの出力 (コマンドプロンプトを使わない場合) /* ex14_1_1.c */ #include <stdio.h> int main(void) 教科書p.129参照 { 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; CSVじゃない } 3 実数列を生成するプログラム(悪い例) /* 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 の いいとこどり 4 実行結果(悪い例) Z:\nyumon2>cl forflt1.c ... Z:\nyumon2>forflt1 x=0 x = 0.01 0.84 あたりから誤 ... 差が蓄積 x = 0.999999 5 実数列を生成するプログラム(よい例) /* 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; } 6 実行結果(よい例) Z:\nyumon2>cl forflt2.c ... Z:\nyumon2>forflt2 x=0 x = 0.01 ... x=1 7 数学関数の利用例 /* pi.c */ #include <stdio.h> #include <math.h> 教科書pp.16~18参照 int main(void) { printf("PI = %.20g\n", 4.0*atan(1.0)); return 0; } 小数以下20桁 atan(x): arctan(x), すなわち tan-1(x) を計算(ラジアン) 8 リサージュ図形を生成するプログラム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; 空白を入れておくと } 負の数のときも揃う 9 コマンドプロンプトで実行 Z:\nyumon2>cl lissaje1.c ... ... Z:\nyumon2>lissaje1 > lissaje1.csv 10 Excel によるリサージュ図形描画 1. 2. 3. 4. 5. CSVファイルをダブルクリックして、Excelを起動 Microsoft Excelブック(*.xls)形式で保存 忘れない うちに保存 プロットしたいデータ列を2列分選択 「グラフウィザード」をクリック 「散布図」を選択し、「形式(T)」でマーカーなしの折れ線 グラフを選択 6. 「次へ>」を2回クリックし、「タイトルとラベル」タブを表示 7. 「X/数値軸(A)」に x、「Y/数値軸(V)」に y を記入 8. 「完了」をクリック 最後に上書き保存 11 Excel におけるリサージュの修正 必ずグラフエリアを選択した状態で行う 「グラフ(C)」メニューの「グラフオプション(C)...」に よる変更 「目盛線」タブでY軸の目盛線の削除 「凡例」タブで凡例の削除 右クリックでの「~書式設定(O)…」による変更 「軸の書式設定(O)...」の「目盛」タブでX(Y)/数値軸との 交点(C)変更 「プロットエリアの書式設定(O)...」で領域の背景色削除 12 修正前と修正後 1.5 1 0.5 1.5 y 0 -1 -0.5 0 0.5 1 1.5 0.5 -0.5 y -1.5 1 系列1 -1 0 -0.5 -1.5 x -1 -1.5 -1.5 -1 -0.5 0 0.5 1 1.5 x 13 リサージュ図形を生成するプログラム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; } 14 対数グラフに表示させる例 /* sinc2.c */ #include <stdio.h> RAND_MAXに必要 #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; } 15 コマンドプロンプトで実行 Z:\nyumon2>cl sinc2.c ... ... Z:\nyumon2>sinc2 > sinc2.csv 16 Excel で対数グラフを描く 1. CSVファイルを開き、*.xls 形式で保存 2. 「グラフウィザード」により「散布図」の折れ線 グラフを描く 3. X軸またはY軸の数値軸(目盛)を右クリック 4. 「軸の書式設定(O)...」をクリック 5. 「目盛」タブを選択 6. 下方の「対数目盛を表示する(L)」をチェック 7. 「 OK 」をクリック 17 Excel における対数グラフの修正 8. 「グラフオプション(O)…」で目盛線、補助目盛 線を描く 9. 補助目盛線を右クリックして「目盛線の書式設 定(O)...」を開き、「パターン」タブで線スタイルを 点線にする 10. X軸またはY軸の数値軸(目盛)を右クリックし て「軸の書式設定(O)...」を開き、「目盛」タブ内 でX(Y)/数値軸との交点(C)を調節する 11. 「目盛」タブの最大値、最小値を調節する 18 修正前と修正後 1.2 1 0.1 0.1 1 1 10 100 0.01 sinc(x)^2 0.001 0.6 0.4 0.0001 0.00001 0.000001 0.2 0.0000001 1 0.00000001 0 0 5 10 15 20 25 30 35 0.000000001 x x 0.1 sinc(x)^2 sinc(x)^2 0.8 0.01 0.001 0.0001 0.1 1 10 x 100 19 スキルアップタイム 1. x を対数軸上で等間隔になるように生成し、 y = 1/(1+x2) を計算して x, y を標準出力する プログラム lorentz.c を作成せよ。 2. lorentz.c をコンパイルし、その実行結果を lorentz.csv に保存せよ。 3. 上記の結果を両対数グラフにせよ。 20 ヒント x を等比数列にする (x = a ri , 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) or r = pow(10, 1.0/N) x = xmin*pow(r,i) pow(x,y): べき乗関数 xy 21
© Copyright 2024 ExpyDoc