Gnuplot 没有绘制 x**(1/3) 的负值
Gnuplot not plotting negative values of x**(1/3)
这是 x^(1/3) 的正确图形:
然而,当尝试在 gnuplot 上绘制 x**(1./3)
时,我得到的是:
我该如何解决这个问题?
此外,这不是 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 采用了其中之一。显然,一个具有正实部,如果有多个,则具有最小的正虚部。我猜它被称为“主根”。还要检查 this.
所以,这将解释为什么
print (-8)**(1./3)
print (-8)**(1./9) # 9th root
将return
{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}
当 x < 0 时,x 的立方根是复数值的曲面。 Gnuplot 不能轻易地绘制它。你展示的情节大概是为了
f(x) = sgn(x) * abs(x)**(1./3)
这是该复曲面与平面 Imag(z) = 0 的交点。
(编辑:见补充数字)。
另一种具有直观意义的绘图是将 x 绘制为 y 的立方体。
plot [t=-2:2] (t**3):(t) with lines
补充数字
图 1) 第一张图显示了为什么 'simple' 根位于负实轴上是不可取的,因为它沿着虚部的不连续点运行复曲面。
set title "Discontinuous imaginary component along negative real axis"
set yrange [-.1:.1]
set xrange [-10:10]
set xlabel "Real"
set ylabel "Imaginary"
set xyplane 0
set grid x y z vertical
f(x,y) = (x + I*y) ** (1./3)
splot real(f(x,y)), imag(f(x,y)), abs(f(x,y)), \
[-10:10] '+' using (x):(0):(sgn(x)*abs(x)**(1./3)) with lines lt -1 lw 2 title "cuberoot(x)"
图2该图显示了方程(Z)**(1/3)
解的复曲面。对于每个 Z 常数平面,解位于三个曲线上。我沿着 Z 堆叠为连续样本生成的曲线以生成表面。粗黑线是 'simple' cuberoot(Z) 限制为实际值,即与图 1 中相同的线并在原始问题中请求。绿线是 gnuplot 为 Z**(1./3)
编辑的复数值 return。对于正 Z,两条曲线相同。对于负 Z,它们位于复杂曲面的不同区域。我已经确认 gnuplot 的复数幂函数和 C 库函数 cpow 都是来自同一表面区域的 return 值。
Gnuplot
不为负数(在实数世界中)绘制或计算 x**(1/3.)
的原因是因为它将幂函数视为对数函数:x^n = exp(ln(x^n)) = exp(nln(x))
,其中ln(x)
是自然对数。请注意 x^n = exp(n ln(x))
在 x > 0
中有其域。
当然,我们可以使用复数为 x<0
计算 ln(x)
(正如我们在计算 (-8)^(1/3.)
时看到的那样)
这是 x^(1/3) 的正确图形:
然而,当尝试在 gnuplot 上绘制 x**(1./3)
时,我得到的是:
我该如何解决这个问题?
此外,这不是 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 采用了其中之一。显然,一个具有正实部,如果有多个,则具有最小的正虚部。我猜它被称为“主根”。还要检查 this.
所以,这将解释为什么
print (-8)**(1./3)
print (-8)**(1./9) # 9th root
将return
{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}
当 x < 0 时,x 的立方根是复数值的曲面。 Gnuplot 不能轻易地绘制它。你展示的情节大概是为了
f(x) = sgn(x) * abs(x)**(1./3)
这是该复曲面与平面 Imag(z) = 0 的交点。 (编辑:见补充数字)。
另一种具有直观意义的绘图是将 x 绘制为 y 的立方体。
plot [t=-2:2] (t**3):(t) with lines
补充数字
图 1) 第一张图显示了为什么 'simple' 根位于负实轴上是不可取的,因为它沿着虚部的不连续点运行复曲面。
set title "Discontinuous imaginary component along negative real axis"
set yrange [-.1:.1]
set xrange [-10:10]
set xlabel "Real"
set ylabel "Imaginary"
set xyplane 0
set grid x y z vertical
f(x,y) = (x + I*y) ** (1./3)
splot real(f(x,y)), imag(f(x,y)), abs(f(x,y)), \
[-10:10] '+' using (x):(0):(sgn(x)*abs(x)**(1./3)) with lines lt -1 lw 2 title "cuberoot(x)"
图2该图显示了方程(Z)**(1/3)
解的复曲面。对于每个 Z 常数平面,解位于三个曲线上。我沿着 Z 堆叠为连续样本生成的曲线以生成表面。粗黑线是 'simple' cuberoot(Z) 限制为实际值,即与图 1 中相同的线并在原始问题中请求。绿线是 gnuplot 为 Z**(1./3)
编辑的复数值 return。对于正 Z,两条曲线相同。对于负 Z,它们位于复杂曲面的不同区域。我已经确认 gnuplot 的复数幂函数和 C 库函数 cpow 都是来自同一表面区域的 return 值。
Gnuplot
不为负数(在实数世界中)绘制或计算 x**(1/3.)
的原因是因为它将幂函数视为对数函数:x^n = exp(ln(x^n)) = exp(nln(x))
,其中ln(x)
是自然对数。请注意 x^n = exp(n ln(x))
在 x > 0
中有其域。
当然,我们可以使用复数为 x<0
计算 ln(x)
(正如我们在计算 (-8)^(1/3.)
时看到的那样)