ワンパルスの波を描く

講義の中で衝撃波の話が出てきたのですが,波面の共通接線だけが強めあい,他は打ち消しあう
というのが良くわからなかったので,これはもう計算してしまおうと考えて,以下やってみました.

まずは準備として,ワンパルスの波を作図します.振動数は 1Hz,速度は 4[m/s]です.

以下にプログラムを示します. 周波数は frq = 1 Hzです。波の速度は velo = 4 m/sec です。
波紋の中心は (x0, y0) = ( 0, 0 )です。

プログラムの中で,nami[t,x,y,x0,y0]という関数を定義していますが,これは時刻t=0において
座標(x0,y0)からスタ-トしたワンパルスの波が,時刻tのとき座標(x,y)においてどのような変位で
あるかを与えるものです.

nami[t_,x_,y_,x0_,y0_]:=
           If[(velo*(t-shuki)<r[x,y,x0,y0]) && (r[x,y,x0,y0]<velo*t),
              Sin[-2*Pi*(r[x,y,x0,y0]-velo*(t-shuki))/hachou]*warur[x,y,x0,y0],0];


ワンパルスにするためにIf文を用いて波を切り抜いています.

波の開始地点からの距離を求めるのに r[x,y,x0,y0]という関数も定義しています.

r[x_,y_,x0_,y0_]:=Sqrt[(x-x0)^2 + (y-y0)^2];

波の振幅は伝わるにつれて,1/rに比例して小さくなっていきます.そこで 1/rを掛け算することが
必要になりますが,この値が無限大になってしまうのが怖いので、rで割り算する関数 warur[x,y,x0,y0]も
用意しました.r=0のところで多少細工をしています.

warur[x_,y_,x0_,y0_]:=If[Sqrt[(x-x0)^2 + (y-y0)^2]==0,1,
            (1-Exp[-Sqrt[(x-x0)^2 + (y-y0)^2]])/Sqrt[(x-x0)^2 + (y-y0)^2]];


作図は3秒経過した後の様子を作図しました.以下プログラムです。

Remove["Global `*"];
Timing[
  frq=1;
  shuki=1/frq;
  r[x_,y_,x0_,y0_]:=Sqrt[(x-x0)^2 + (y-y0)^2];
warur[x_,y_,x0_,y0_]:=If[Sqrt[(x-x0)^2 + (y-y0)^2]==0,1,
           (1-Exp[-Sqrt[(x-x0)^2 + (y-y0)^2]])/Sqrt[(x-x0)^2 + (y-y0)^2]];

  
  velo=4;
  hachou=velo/frq;
  
nami[t_,x_,y_,x0_,y0_]:=If[(velo*(t-shuki)<r[x,y,x0,y0]) && (r[x,y,x0,y0]<velo*t),
        Sin[-2*Pi*(r[x,y,x0,y0]-velo*(t-shuki))/hachou]*warur[x,y,x0,y0],0];

  
  t=3;
  x0=0;
  y0=0;
  
  Plot3D[nami[t,x,y,x0,y0],{x,-20,20},{y,-20,20},PlotRange → {-0.5,0.5},PlotPoints →80];
  ]

[Graphics:htmlfiles/genko_04_1.gif]

せっかくですから,この絵を動かして見ましょう.時刻を変えながらたくさんの絵を描くだけです.
    Do文を用いて繰り返しています.51枚のグラフを描くのですが,Core2Duoの2.4GHzで8秒ぐらいかかります.
    メモリ-も必要です.以下プログラムです.

Remove["Global `*"];
Timing[
  frq=1;
  shuki=1/frq;
  r[x_,y_,x0_,y0_]:=Sqrt[(x-x0)^2 + (y-y0)^2];
  warur[x_,y_,x0_,y0_]:=If[Sqrt[(x-x0)^2 + (y-y0)^2]==0,1,
               (1-Exp[-Sqrt[(x-x0)^2 + (y-y0)^2]])/Sqrt[(x-x0)^2 + (y-y0)^2]];
  
  velo=4;
  hachou=velo/frq;
  
  nami[t_,x_,y_,x0_,y0_]:=If[(velo*(t-shuki)<r[x,y,x0,y0]) && (r[x,y,x0,y0]<velo*t),Sin[-2*Pi*(r[x,y,x0,y0]-velo*(t-shuki))/hachou]*warur[x,y,x0,y0],0];
  
  x0=0;
  y0=0;
  
  Do[
    t=(8/50)*i;
    Plot3D[nami[t,x,y,x0,y0],{x,-20,20},{y,-20,20},PlotRange → {-0.5,0.5},PlotPoints →80];
    ,{i,0,50,1}];

  ]

グラフを描いたら,そのセルをすべて選択して,メニュ-にある[セル]-[グラフィックスのアニメ-ション化]で
動かすことができます(動画をお見せしたいところですが,少しお待ちください).

この動画をaviファイルとして保存します.これには Exportという命令を使います.

Export["test.avi",gsnaplist,"AVI"];

動画の入れ物として gsnaplistというリストを用意しています.

gsnaplist=Table[Null,{i,60+2}];

このリストに描いたグラフを収納して,
後は Exportを用いるだけです.

Remove["Global `*"];
Timing[
  frq=1;
  shuki=1/frq;
  r[x_,y_,x0_,y0_]:=Sqrt[(x-x0)^2 + (y-y0)^2];
  warur[x_,y_,x0_,y0_]:=If[Sqrt[(x-x0)^2 + (y-y0)^2]==0,1,
                 (1-Exp[-Sqrt[(x-x0)^2 + (y-y0)^2]])/Sqrt[(x-x0)^2 + (y-y0)^2]];
  
  velo=4;
  hachou=velo/frq;
  
  nami[t_,x_,y_,x0_,y0_]:=If[(velo*(t-shuki)<r[x,y,x0,y0]) && (r[x,y,x0,y0]<velo*t),Sin[-2*Pi*(r[x,y,x0,y0]-velo*(t-shuki))/hachou]*warur[x,y,x0,y0],0];
  
  x0=0;
  y0=0;
  
gsnaplist=Table[Null,{i,60+2}];
  
  Do[
    t=(8/60)*i;
    gsnaplist[[i+1]]=Plot3D[nami[t,x,y,x0,y0],{x,-20,20},{y,-20,20},
              PlotRange → {-0.5,0.5},PlotPoints →80,DisplayFunction->Identity ];
    ,{i,0,60,1}];
  
  SetDirectory["d:\\today"];
  Export["test.avi",gsnaplist,"AVI"];
  ]

これで作成されるaviファイルは無圧縮のものです.圧縮にはwindows media encoder が良いと思いますが,
aviファイルの縦横のサイズによって上手くいかないことがあります.

環境設定のグラフィックの設定で,グラフィックの境界ボックスのうち,ImageSizeを720x720 にすると
上手く変換できました(理由は良くわかりません).

このようにしてこの動画 ファイルができました.








Created by Mathematica  (May 31, 2007) Valid XHTML 1.1!