所以我试图用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
答案 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)
单独留下其余代码。
<小时/> † 对于给定的-8示例,它们是1 + 1.7320508i,-2和1 - 1.7320508i。
‡ 按复杂参数递增顺序排列时(限制在[0,2π)区间内)。