次の例は、初期設定をし、線を1本引くだけの簡単なプログラムです。
#include <stdio.h> #include <stdlib.h> #include "cpgplot.h" int main(void) { cpgopen("/CGW"); /* Xwindow上へ描画 */ cpgpap(5.0,1.0); /* ウインドウは5インチ, 縦横比が1.0 */ cpgenv(0.0,10.0 ,0.0, 100.0,0,0); /* 座標の設定 (第5,6引数は0でよい) */ cpgmove(2.0, 10.0); /* ペンの位置を移動 */ cpgdraw(8.0, 70.0); /* 現在のペン位置から指定位置まで線を引く */ }
実行するとつぎのような図が描かれるはずです。線の太さや色を変える関数、円や四角、文字を描く関数も用意されています。
基本的な設定を図示すると次のようになります。
次のプログラムは、非線形方程式の解法の「4.2 反復法と縮小写像」の例としてあげた関数の「写像」を図示するプログラムです。
これを、練習プログラムとして実行させながら、PGPLOT関数を理解しましょう。
#include <stdio.h> #include <stdlib.h> #include "cpgplot.h" float calcMaxX(float a); int main() { float a, x=0.0, y=0.0, x_ini, y_ini; char c[16]; int n; printf("aの値を入力してください.:"); n = scanf("%f", &a); if(a<=0 ||a>=4.0) { printf("0<a<4!\n"); exit(0); } cpgopen("/CGW"); /* Xwindow上へ描画 */ cpgpap(5.0,1.0); /* ウインドウは5インチ, 縦横比が1.0 */ x_ini = calcMaxX(a); /* 座標の最大値 */ cpgenv(0.0 ,x_ini ,0.0, x_ini,0,0); /* 座標の設定 */ /* 関数 f(x)= a*x*(1-x)を書く */ cpgsci(2); cpgmove(0.0, 0.0); /* ペンの位置を移動 */ while(x <= 1.0) { cpgdraw((float) x, (float) a*x*(1.0 - x)); /** 線を引きながらペンの位置を移動 **/ x += 0.05; } /* y=xの直線を書く */ cpgsci(3); cpgmove(0.0, 0.0); cpgdraw(1.0,1.0); /***** ここまでが関数f(x)と座標枠を書くプログラムです。 ブレークポイントを設定して動作を確かめましょう ******/ /* ロジスティックマップの計算 */ printf("マウスクリックによりxの初期値を与えてください."); while(1) { cpgcurs(&x, &y, c); /* マウスカーソルの位置をゲット */ cpgsls(1); /* 線種を実線に指定 */ cpgsci(4); /* 線の色を指定 */ cpgmove(x,0.0); for(n=0; n<100; n++) { y = a * x * (1.0 -x); cpgdraw(x,y); x = y; cpgdraw(x,y); printf("n=%d: %f\n", n, y); } } } float calcMaxX(float a) { /* x!=0の固定点があればその2倍程度の範囲、ただし、最大1.0 */ if(a<1.0) return 0.2; else if(a<2.0) return 2.0*(1.0 - 1.0/a); else return 1.0; }