Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 使用gnuplot生成数据文件_Vector_3d_Gnuplot - Fatal编程技术网

Vector 使用gnuplot生成数据文件

Vector 使用gnuplot生成数据文件,vector,3d,gnuplot,Vector,3d,Gnuplot,我是gnuplot的新手。我正在尝试绘制三维向量场。我知道我必须创建一个数据文件,其中有六列表示x、y、z、deltax、deltay、deltaz 我想知道是否有可能定义一个函数f(x,y,z)并让gnuplot创建我想要的数据文件来绘制向量。 如果是的话,我该怎么做呢 这里有一个适用于3d曲面图的答案。我确信这也可以扩展到向量场,这是一个写函数的问题,它不在我的舒适范围之内 您可以将函数绘制到一个表中,而不是图形输出,然后使用刚刚生成的表(可以在之前进行检查、编辑等)绘制图形。样本: 屈服

我是gnuplot的新手。我正在尝试绘制三维向量场。我知道我必须创建一个数据文件,其中有六列表示x、y、z、deltax、deltay、deltaz

我想知道是否有可能定义一个函数f(x,y,z)并让gnuplot创建我想要的数据文件来绘制向量。
如果是的话,我该怎么做呢

这里有一个适用于3d曲面图的答案。我确信这也可以扩展到向量场,这是一个写函数的问题,它不在我的舒适范围之内

您可以将函数绘制到一个表中,而不是图形输出,然后使用刚刚生成的表(可以在之前进行检查、编辑等)绘制图形。样本:

屈服


样本取自Philipp K.Janert,Gnuplot的实际操作中

您可以使用特殊文件名
++
创建二维网格,您可以在其上定义向量场:

set xrange [-10:10]
set yrange [-10:10]
set samples 100
set isosamples 100

vx(x,y,z) =  ...
vy(x,y,z) = ...
vz(x,y,z) = ...
z(x,y) = ...

splot '++' using 1:2:(z($1,$2)):(vx($1,$2,z($1,$2))):(vy($1,$2,z($1,$2))):(vz($1,$2,z($1,$2))) with vectors
这将在曲面
z(x,y)
上绘制向量场
(vx,vy,vz)
。Gnuplot无法生成三维网格

您可以尝试用一个循环来模拟这样一个真实的3d向量场:

z(i) = -10 + i*(20.0/99.0)
splot for [i=1:100] '++' using 1:2:(z(i)):(vx($1,$2,z(i))):(vy($1,$2,z(i))):(vz($1,$2,z(i))) with vectors lt 1
例如,考虑以下中心力脚本:

lim = 2
N = 6

set xrange [-lim:lim]
set yrange [-lim:lim]
set zrange [-lim:lim]
set samples N
set isosamples N

sc= 0.3
r(x,y,z) = sqrt(x**2 + y**2 + z**2)
gx(x,y,z) = sc/(x**2 + y**2 + z**2) * x/r(x,y,z)
gy(x,y,z) = sc/(x**2 + y**2 + z**2) * y/r(x,y,z)
gz(x,y,z) = sc/(x**2 + y**2 + z**2) * z/r(x,y,z)

z(i) = -lim + 2*i*lim/(N - 1.0)

unset key
set xyplane 0
splot for [i=1:N] '++' using 1:2:(z(i)):(gx($1,$2,z(i))):(gy($1,$2,z(i))):(gz($1,$2,z(i))) with vectors lt 1
与输出


非常感谢!这正是我想做的。你知道在哪里或谁能帮助我定义向量场吗?如果你正在寻找的是向上投票或标记为已接受,那就太好了。对于定义向量场,也许你最好在upvote上寻求帮助:,接受:好的,我明白了,谢谢!但我不知道我正在尝试制作一个3D网格;谢谢但是,我不知道我是否正在尝试制作3D网格。我想定义一个函数f(x,y,z),它将输出一个包含六列(x,y,z,Vx,Vy,Vz)的数据文件,其中(x,y,z)表示三维输入点,(Vx,Vy,Vz)表示三维矢量坐标。我已经看到这是可能的;我所需要的只是正确的数据文件;之后,我应该能够使用“splot 1:2:3:4:5:6 with vectors”来绘制向量场。我希望你明白我的意思。(我试图编辑我的评论,但没有成功。)这里有一个链接,指向我正在尝试做的事情:。我想定义一个可以输出6列数据文件的函数;然后我应该能够相对轻松地使用“splot”。是的,我理解您想要什么,但是gnuplot不支持三维网格,您不能绘制三个变量的函数
f(x,y,z)
,而只能
f(x,y)
。对于向量场,您可以通过
for
循环获得第三维。我更新了我的答案,以展示一个中心力的3D向量场的具体示例。这就是gnuplot绘制此图的方式。如果您想首先生成一个数据文件,并用gnuplot绘制它,那么您应该使用一个外部脚本/程序(例如python)来创建这个数据文件。你真的帮了我很多忙!谢谢
lim = 2
N = 6

set xrange [-lim:lim]
set yrange [-lim:lim]
set zrange [-lim:lim]
set samples N
set isosamples N

sc= 0.3
r(x,y,z) = sqrt(x**2 + y**2 + z**2)
gx(x,y,z) = sc/(x**2 + y**2 + z**2) * x/r(x,y,z)
gy(x,y,z) = sc/(x**2 + y**2 + z**2) * y/r(x,y,z)
gz(x,y,z) = sc/(x**2 + y**2 + z**2) * z/r(x,y,z)

z(i) = -lim + 2*i*lim/(N - 1.0)

unset key
set xyplane 0
splot for [i=1:N] '++' using 1:2:(z(i)):(gx($1,$2,z(i))):(gy($1,$2,z(i))):(gz($1,$2,z(i))) with vectors lt 1