桂田 祐史
Date: 2022年5月24日, 2023年6月20日
以下のコマンドをコピペして実行してみれば良いが、 一気にコピペすると、 複数のコマンドが団子になって大きなセルになってしまうので、 少しずつ(あるいはタイプして入力する) ことを勧める。セルは + +D で分割することもできる。
一様流の可視化 uniform_flow.nb |
(* uniforma_flow.nb *) p=1; q=2; c=p-q I Clear[f,phi,psi,vv] f[z_]:=c z phi[x_,y_]:=ComplexExpand[Re[f[x+I y]]] psi[x_,y_]:=ComplexExpand[Im[f[x+I y]]] (* 次は1つずつ実行して式を見る *) phi[x,y] psi[x,y] g1=ContourPlot[phi[x,y]==Table[level,{level,-5,5,1.0}],{x,-2,2},{y,-2,2}, ContourStyle->Directive[Red,Thin]] g2=ContourPlot[psi[x,y]==Table[level,{level,-5,5,1.0}],{x,-2,2},{y,-2,2}, ContourStyle->Directive[Blue,Thin]] vv[x_,y_]:={Re[f'[x+I y]],-Im[f'[x+I y]]} g3=VectorPlot[vv[x,y], {x,-2,2},{y,-2,2}, VectorScaling -> Automatic] gall=Show[g1,g2,g3] Export["uniform_flow.png", gall] Export["uniform_flow.pdf", gall] |
この uniform_flow.nb が入力できたら、 それを元にして次の source.nb を作ると簡単である。
湧き出しの可視化 source.nb |
(* source.nb *) m=1 Clear[f,phi,psi,vv] f[z_]:=m Log[z] ComplexExpand[f[x+I y]] phi[x_,y_]:=ComplexExpand[Re[f[x+I y]]] psi[x_,y_]:=ComplexExpand[Im[f[x+I y]]] g1=ContourPlot[phi[x,y]==Table[Log[r],{r,0.1,3.0,0.2}],{x,-2,2},{y,-2,2}, ContourStyle->Directive[Red,Thin]] g2=ContourPlot[psi[x,y]==Table[t,{t,-Pi,Pi,Pi/10}],{x,-2,2},{y,-2,2}, ContourStyle->Directive[Blue,Thin]] Show[g1,g2] vv[x_,y_]:={Re[f'[x + I y]], -Im[f'[x + I y]]} (* 次はうまく行かない *) g3=VectorPlot[vv[x, y], {x, -2, 2}, {y, -2, 2}, VectorScaling -> Automatic] (* 原点の近くで大きいから、他が短くなってしまう *) g3=VectorPlot[vv[x, y] Boole[x^2 + y^2 > 0.2], {x, -2, 2}, {y, -2, 2}, VectorScaling -> Automatic] g4 = Show[g1, g2, g3] Export["source.png", g4] Export["source.pdf", g4] |
Mathematica のバージョンによって、プログラムの動作が異なることがある。 古いMathematica では、工夫なしに VectorPlot[] を用いると、 うまく表示されないことがある(原点の近くで、ベクトルが大きく、 それに合わせて矢印の長さを決めると、他のところで矢印が短くなりすぎる)。 上のプログラムは原点付近をあえて描かないことで、 この問題を避ける工夫をしている。
ノートブックも公開しておく。
uniform_flow.nb, source.nb のターミナルからの入手法 |
curl -O https://m-katsurada.sakura.ne.jp/complex2/uniform_flow.nb curl -O https://m-katsurada.sakura.ne.jp/complex2/source.nb |