Bertrand悖论中弦的长度分布

时间:2015-01-30 11:17:16

标签: matlab statistics geometry

我想编写一个程序来计算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; 

1 个答案:

答案 0 :(得分:0)

length的公式可能应归咎于无意义的结果,并且考虑到其长度,更换它比调试更容易。这是找到通过两个点(x1,y1)和(x2,y2)的和弦长度的另一种方法:

  1. 找到和弦距离中心的距离
  2. 使用毕达哥拉斯定理找到它的长度
  3. 在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;