由于gnuplot突然跳转而删除垂直线

时间:2017-10-24 02:16:03

标签: gnuplot

我正在尝试绘制一个包含gnuplot中的不连续性的函数。结果,gnuplot自动绘制连接跳跃不连续的垂直线。我想删除这一行。我环顾四周,发现了两个解决方案,其中没有一个解决方案:一个解决方案是在绘图时使用smooth unique,另一个解决方案是以条件形式定义函数并手动删除不连续性。第一个解决方案根本没有对绘图进行任何更改(至少在视觉上)。第二个解决方案似乎将跳跃不连续的位置向左或向右移动,而不是摆脱垂直线。请注意,我想绘制with lines。我知道with points有效,但我不想用积分进行绘图。

set sample 10000
N=50
l1(x)=2*cosh(1/x)
l2(x)=2*sinh(1/x)
Z(x)=l1(x)**N+l2(x)**N
e(x)=(-1/Z(x))*(l2(x)*l1(x)**(N-1)+l1(x)*l2(x)**(N-1))
plot e(x)

产地:

2 个答案:

答案 0 :(得分:2)

如果你需要做的就是删除奇点处的垂直线,你可以使用条件绘图:

plot (x<0 ? 1/x : 1/0)  w l ls 1, (x>0 ? 1/x : 1/0) w l ls 1

enter image description here

但是,您的功能更复杂:无法在0左右的区域进行数值评估:

set grid
set xrange [-0.3:0.3]
plot e(x) with linespoints

enter image description here

如果要信任Mathematica,则函数e(x)分别为1和-1,因为x分别从左侧和右侧接近0。但是,您在上图中看到gnuplot无法在x = 0.1时正确评估函数。 print e(0.1)代表-0.0print e(0.05)已授予NaN。在该区域中,函数e(x)的分子和分母变得太大而无法用浮点数处理。

您可以使用条件绘图排除此区域,

plot (x<-0.15 ? e(x) : 1/0)  w l ls 1, (x>0.15 ? e(x) : 1/0) w l ls 1

enter image description here

或者您必须重写函数e(x),以便在评估中避免使用非常大的值(如果可能的话)。或者,您可以使用可以切换到更高精度的软件包,例如Mathematica。

答案 1 :(得分:2)

您可以重新定义函数e(x)以避免计算大指数,例如

e(x) = -(l2(x)/l1(x) + (l2(x)/l1(x))**(N-1))/(1 + (l2(x)/l1(x))**N)

现在你总是在掌权前计算l2(x)/l1(x)

对于10000的高采样率,这仍然会在奇点附近给出一些未定义的点,因此您没有连接线。对于例如较低的采样率。 1000你也会看到一条过零的线。为避免这种情况,您可以使用奇数采样率:

set sample 1001
N=50
l1(x)=2*cosh(1/x)
l2(x)=2*sinh(1/x)
Z(x)=l1(x)**N+l2(x)**N
e(x) = -(l2(x)/l1(x) + (l2(x)/l1(x))**(N-1))/(1 + (l2(x)/l1(x))**N)

set autoscale yfix
set offsets 0,0,0.05,0.05
plot e(x) with lines

enter image description here