9. 練習問題の答え・2

練習問題5

サンプルコードとしては、以下を挙げておく。別の書き方はいくらでもあり、もっと美しく/短く/安全に書くこともできるので、これが正解というほどのことではないことを、改めて注意しておく。

#include <stdio.h>
#include <math.h>
#define  T 0.4       // calculation duration
#define  max  10     // the maximum number of i
#define  dt 0.005    // delta t
#define  dx 0.1      // delta x
#define  a  1.0      // a
#define  pi 3.141592
double   u[max+1][2];  // u_i^n is written as u[i][n], while n=0 or 1

int  main(void){
 double time=0;
  double r=a*dt/dx/dx; int i,j;
  for (i=0;i<max;i++){
    u[i][0]=0.0; u[i][1]=0.0;
  }
  for(i=0;i<=max;i++){         //define the initial condition
    u[i][0]=sin(pi*(double)i*dx);
  }
  u[0][1]=0.0; u[max][1]=0.0;  //put the boundary condition
  while (T>=time){
    printf("t=%3.3f",time);
    for(i=1;i<max;i++)
      u[i][1]=u[i][0]+r*u[i+1][0]-r*2.0*u[i][0]+r*u[i-1][0];
    for(i=0;i<=max;i++){
      printf("\t %3.3f",u[i][0]);      
      u[i][0]=u[i][1];
    }
    printf("\n");
    time=time+dt;
  }
  return(0);
}