9. 移流方程式の解法

さていよいよ移流方程式を解くことを考えよう。以下では簡単のため、1次元の移流方程式

画像に alt 属性が指定されていません。ファイル名: advection.jpg

$$\frac{\partial T}{\partial t}+u\frac{\partial T}{\partial x}=0$$

を解くことを考える。これは速度$u$で何らかの物理量$T$を形を変えずに運んでいることに相当する。

これはわざわざ数値計算などで解くまでもなく、右($x$についてプラス側に動くものは$T(x,t)=f(x-ut)$という一般解を持つことがわかる。

さて問題は、これをどのようにして数値的に解くことができるか、ということである。これを差分形式で書いてみよう。

$$\frac{T_i^{n+1}-T_i^{n}}{\Delta t}=-u\frac{T_{i+1}^n-T_i^n}{\Delta x}$$

$$T_i^{n+1}=T_i^{n}-u\frac{\Delta t}{\Delta x}(T_{i+1}^n-T_i^n)$$

と考えるかもしれない。

まずこれを数値的に解くことにして、以下の差分形式でサンプルコードを作成してみよう

練習問題9-1.

#include <stdio.h>
#include <math.h>
#define u 1.0
#define dt 0.1
#define xmax 200
#define imax 200
#define tmax 10

int main(void){
  double dx=(double)xmax/imax;
  double x;
  double T[xmax+1],cfl;
  int t;
  cfl=u*dt/dx;
  int i;
  for (i=1; i<=imax; i++){
    if (i>=10&&i<50)
      T[i]=1.0;
    else
      T[i]=0.0;
  }
  for (i=1; i<imax; i++)
    printf("%2.2e,",T[i]);
  printf("\n");   
  for (t=1; t<=tmax; t++){
    for (i=1; i<imax; i++)
      T[i]=ここに記述する;
    if (t%1==0){
      for (i=1; i<imax; i++)
        printf("%2.2e,",T[i]);
      printf("\n");
    }
  }  
}

これは、実は数値的に発散してしまうことを確かめるためのコードになっている。これでは数値的に発散してしまうことが確かめられたら、次に差分の方法をやりなおしてみる。まず

$$T_i^{n+1}=T_i^{n}-u\frac{\Delta t}{\Delta x}(T_{i+1}^n-T_i^n)$$

の代わりに

$$T_i^{n+1}=T_i^{n}-u\frac{\Delta t}{\Delta x}(T_{i}^n-T_{i-1}^n)$$

としてみよう。計算を100ステップごとに結果を書きだすように変更して、さらに時間時間を10から500に変更してたサンプルコードを完成してみよ:

練習問題9-2.

#include <stdio.h>
#include <math.h>
#define u 1.0
#define dt 0.1
#define xmax 200
#define imax 200
#define tmax 500

int main(void){
  double dx=(double)xmax/imax;
  double x;
  double T[xmax+1],cfl;
  int t;
  cfl=u*dt/dx;
  int i;
  for (i=0; i<=imax; i++){
    if (i>=10&&i<50)
      T[i]=1.0;
    else
      T[i]=0.0;
  }
  for (i=1; i<imax; i++)
    printf("%2.2e,",T[i]);
  printf("\n");   
  for (t=1; t<=tmax; t++){
    for (i=1; i<imax; i++)
      T[i]=ここに記述する;
    if (t%100==0){
      for (i=1; i<imax; i++)
        printf("%2.2e,",T[i]);
      printf("\n");
    }
  }  
}