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

时间:2011-08-17 06:14:31

标签: math wolfram-mathematica plot

在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

我已尝试将PlotPoints的{​​{1}}和WorkingPrecision选项分别设置为30和20,但无济于事。您还会注意到唯一的数字参数ContourPlot是一个精确的有理数。我不知道还有什么可以尝试的。感谢。

编辑:我期望获得的曲线是下图中的三个黑色曲线(标记为A1,A2和A3)

Expected curves (the black ones)

5 个答案:

答案 0 :(得分:6)

我有一些非常类似于你对l.h.s.的实部和虚部的单独绘图的期望。等式:

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

enter image description here

答案 1 :(得分:6)

您确定a的图片和/或定义吗?根据{{​​1}}的定义,它遵循a a[k,w]==0,但该曲线未显示在您的图片中。

无论如何,假设k==w的定义是正确的,绘制轮廓的问题是在域a中,w^2/r^2-k^2<0p[k,w]都变成了纯粹的想象这意味着Sin[p[k,w]]也变成了纯粹的想象。由于a[k,w]不喜欢复数值函数,因此只会绘制域ContourPlot中轮廓的各个部分。

并非w^2/r^2>=k^2Sin[p[k,w]]/p[k,w]k的所有值都是真实的(并且它在极限w中表现良好)。因此,要解决p[k,w]->0变得复杂的问题,您可以改为绘制轮廓a

a[k,w]/p[k,w]==0

<强>结果

contour plot of a/p==0

答案 2 :(得分: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}]

enter image description here

是否可能存在转录错误?

(如果这无益,我道歉。)

答案 3 :(得分:3)

仅当pq都是非负值时,

w^2 - k^2 ans w^2/r^2 - k^2才会真正有价值。 w^2 / r^2 - k^2只会在您的情节区域的以下区域中为非负值:

enter image description here

因此其他所有内容都会被ContourPlot切断。也许你需要对方程进行一些修正(你只需要实部?幅度?)我不相信Mathematica给你的曲线是非常不准确的。否则,如果增加PlotPointsMaxRecursion(例如,增加到50和4),就可以提高轮廓的准确性。

答案 4 :(得分:1)

尝试使用方程式的参数化。例如,定义a=w^2-k^2b=w^2/r^2-k^2,然后求解ab并将其映射到kw