如何在Mathematica中获得准确的绘图曲线?

6
在Mathematica中运行以下代码:
r=6197/3122;
p[k_,w_]:=Sqrt[w^2/r^2-k^2];q[k_,w_]:=Sqrt[w^2-k^2];
a[k_,w_,p_,q_]:=(k^2-q^2)^2 Sin[p]Cos[q]+4k^2 p q Cos[p]Sin[q]
a[k_,w_]:=a[k,w,p[k,w],q[k,w]];
ContourPlot[a[k,w]==0,{w,0,6},{k,0,14}]

这使得我的曲线非常不准确:

The curves obtained from the code above are very inaccurate

我尝试将ContourPlot的PlotPointsWorkingPrecision选项分别设置为30和20,但都无济于事。您还会注意到,唯一的数值参数r是一个精确的有理数。我不知道还能尝试什么。谢谢。
编辑:我希望得到的曲线是以下图片中标记为A1、A2和A3的三条黑色曲线。

Expected curves (the black ones)


也许你可以在http://math.stackexchange.com/上提问。 - plaes
4
这不是一个关于数学的问题,而是关于Mathematica软件的问题。 - a06e
你能否包含一张大致展望的图片? - Mr.Wizard
5个回答

6

我已经通过分别绘制等式左侧的实部和虚部得到了与您期望的非常相似的结果:

ContourPlot[{Re@a[k, w] == 0, Im@a[k, w] == 0}, {w, 0, 6}, {k, 0, 14},
  MaxRecursion -> 7]

enter image description here


6
您确定a的图片和/或定义吗?根据a的定义,当k==wa[k,w]==0,但是在您的图片中没有显示这条曲线。无论如何,假设a的定义正确,绘制等高线的问题在于在域w^2/r^2-k^2<0中,p[k,w]Sin[p[k,w]]都变成纯虚数,这意味着a[k,w]也变成了纯虚数。由于ContourPlot不喜欢复杂值函数,因此只有在域w^2/r^2>=k^2中的等高线部分被绘制出来。
注意,对于所有的kwSin[p[k,w]]/p[k,w]都是实数(并且在极限p[k,w]->0下表现良好)。因此,为了避免a变成复数,您可以绘制等高线a[k,w]/p[k,w]==0
ContourPlot[a[k, w]/p[k, w] == 0, {w, 0, 6}, {k, 0, 14}]

结果

a/p=0时的等高线图


你是对的。我在a的定义上犯了一个错误,我已经修复了。谢谢。 - a06e
除以 p 就解决了。我甚至不需要设置 PlotPoints 或其他任何东西!谢谢! - a06e

3

您的函数在所显示的等高线区域内给出了复数。这是您预期的吗?您可以在此处看到实际区域:

ContourPlot[a[k, w], {w, 0, 6}, {k, 0, 14}]

enter image description here

如果我使用以下代码,可以得到与您的代码更接近的结果:

ContourPlot[a[w, k] == 0, {w, 0, 6}, {k, 0, 14}]

在这里输入图片描述

可能出现了录入错误吗?

(如果这并没有帮到您,我深感抱歉。)


之前出现了一个转录错误(由Heike在上面的答案中指出),现在已经修复。然而,它是a[k,w],而不是a[w,k],那里没有错误。无论如何,还是谢谢。 - a06e

3

pq只有在w^2-k^2w^2/r^2 - k^2均为非负数时才具有实值。 w^2/r^2 - k^2仅在您绘图区域的以下区域中为非负数:

enter image description here

因此,ContourPlot将切掉其他部分。也许您需要对方程进行一些更正(您只需要实部吗?幅度?)我不认为Mathematica给出的曲线非常不准确。否则,提高轮廓线准确性的方法是增加PlotPointsMaxRecursion(比如到50和4)。


1
尝试调整您的方程参数。例如,定义a=w^2-k^2b=w^2/r^2-k^2,然后解出ab,并将它们映射到kw上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接