Visual C++プログラムからGnuplot(1) では,とりあえずCプログラムからGnuplotを呼び出して,グラフを描けるようになりました.今度は数値計算したグラフをプロットします.プログラムを実行した瞬間にグラフが表示されるようにします.データをプロットする手順は
という感じです.これをプログラム中で一気にやってしまいます.
つぎのプログラムは箱型関数のフーリエ級数を50項足し合わせるものです.
#include <stdio.h> #include <stdlib.h> #include <math.h> #define N 50 /* 項の数 */ double term(int n, double x){ return sin((2*n-1)*x)/(2*n-1); } int main(void){ int i; double x, y=0; FILE *fp; fp = fopen("tmp.dat", "w"); for (x=-3.14; x<3.14; x+=0.001) { /* x+= の値はプロットの刻み幅 */ for (i=1; i<=N; i++) { y += term(i,x); } fprintf(fp, "%lf %lf\n", x, 4/3.14*y); y=0; } fclose(fp); system("wgnuplot -persist setting.plt"); return 0; }
まず関数を数値計算しておいて tmp.dat というファイルに保存します.それを描画するgnuplot用の命令をsetting.pltに書いておいて, system()関数でgnuplotの引数として呼び出します.
座標軸や描画範囲などを少し細かく設定しておきます. Cのソースにあるように,このファイルは setting.plt という名前で保存しておきます.
set xzeroaxis set yzeroaxis set xrange[-pi:pi] set yrange[-1.2:1.2] set xtics axis set ytics axis plot "tmp.dat" with lines
保存場所はCのソースと同じフォルダです.
Visual C++上でコンパイル,ビルド,実行します.そして
のようにグラフが表示されれば成功です.ウィンドウ上にではなくepsファイルとして出力したい場合は, setting.pltファイルの上の方(plotの行より上)に以下の命令を追加します.
set terminal postscript eps color set output 'output.eps'
再び実行すると(今回はソースに変更点はないのでコンパイル,ビルドは必要ありません),ソースと同じフォルダにoutput.epsという名前のepsファイルが出来上がります.ポストスクリプトビューアのGSviewで表示させると以下のようになります.
この出力epsファイルをpdfに変換したものを下に置いておきます.
印刷したいときやTeXの文書にグラフを入れたいときはepsで出力します.ウィンドウ出力と違って縦横比もキチっときまります.大きく印刷したいときはプログラム中でプロットの刻み幅を増やすと滑らかな曲線になります(そのかわりファイルサイズ,計算時間ともに増えます).