Gnuplot不绘制x**(1/3)的负值

这是 x^(1/3) 的正确图形:

但是,当尝试x**(1./3)在 gnuplot 上绘图时,这就是我得到的:

我怎样才能解决这个问题?

此外,这不是 gnuplot 第一次不在其他函数中绘制零附近的值(当然,当它应该这样做时:我不是在谈论渐近线等)。我能做什么?

回答

您的图形没有绘制接近零的原因是因为默认采样为 100,即您的函数将在您的 xrange 内绘制 100 个点。如果你增加这个数字,这会让你更接近于零。检查help samples

关于缺失的负值,这在 gnuplot 中似乎有点特殊。我猜浮点数x**b在哪里b比较特殊。您可以测试示例:

print sqrt(4)
print 4**0.5
print sqrt(-4)
print (-4)**0.5
print 8**(1./3)
print (-8)**(1./3)

这将给出:

2.0
2.0
{0.0, 2.0}
{1.22460635382238e-16, 2.0}   # rounding error {0.0, 2.0}
2.0
{1.0, 1.73205080756888}       # 1 out of 3 valid solutions, but not the expected -2

中的值{Re, Im}是虚数。首先是实部,然后是虚部。尽管如此,为了获得您的情节,您可以尝试以下操作:

代码:

### cube root
reset session

set samples 500
set grid xtics, ytics

cuberoot(x) = sgn(x)*abs(x)**(1./3)

plot cuberoot(x) w l
### end of code

结果:

添加:

我会尽力解释,但我不是数学家。对于第 N 个根,有 N 个解。显然,gnuplot 需要其中之一。显然,一个具有正实部,如果有多个,则具有最小正虚部的一个。我猜它被称为“主根”。也检查这个。

所以,这将解释为什么

print (-8)**(1./3)
print (-8)**(1./9)  # 9th root

将返回

{1.0, 1.73205}          # and not -2
{1.18393, 0.4309183}    # and not -1.25992

代码:

### roots
reset session

set size ratio -1
set xlabel "real part"
set xrange [-3:3]
set ylabel "imaginary part"
set yrange [-3:3]
set grid xtics, ytics

set angle degrees
NRootRe(x,N,i) = -sgn(x)*abs(x)**(1./N)*cos(360.*i/N - 180*sgn(x))
NRootIm(x,N,i) = -sgn(x)*abs(x)**(1./N)*sin(360.*i/N - 180*sgn(x))

x = -8
do for [N=3:9:2] {
    do for [i=1:N] {
        print sprintf('x=%g, N=%g, i=%g: {% 9g, % 9g}',x,N,i,NRootRe(x,N,i), NRootIm(x,N,i))
    }
    print ""
}

plot for [N=3:9:2] [i=1:N:1] '+' u (0):(0):(NRootRe(x,N,i)):(NRootIm(x,N,i)) w vec ti sprintf("x=%g, N=%g",x,N)
### end of code

结果:

x=-8, N=3, i=1: {        1,  -1.73205}
x=-8, N=3, i=2: {        1,   1.73205}
x=-8, N=3, i=3: {       -2,  7.34764e-16}

x=-8, N=5, i=1: {-0.468382,  -1.44153}
x=-8, N=5, i=2: {  1.22624, -0.890916}
x=-8, N=5, i=3: {  1.22624,  0.890916}
x=-8, N=5, i=4: {-0.468382,   1.44153}
x=-8, N=5, i=5: { -1.51572,  5.56847e-16}

x=-8, N=7, i=1: {-0.839155,  -1.05227}
x=-8, N=7, i=2: { 0.299491,  -1.31216}
x=-8, N=7, i=3: {  1.21261, -0.583964}
x=-8, N=7, i=4: {  1.21261,  0.583964}
x=-8, N=7, i=5: { 0.299491,   1.31216}
x=-8, N=7, i=6: {-0.839155,   1.05227}
x=-8, N=7, i=7: {  -1.3459,  4.94459e-16}

x=-8, N=9, i=1: {-0.965156, -0.809862}
x=-8, N=9, i=2: {-0.218783,  -1.24078}
x=-8, N=9, i=3: { 0.629961,  -1.09112}
x=-8, N=9, i=4: {  1.18394, -0.430918}
x=-8, N=9, i=5: {  1.18394,  0.430918}
x=-8, N=9, i=6: { 0.629961,   1.09112}
x=-8, N=9, i=7: {-0.218783,   1.24078}
x=-8, N=9, i=8: {-0.965156,  0.809862}
x=-8, N=9, i=9: { -1.25992,  4.62872e-16}


以上是Gnuplot不绘制x**(1/3)的负值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>