我正在尝试绘制一个包含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)
答案 0 :(得分:2)
如果你需要做的就是删除奇点处的垂直线,你可以使用条件绘图:
plot (x<0 ? 1/x : 1/0) w l ls 1, (x>0 ? 1/x : 1/0) w l ls 1
但是,您的功能更复杂:无法在0左右的区域进行数值评估:
set grid
set xrange [-0.3:0.3]
plot e(x) with linespoints
如果要信任Mathematica,则函数e(x)分别为1和-1,因为x分别从左侧和右侧接近0。但是,您在上图中看到gnuplot无法在x = 0.1时正确评估函数。 print e(0.1)
代表-0.0
,print 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
或者您必须重写函数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