講義ノート2006年度5E 計算機応用 → ラプラス方程式を解くプログラムの一部

ラプラス方程式を解くプログラムの一部


ラプラス方程式

以下を完成させよ.


#include <stdio.h>
#include <unistd.h>

#define NT 800             // 時間の計算ステップ数 0--800
#define NX 200             // xの計算ステップ数    0--200
#define SLEEP_TIME 20000   // usleep()関数で処理が止まる時間[micro sec]

void set_xt (int nx, int nt, double x[], double t[]);
void initial_condition(int nx, int nt, double alpha, double u[][NT+1]);
/*=====================================================================*/
/*   main                                                              */
/*=====================================================================*/
int main(void){
  double u[NX+1][NT+1];
  double x[NX+1], t[NT+1];
  double xmin, xmax, tmin, tmax;
  double delta_x, delta_t, alpha;
  int i, j;
  FILE *gp;

  //-----------------------------------------------
  // x座標の最小と最大を決める. xmin, xmax
  // 時刻の最小と最大をきめる.  tmin, tmax
  // 計算ステップをきめる.      delta_x, delta_t
  //-----------------------------------------------

  //-------------------------------------------------------
  // alphaを計算して,1以上ならば,警告を発して,プログラムを止める
  //-------------------------------------------------------

  set_xt(NX, NT, x, t);                 // あらかじめ,x[]とt[]を配列へ
  initial_condition(NX, NT, alpha, u);  // 初期条件の設定

  gp = popen("gnuplot -persist","w");
  fprintf(gp, "set xrange [-0.1:1.1]\n");
  fprintf(gp, "set yrange [-0.6:0.6]\n");
  
  for(j=0; j<=1; j++){
    printf("t=%f\n",t[j]);
    fprintf(gp, "plot '-' with lines linetype 1\n");
    for(i=0; i<=NX; i++){
      fprintf(gp,"%f\t%f\n", x[i], u[i][j]);
    }
    fprintf(gp, "e\n");
    usleep(SLEEP_TIME);
  }

  for(j=2; j<=NT; j++){
    printf("%d\tt=%f\n",j,t[j]);
    for(i=1; i<NX ; i++){
      // --------------------------------------
      // 差分化された波動方程式の計算.u[i][j]
      // --------------------------------------
    }
    fprintf(gp, "plot '-' with lines linetype 1\n");
    for(i=0; i<=NX; i++){
      fprintf(gp,"%f\t%f\n", x[i], u[i][j]);
    }
    fprintf(gp,"e\n");
    usleep(SLEEP_TIME);
  }

  pclose(gp);

  return 0;
}

/*=====================================================================*/
/*   set x-coordinate and time                                         */
/*=====================================================================*/
void set_xt (int nx, int nt, double x[], double t[])
{

  //-------------------------------
  //ここで,x[i],t[j]で設定する
  //-------------------------------  
}

/*=====================================================================*/
/*   set initial condition                                             */
/*=====================================================================*/
void initial_condition(int nx, int nt, double alpha, double u[][NT+1])
{
  //-------------------------------
  //境界条件と初期条件の設定
  //-------------------------------

}



last update:



no counter