公告:网站程序已升级到1.8.3,修复了提问时可能报错的问题,请清除浏览器缓存
2019-11-10

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+2 投票
1.6k 浏览

如何画出类似《复分析:可视化方法》书中将复变函数转化为向量场的图像?

貌似需要算复位势来求向量线的密度?这种图是不是相当于某种程度的等高线图?

用户: EmberEdison (806 分)

2 个回答

+1 投票
 
已采纳

本来是不想自问自答的,但是很尴尬的是,最后还是我自己找到了答案,为了防止误导还是作答如下:

那本书的图(也就是题目里面的图)其实是不对的;

将复函数转化为向量场就是求一个复函数的波利亚向量场,在旧版本里面是

(* << VectorFieldPlots` *)
PolyaFieldPlot[f,{x,xmin,xmax},{y,ymin,ymax}]

这个函数已经过期了。相对应的新版本的函数是

VectorPlot[{Re[f],-Im[f]},{x,xmin,xmax},{y,ymin,ymax}, VectorScale -> {Automatic, Automatic, #5^(1/4) &}]

没错,用ReIm其实是不对的。至于是不是#5的1/4次幂还是其他的关于#5的函数尚未确认。

一个复函数对应着一个流,这个流就是该复函数导数的波利亚向量场,复函数的实部是该向量场的势函数,虚部是流函数。势函数的绘制用ContourPlot,流函数用StreamPlot。

它们之间的关系可以用下图给读者参考之:

fn = Tan [x + I*y];
Block[{G1 = VectorPlot[{Re[fn], -Im[fn]},
    {x, -2 \[Pi], 2 Pi}, {y, -2 \[Pi], 2 Pi}, 
    VectorScale -> {Automatic, Automatic, #5^(1/4) &}],
  G2 = ContourPlot[
    Im[fn] - Im[fn]/(Re[fn]^2 + Im[fn]^2), {x, -2 \[Pi], 
     2 Pi}, {y, -2 \[Pi], 2 Pi}, Contours -> 50, 
    ContourShading -> None],
  G3 = ContourPlot[
    Re[fn] + Re[fn]/(Re[fn]^2 + Im[fn]^2), {x, -2 \[Pi], 
     2 Pi}, {y, -2 \[Pi], 2 Pi}, Contours -> 50, 
    ContourShading -> None, ContourStyle -> Dashed],
  G4 = StreamPlot[{1 - (Re[fn]^2 - Im[fn]^2)/(
      Re[fn]^2 + Im[fn]^2), (-Re[fn] Im[fn])/(Re[fn]^2 + Im[fn]^2)},
    {x, -2 \[Pi], 2 Pi}, {y, -2 \[Pi], 2 Pi}, StreamPoints -> 200],
  G5 = PlotC[Tan[x + I y], -2 \[Pi], 2 \[Pi], -2 \[Pi], 2 \[Pi], 
    0.05, {Re[z], Im[z]}],
  G6 = Plot3D[
    Abs[Tan[x + I y]], {x, -2 \[Pi], 2 Pi}, {y, -2 \[Pi], 2 Pi}, 
    ColorFunction -> (Hue[Arg[Tan[#1 + I #2]]/2 \[Pi] + 0.5] &), 
    AxesLabel -> {Re[x], Im[x], Abs[y]}, 
    ExclusionsStyle -> {Opacity[0.5], Directive[Thick, Blue]}, 
    BoundaryStyle -> Directive[Red, Thick], 
    PerformanceGoal -> "Quality"]}, {G1, G2, G3, G4, Show[G2, G3], 
  Show[G3, G4], G5, G6}]
Clear[fn]

PlotC是我自己改编的一个基于RasterArray的函数,原型在wiki上,在mmaqa也用这个函数回答过函数绘图问题。

用户: EmberEdison (806 分)
采纳于 用户:EmberEdison
+1 投票

先把复函数转化一下,然后用VectorPlot绘图。

比如:

VectorPlot[{x + y, x - y}, {x, -1, 1}, {y, -1, 1}]

详见帮助。

用户: 野鹤 (4.9k 分)
这个方法密度和要求的不一样
确切地说不是密度不一样,而是采样的方式(Mathematica相应选项VectorPoints)不一样,但是光看截图不好判断原图用的是什么采样策略(尤其是第一幅图),总不会其实是手绘的吧?总之下面这个比默认出图接近截图(当然依旧不太像):pts = Flatten[Table[{r Cos@th, r Sin@th}, {r, 2., 4}, {th, 0, 2 Pi, 2 Pi/20}], 1];

VectorPlot[{Re@#, Im@#} &[#^2 &@(a + b I)], {a, -5, 5}, {b, -5, 5}, VectorPoints -> pts]
可以用ReIm。我之前也调了半天VectorPoints然后放弃了
客服一直没回我那封问怎么才能升到10.4的信,所以我还是9……
...