我想编写一个程序来计算Bertrand paradox中的统计数据。
在我的方式中,我想在圆圈中选择两个点,并使用它们传递线(两个点),这是我的和弦。然后我想计算这些和弦中有多少长于sqrt(3);但是当我运行这个脚本时,一些和弦大于2! (我的圆的半径是1) 我不知道它有什么问题,有人可以帮助我吗?
请参阅this链接,了解所使用的公式。
r1 = rand(1,1000000);
teta1 = 2*pi * rand(1,1000000);
x1 = r1 .* (cos(teta1));
y1 = r1 .* (sin(teta1));
r2 = rand(1,1000000);
teta2 = 2*pi * rand(1,1000000);
x2 = r2 .* (cos(teta2));
y2 = r2 .* (sin(teta2));
%solve this equation : solve('(t*x2 +(1-t)*x1)^2 +(t*y2 +(1-t)*y1)^2 =1', 't');
t1= ((- x1.^2.*y2.^2 + x1.^2 + 2*x1.*x2.*y1.*y2 - 2*x1.*x2 - x2.^2.*y1.^2 + x2.^2 + y1.^2 - 2*y1.*y2 + y2.^2).^(1/2) - x1.*x2 - y1.*y2 + x1.^2 + y1.^2)/(x1.^2 - 2*x1.*x2 + x2.^2 + y1.^2 - 2*y1.*y2 + y2.^2);
t2= -((- x1.^2.*y2.^2 + x1.^2 + 2*x1.*x2.*y1.*y2 - 2*x1.*x2 - x2.^2.*y1.^2 + x2.^2 + y1.^2 - 2*y1.*y2 + y2.^2).^(1/2) + x1.*x2 + y1.*y2 - x1.^2 - y1.^2)/(x1.^2 - 2*x1.*x2 + x2.^2 + y1.^2 - 2*y1.*y2 + y2.^2);
length = abs (t1-t2) * sqrt (( x2-x1).^2 + (y2-y1).^2);
hist(length)
flag = 0;
for check = length
if( check > sqrt(3) )
flag = flag + 1;
end
end
prob = (flag/1000000)^2;
答案 0 :(得分:0)
length
的公式可能应归咎于无意义的结果,并且考虑到其长度,更换它比调试更容易。这是找到通过两个点(x1,y1)和(x2,y2)的和弦长度的另一种方法:
在Matlab代码中,这是由
完成的distance = abs(x1.*y2-x2.*y1)./sqrt((x2-x1).^2+(y2-y1).^2);
length = 2*sqrt(1-distance.^2);
距离公式涉及abs(x1.*y2-x2.*y1)
,它是具有顶点(0,0),(x1,y1)和(x2,y2)的三角形面积的两倍。将此数量除以三角形的基数sqrt((x2-x1).^2+(y2-y1).^2)
,得出它的高度。
此外,将1000000个样本放入10个箱子中是浪费信息:您可以获得所有这些努力的粗略直方图。最好使用hist(length,100)
。
最后,选择通过一行的两个点的方法不会从磁盘上的均匀分布中获取它们。如果要通过磁盘进行统一分发,请使用
r1 = sqrt(rand(1,1000000));
r2 = sqrt(rand(1,1000000));
因为对于均匀分布的点,到中心的距离的平方均匀分布在[0,1]中。
最后,我不知道你为什么选择prob = (flag/1000000)^2
。
以下是您进行上述修改的代码。
r1 = sqrt(rand(1,1000000));
teta1 = 2*pi * rand(1,1000000);
x1 = r1 .* (cos(teta1));
y1 = r1 .* (sin(teta1));
r2 = sqrt(rand(1,1000000));
teta2 = 2*pi * rand(1,1000000);
x2 = r2 .* (cos(teta2));
y2 = r2 .* (sin(teta2));
distance = abs(x1.*y2-x2.*y1)./sqrt((x2-x1).^2+(y2-y1).^2);
length = 2*sqrt(1-distance.^2);
hist(length,100)
flag = 0;
for check = length
if( check > sqrt(3) )
flag = flag + 1;
end
end
prob = flag/1000000;