2

我正在尝试在参数模式下进行迭代,以根据函数绘制多个同心圆弧,参数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 个相同的重叠弧组成的图。我也替换replotplot并且只保留最后一个弧。

我知道“迭代不适用于参数模式下的绘图”(参考手册中的“绘图”),但这是使用do for构造。一定有办法做到这一点!如何?

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

4

3 回答 3

3

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

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)].

于 2018-02-27T18:48:45.157 回答
2

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

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

输出:

第二个例子

希望这个解决方案有效!在这篇文章的帮助下。

于 2018-02-26T18:44:47.610 回答
2

您通常可以通过将+特殊文件名与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

在此处输入图像描述

于 2018-02-26T21:48:40.740 回答