根据函数进行 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)/i
到 a(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)]
。
我正在尝试在参数模式下进行迭代,以根据函数绘制多个同心圆弧,参数 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)/i
到 a(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)]
。