使用接近零的三次函数绘制参数函数会产生垃圾

时间:2016-04-06 10:56:31

标签: gnuplot

所以我试图用gnuplot绘制三个参数函数; 不幸的是,我无法绕过输出图中生成的一些垃圾。我试图通过将函数j分成j1和j2来隔离问题,只是改变减号的位置。出乎意料的是,当靠近原点时,函数j1和j2奇怪地跳跃。我目前使用的是gnuplot版本4.6,有什么建议吗?

以下代码:

set parametric
j1(x) = -((1.0/27.0*(1.+9.*x))/2.0)**(1./3.) #negative portion
j2(x) = (-(1.0/27.0*(1.+9.*x))/2.0)**(1./3.)
k(x) = ((-x/3.0)**(3./2.))**(1./3.)
l(x) = -((-x/3.0)**(3./2.))**(1.0/3.0)

tt(x)  = sqrt(-x/3.)


set trange [-1.0/3.0:0]
set yrange [0:1.0/3.0]
set xrange [-1./6.:1./3]
plot j1(t),tt(t) w l ls 1, j2(t),tt(t) w l ls 1,  k(t),tt(t) w l ls 2,  l(t),tt(t)  w l ls 3

1 个答案:

答案 0 :(得分:3)

问题来自于选择负数的立方根。 Gnuplot可以处理复数,在复数系统中有三个立方根,任意数量 。对于实数,其中一个是真实的,两个是复杂的。 Gnuplot正在选择第一个 ,其中一个是负数的复数(对于正数,第一个是实数)。

print (-8)**(1/3.0) # prints {1.0, 1.73205080756888}

解决方案是构建我们自己的立方根函数

cuberoot(x) = sgn(x)*abs(x)**(1/3.0)

这将选择取绝对值的立方根(始终为正)并使结果与原始符号相同。

然后我们可以在我们的函数中使用它

j1(x) = -cuberoot((1.0/27.0*(1.+9.*x))/2.0) #negative portion
j2(x) = cuberoot(-(1.0/27.0*(1.+9.*x))/2.0)

单独留下其余代码。

没有自定义Cuberoot功能

enter image description here

使用自定义Cuberoot功能

enter image description here

<小时/> 对于给定的-8示例,它们是1 + 1.7320508i,-2和1 - 1.7320508i。

按复杂参数递增顺序排列时(限制在[0,2π)区间内)。