練習問題2
#include<stdio.h>
#include<math.h>
#define T 0.5 // calculation duration
#define max 10 // the maximum number of i
#define dt 0.01 // delta t
#define dx 0.1 // delta x
#define omega 1.2 // omega
#define a 1.0 // a
#define eps 0.00001
#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 uN,time=0;
double err,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; u[max][1]=0; // put the boundary condition
while (T>time){
do {
err=0.0;
for(i=1;i<max;i++){
uN=u[i][1];
u[i][1]=(1-(double)omega)*uN
+ (double)omega*(1/(1+2*r)*u[i][0]
+ r/(1+2*r)*(u[i+1][1]+u[i-1][1]));
if (err<fabs(u[i][1]-uN))
err=fabs(u[i][1]-uN);
}
}while(err>eps);
printf("%3.3f\t",time);
time=time+dt;
for(i=0;i<=max;i++)
printf("%3.3f\t",u[i][0]);
printf("\n");
for(i=1;i < max;i++)
u[i][0]=u[i][1];
}
return (0);
}