How to obtain accurate plot curves in Mathematica?

孤者浪人 提交于 2019-12-07 03:14:43

问题


Run the following code In 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}]

This gives me very inaccurate curves:

I have tried setting the PlotPoints and WorkingPrecision options of ContourPlot to 30 and 20 respectively, to no avail. You will also notice that the only numerical parameter, r, is an exact rational number. I don't know what else to try. Thanks.

Edit: The curves I expect to get are the three black ones (marked A1, A2, and A3) on the following picture


回答1:


Are you sure about the picture and/or the definition for a? From the definition of a it follows that a[k,w]==0 on k==w but that curve doesn't appear in your picture.

Anyway, assuming that the definition of a is right, the problem with plotting the contours is that in the domain w^2/r^2-k^2<0, both p[k,w] and Sin[p[k,w]] become purely imaginary which means that a[k,w] becomes purely imaginary as well. Since ContourPlot doesn't like complex valued functions only the parts of the contours in the domain w^2/r^2>=k^2 are plotted.

Not that Sin[p[k,w]]/p[k,w] is real for all values of k and w (and it's nicely behaved in the limit p[k,w]->0). Therefore, to get around the problem of a becoming complex you could plot the contours a[k,w]/p[k,w]==0 instead:

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

Result




回答2:


I have got something very similar to what you expect by separate plotting of real and imaginary parts of the l.h.s. of the equation:

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




回答3:


Your function gives complex numbers in the region of the contour lines you show. Is that what you expect? You can see the region that is real here:

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

I get something in some ways closer to your lines if I use:

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

Is it possible there is a transcription error?

(My apologies if this is unhelpful.)




回答4:


p ans q will be real valued only if w^2 - k^2 and w^2/r^2 - k^2 are both nonnegative. w^2 / r^2 - k^2 will only be nonnegative in the following area of your plot region:

Therefore everything else will be cut off by ContourPlot. Perhaps you need to make some corrections to the equations (you only need the real part? magnitude?) I don't believe the curves Mathematica gives you are very inaccurate. Otherwise the way to go to increase accuracy of the contours if increasing PlotPoints and MaxRecursion (say, to 50 and 4).




回答5:


Try to play with the parametrization of your equations. For example, define a=w^2-k^2 and b=w^2/r^2-k^2, then solve for a and b and map them onto k and w



来源:https://stackoverflow.com/questions/7088632/how-to-obtain-accurate-plot-curves-in-mathematica

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!