Download presentation
Presentation is loading. Please wait.
1
実数列を生成する際の注意 数学関数の利用 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ファイルへの出力 (コマンドプロンプトを使わない場合)
オプション 例 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じゃない
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
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
8
数学関数の利用例 /* pi.c */ #include <stdio.h> #include <math.h>
オプション /* 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) を計算(ラジアン)
9
リサージュ図形を生成するプログラム1 /* Lissaje1.c */ #include <stdio.h>
#include <math.h> int main(void) { int i; double th, x, y, PI= ; 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 によるリサージュ図形描画 CSVファイルをダブルクリックして、Excelを起動
Microsoft Excelブック(*.xls)形式で保存 プロットしたいデータ列を2列分選択 「グラフウィザード」をクリック 「散布図」を選択し、「形式(T)」でマーカーなしの折れ線グラフを選択 「次へ>」を2回クリックし、「タイトルとラベル」タブを表示 「X/数値軸(A)」に x、「Y/数値軸(V)」に y を記入 「完了」をクリック 忘れない うちに保存 最後に上書き保存
12
Excel におけるリサージュの修正 必ずグラフエリアを選択した状態で行う
「グラフ(C)」メニューの「グラフオプション(C)...」に よる変更 「目盛線」タブでY軸の目盛線の削除 「凡例」タブで凡例の削除 右クリックでの「~書式設定(O)…」による変更 「軸の書式設定(O)...」の「目盛」タブでX(Y)/数値軸との交点(C)変更 「プロットエリアの書式設定(O)...」で領域の背景色削除
13
修正前と修正後
14
リサージュ図形を生成するプログラム2 /* Lissaje2.c */ #include <stdio.h>
オプション リサージュ図形を生成するプログラム2 /* Lissaje2.c */ #include <stdio.h> #include <math.h> int main(void) { int i; double th, x, y, PI= ; 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= ; 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 で対数グラフを描く CSVファイルを開き、*.xls 形式で保存 「グラフウィザード」により「散布図」の折れ線 グラフを描く
「グラフウィザード」により「散布図」の折れ線 グラフを描く X軸またはY軸の数値軸(目盛)を右クリック 「軸の書式設定(O)...」をクリック 「目盛」タブを選択 下方の「対数目盛を表示する(L)」をチェック 「 OK 」をクリック
18
Excel における対数グラフの修正 「グラフオプション(O)…」で目盛線、補助目盛線を描く
X軸またはY軸の数値軸(目盛)を右クリックして「軸の書式設定(O)...」を開き、「目盛」タブ内でX(Y)/数値軸との交点(C)を調節する 「目盛」タブの最大値、最小値を調節する
19
修正前と修正後
20
スキルアップタイム x を対数軸上で等間隔になるように生成し、
y = 1/(1+x2) を計算して x, y を標準出力するプログラム lorentz.c を作成せよ。 lorentz.c をコンパイルし、その実行結果を lorentz.csv に保存せよ。 上記の結果を両対数グラフにせよ。
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
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.