#include #include /****************** 図7.3の数値解を求めるプログラム ********************* ・∂u/∂t = -u(∂u/∂x)+μ(∂^2u/∂x^2) 上記バーガース方程式を,アダムス・バッシュフォース法と クランク・ニコルソン法を用いて解きます. ・係数行列は3重対角行列なので,メモリを有効に使うため, A[M-1][M-1] → A[M-1][3+1] として値のあるところのみを配列に代入します. ・初期条件を変えて グラフがゆがむような場合は, Nを大きくするなどしてみて下さい. ・結果は,標準出力のみでファイルへの出力はありません. グラフにする場合は,ファイルにリダイレクトするか, ファイル出力のプログラムを書き加えて下さい. *************************************************************************/ #define eps pow(10,-15) #define Pi acos(-1.) #define Mu 0.01 /******************************/ /********** 初期条件 **********/ /******************************/ /****** t=[t0, tN] ******/ #define t0 0 #define tN 2 #define N 200 //区間[t0, tN]の分割数 #define k (tN-t0)/(double)N //時間ステップ /******************************/ /****** x=[x0, xM] ******/ #define x0 0 #define xM 1 #define M 128 //区間[x0, xM]の分割数 #define h (xM-x0)/(double)M //差分間隔 /******************************/ /******************************/ /******************************/ /********** 境界条件 **********/ /******************************/ #define u0_t 0 //u(x0, t) #define uM_t 0 //u(xM, t) /******************************/ /******************************/ double u_0(double x){ //u(x, 0) double y; y = sin(2*Pi*x); return y; } /***************************************************/ /************ 係数行列を初期化する関数 *************/ /***************************************************/ void initialize_(double A[M][3+1], double p, double q){ int j; // A[1][1] = 0; A[1][2] = q; A[1][3] = p; A[M-1][1] = p; A[M-1][2] = q; // A[M-1][3] = 0; for(j=2; j