PGPLOTを使ったプログラムのサンプル

簡単な例

次の例は、初期設定をし、線を1本引くだけの簡単なプログラムです。

#include <stdio.h>
#include <stdlib.h>
#include "cpgplot.h"

int main(void) {

        cpgopen("/xserv");         /* Xwindow上へ描画 (Windowsの場合は"/CGW"とする*/
        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;
}