Math gnuplot-在椭球体内绘制随机点

Math gnuplot-在椭球体内绘制随机点,math,random,geometry,gnuplot,ellipse,Math,Random,Geometry,Gnuplot,Ellipse,我想使用gnuplot在椭球体的边界内创建并绘制一组随机点。是否可以直接在gnuplot中执行此操作,或者需要在外部程序中生成随机数据点 最终,我想制作一个类似于此的椭球图形 关于和的使用有一些示例,但我不确定如何在椭球体的边界内生成随机点。在您展示的参数化绘图示例中,我没有找到重用rand(0)的方法,但是通过对命令行工具的内部调用,您可以通过一些修改来实现: unset key a=3 b=2 set xrange [-a:a] set yrange [-b:b] set style fu

我想使用gnuplot在椭球体的边界内创建并绘制一组随机点。是否可以直接在gnuplot中执行此操作,或者需要在外部程序中生成随机数据点

最终,我想制作一个类似于此的椭球图形


关于和的使用有一些示例,但我不确定如何在椭球体的边界内生成随机点。

在您展示的参数化绘图示例中,我没有找到重用
rand(0)
的方法,但是通过对命令行工具的内部调用,您可以通过一些修改来实现:

unset key
a=3
b=2

set xrange [-a:a]
set yrange [-b:b]
set style function dots
plot "<seq 1000 | awk '{print rand(), rand()}'" using (a*(2*$1-1)):(b*(sqrt(1-((2*$1-1))**2))*(2*$2-1))
unset键
a=3
b=2
设置xrange[-a:a]
设置Y范围[-b:b]
设置样式功能点

情节“根据@Bernhard的回答,这里是仅使用gnuplot的方法。要重用随机数,可以使用
语句将两个
rand
调用和变量赋值放在
的第一个参数中,用逗号分隔。
using
语句从左到右求值,因此您可以使用
参数访问以下所有
中的变量

要演示这一点,请参见以下示例:

set samples 1000
plot '+' using (x=rand(0), y=rand(0), x):(y)
将其应用于椭球体,将生成脚本:

a=3
b=2
phi=30*pi/180

max(x,y) = (x > y ? x : y)
set xrange[-max(a,b):max(a,b)]
set yrange[-max(a,b):max(a,b)]

set offset 0.1,0.1,0.1,0.1
set samples 2000

ex(x, y) = a*(2*x-1)
ey(x, y) = b*(sqrt(1-((2*x-1))**2))*(2*y-1)

unset key    
plot '+' using (x=rand(0), y=rand(0), ex(x,y)*cos(phi)-ey(x,y)*sin(phi)):\
               (ey(x,y)*cos(phi)+ex(x,y)*sin(phi)) pt 7 ps 0.5
结果是:

然而,这导致了点的明显不均匀分布(参见椭圆末端的聚集,参见@andyras的评论)。为了避免这种情况,以下是如何过滤椭球体内均匀分布的随机点:

a=3
b=2
set angles degree
phi=30

max(x,y) = (x > y ? x : y)
set xrange[-max(a,b):max(a,b)]
set yrange[-max(a,b):max(a,b)]

set offset 0.1,0.1,0.1,0.1
set samples 2000
set size ratio 1

check(x, y) = (((x/a)**2 + (y/b)**2) <= 1)
unset key
plot '+' using (x=2*a*(rand(0)-0.5), y=2*b*(rand(0)-0.5), \
     check(x,y) ? x*cos(phi)-y*sin(phi) : 1/0):\
     (x*sin(phi)+y*cos(phi)) pt 7 ps 0.5
a=3
b=2
设定角度度
φ=30
最大值(x,y)=(x>y?x:y)
设置X范围[-max(a,b):max(a,b)]
设置Y范围[-max(a,b):max(a,b)]
设置偏移量0.1,0.1,0.1,0.1
2000年样本集
设置大小比1
勾选(x,y)=((x/a)**2+(y/b)**2)y?x:y)
最大(x,y,z)=mx(mx(x,y),mx(x,z))
设置xrange[-max(a,b,c):max(a,b,c)]
设置Y范围[-max(a,b,c):max(a,b,c)]
设置zrange[-max(a,b,c):max(a,b,c)]
设置偏移量0.1,0.1,0.1,0.1
2000年样本集
设置大小比1
设置ticslevel 0
设置视图60330

检查(x,y,z)=(((x/a)**2+(y/b)**2+(z/c)**2)哇,我不知道你可以使用
部分在
中创建变量!@Bernhard我第一次看到这一点是在中。请参见我的答案,对于一些人,好吧,让我们称之为“用例”)。@Bernhard我也更喜欢使用外部工具进行预处理。但对于一些简单的情况,或者当您无法依赖可用的外部工具时,这会很好。虽然它变得非常快非常混乱。我似乎注意到椭圆末端有更多的点,我想知道这些点是否是随机分布的,因为兰德函数被用来给出笛卡尔点,然后这些点被转换成椭圆。它可能会给出一个更随机的分布来生成随机(x,y)对,然后将它们过滤到椭圆的范围内(如果这很重要的话)。@andyras很好的观点!请参阅我的最新答案。这个看起来好多了。
a=3
b=1
c=1
set angles degree
phi=30

mx(x,y) = (x > y ? x : y)
max(x,y,z) = mx(mx(x,y), mx(x,z))
set xrange[-max(a,b,c):max(a,b,c)]
set yrange[-max(a,b,c):max(a,b,c)]
set zrange[-max(a,b,c):max(a,b,c)]

set offset 0.1,0.1,0.1,0.1
set samples 2000
set size ratio 1

set ticslevel 0
set view 60, 330

check(x, y, z) = (((x/a)**2 + (y/b)**2 + (z/c)**2) <= 1)
unset key
splot '+' using (x = 2*a*(rand(0)-0.5), \
                 y = 2*b*(rand(0)-0.5), \
                 z=2*c*(rand(0)-0.5), \
                 check(x,y,z) ? x*cos(phi)-y*sin(phi) : 1/0):\
                 (x*sin(phi)+y*cos(phi)):(z) pt 7 ps 0.5