根据函数进行 t 测距的迭代和参数模式 - gnuplot

iteration and parametric mode with t ranging according to a function - gnuplot

我正在尝试在参数模式下进行迭代,以根据函数绘制多个同心圆弧,参数 t 范围不同。我试过,除其他外,

a=sqrt(2)
plot [-pi/2:pi/2] a*cos(t), a*sin(t)
do for [i=2:10] {
  a=sqrt(2)/i
  set trange [-1./2*acos(-(a**2)/2.):1./2*acos(-(a**2)/2.)]
  replot a*cos(t), a*sin(t)
}

我看到的是由 10 个相同的重叠弧线组成的图。我还将 replot 替换为 plot 并且只保留了最后一个弧线。

我知道 "that iteration does not work for plots in parametric mode"(参考手册中的 "plot for"),但这是使用 do for 结构。必须有办法做到这一点!怎么样?

系统:gnuplot 版本 5.2 补丁级别 2,windows10。

您可以在 plot 语句中使用 for 循环。试试这个:

set term png
set out "tmp.png"

unset key
set parametric

plot for [i=2:10]  (sqrt(2)/i)*cos(t), (sqrt(2)/i)*sin(t)

exit

输出:

更新:上面的解决方案不会处理问题的 trange 要求。为此,一个可能的解决方案是创建一系列具有适当范围的表格,然后循环遍历为绘图创建的文件。类似于以下内容:

set term png
set out "tmp.png"

unset key
set parametric

do for [i=2:10] {
  a=sqrt(2)/i
  set trange [-1./2*acos(-(a**2)/2.):1./2*acos(-(a**2)/2.)]
  set table 'data'.i.'.txt'
    plot a*cos(t), a*sin(t)
  unset table
}

plot for [i=2:10] 'data'.i.'.txt' w l

exit

输出:

希望这个解决方案有效!在 this post 的帮助下。

您通常可以通过将 + 特殊文件名与 using 语句结合使用来避免参数化模式:

plot for  [i=2:10] [t=-1./2*acos(-((sqrt(2)/i)**2)/2.):1./2*acos(-((sqrt(2)/i)**2)/2.)] '+' using (sqrt(2)/i)*cos(t):(sqrt(2)/i)*sin(t) notitle with lines

今天我开发了自己的解决方案,就是

a(i)=sqrt(2)/30*(31-i)
s(t, i)=t*(1./2*acos(-(a(i)**2)/2.))/(pi/2)
set trange [-pi/2:pi/2]
plot [-pi/2:pi/2] for [j=1:30] a(j)*cos(s(t,j)), a(j)*sin(s(t,j)) lw 2

请注意,与此同时我做了一些数学调整,从 a=sqrt(2)/ia(i)=sqrt(2)/30*(31-i)

输出:

用于输出该图片的设置是

set term wxt size 800,800
set grid
set size ratio -1
set parametric
set xrange [-1.6:1.6]
set yrange [-1.6:1.6]

这背后的基本原理是,通过这种方式,我只设置了一次 trange,然后通过变量替换,我将 [0:pi/2] 映射到 [0:s(pi/2,i)]