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