三维空间分布函数绘制实例

80876c12b3e80a7217d8bf7a71de2c40.png52b054442aff700fdbf523c8b44a61e7.png

这是过冷水之前在重要性抽样方法实例分享中的图片。这张图片的实际含义是以坐标原点为参考点,距离原点距离x处的小球个数f(x)分布图。这个问题理解起来好容易,就是统计距离和小球个数的关系,but!实际问题是过冷水要处理这样的问题:

9395dfd29c61d768c9ad9f2862147224.png

请告诉我随意找一个小球为原点,距离其x处的小球个数怎么求?随意找一个小球为原点。距离x处的小球平均个数怎么求?这样的问题在物理中会经常出现,过冷水就带领大家将复杂问题简单化,1:首先要读取图片,将图片上的圆数据化。2:以半径r进行搜索圆的个数,将整个图片上的圆按照r距离划分到不同距离区间中(dr=r/N);3:小球之间统计距离,划分到对应区间中。

代码如下

clc;
clear
image = imread('D:\桌面\小球分布.png');
[height,width,channel] = size(image);%确定输入突变的长宽
rc = sqrt(width^2+height^2)/2; %搜索圆的最大半径
n=60;  %划分区间个数
dr = rc/n;%确定半径区间
%检测输入图片上的圆
gray = rgb2gray(image);  %灰度化
bw = imbinarize(gray);   %二值化
bw_inverse = imcomplement(bw); %二值图像反转,即0变1,1变0
[centers,radius] = imfindcircles(bw_inverse,[5,20]); %检测图像上半径在5~20之间的圆,也可以是其它,看实际情况需要
particle_num = length(radius(:)); %统计圆的个数
%计算每个单位圆内的原子个数
[row,col] = size(centers);
num = round(rc/dr);
gr=zeros(num,1);%任意一个粒子为中心,不同半径梯度下的原子个数
for i=1:(row-1)
    for j = i+1:row
        distance = sqrt((centers(i,1)-centers(j,1))^2 + (centers(i,2)-centers(j,2))^2);%计算每两个原子间的距离
        if distance <= rc%计算
            lane = round(distance/dr);%将粒子划分不同梯度内
            gr(lane) = gr(lane)+1;%做个数累计
        end
    end
End
r=nonzeros(linspace(0,sqrt(width^2+height^2),row+1))'

    计算得到的r~g(r)就是我们想要的距离和小球个数的统计结果画图可得:

884fb232b03962ac0bb0a77320e49c58.png

    这幅图看上去比较怪,不太容易看出来规律,这只是第一问的结果,小球个数是以每个小球为中心,累计统计叠加出来的总的结果,那么请问以一个小球问中心其余小球分布到底应该怎么算?这就需要求平均了,怎么说呢?过冷在思考这个问题的时候为了形象理解,抽象出了这么一个问题:

f54cb7fd37cdb83b5d0caed6fd5b0802.png

2.2个小孩看起来像个笑话。但这就是数学,不知读者能否理解这个2.2。如果这个回答不对,那么准确的回答应该怎么说?在该问题的基础上,过冷水又构思了这么一个问题:

0708dccdc7f046fdd4f417da07df6b06.png

读者只有理解了上述问题才能理解过冷水接下来的操作,在求得的总f(r)基础上除以n(小球个数)

44ac94be2f9586f3103bacf9507959b7.png

这样我们就得到任意一个小球为圆心距离r处圆内的小球的个数了。在统计中我们更关心的是概率,在r处的找到小球的概率,而不是r处圆内的小球个数。(半径梯度对应的是圆环面积)

bfc13f4503c2f7072d2122a56a3b4cfb.png

程序处理为:

[row,col] = size(gr);
percent = zeros(row,1);
for i=1:col
    temp = gr(1,i);%不同半径下的单位原内的原子个数
    temp = temp / particle_num;
    percent(1,i)= temp / (pi*((i*dr)^2-((i-1)*dr)^2));%某一个半径梯度下的局部密度
end
figure1 = figure;
axes1 = axes('Parent',figure1,'Position',[0.131090512540894 0.11 0.775 0.815]);
hold(axes1,'on');
plot(r,percent,'MarkerFaceColor',[0 0.447058826684952 0.74117648601532],'MarkerSize',10,'Marker','o','LineWidth',1,'LineStyle','--');
ylabel('\rho');
xlabel('r');
box(axes1,'on');
hold(axes1,'off');
set(axes1,'FontSize',14,'LineWidth',3);

f8e1699ced10aef1655b778e06897dbd.png

显然图像规律出来了,这就是过冷水想要的结果。该图像对懂的人来说是很重要的,在追踪物体运动规律的时候都是用分布函数,甚至可以根据分析道路上车流量变换分布情况进行商业交通改进。而对于过冷水,实际过冷水做的是统计三维立体空间的物体之间的分布情况。画的是这样的图像:

2dd32a12fee6c7a63bc23af5645b18be.png

1748f0dc78a250cae2b6adc40fc29fdd.png

    该图像对于需要的人是很重要的,过冷水花费了大量时间才攻克该技术,有需要的可以查看独家定制源程序,谢谢大家对我工作的支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值