新冠感染池检测选取最优池检测人数(概率模型理论公式+蒙特卡洛matlab仿真)

数学建模 同时被 2 个专栏收录
3 篇文章 0 订阅
25 篇文章 2 订阅

问题如下:
在这里插入图片描述
典型离散概率模型,每组池检测中,感染人数服从二项分布。
计算每一组测试的时间,求数学期望即可。
matlab代码如下:

%蒙特卡洛仿真新冠感染池检测选取最优池检测人数
%仿真时长约十几秒
N=100000;%仿真总人数
% N=30000;%仿真总人数
T_single=10;%单独检测时间
T_all=40;%群体检测时间
P_infect=0.005;%感染率
% P_infect=1/30;%感染率
N_infect=N*P_infect;%感染人数,需要是个整数
T0=N*T_single;%单独检测总时间
x=sparse(zeros(N,1));%模拟每个人,感染为1,没感染为0,用稀疏矩阵储存

for i=1:N_infect
   while(1)%循环,随机让一个人感染
       index=randi(N);%产生一个随机数
       if x(index)==1%该人已感染,换一个
           continue;
       end
       break;
   end
   x(index)=1;%感染
end


all_count=1:1000;%一次混合检测样本数量
T=[];
for j=1:size(all_count,2)%对每一个混合检测样本研究一下
    i=1;
    T(j)=0;%初始化时间
    while(1)
        iend=i+all_count(j)-1;%一段区间的最后
        if iend>N%超出总人数了
            iend=N;
        end
        infectnum=sum(x(i:iend));%池检测一次感染人数
        T(j)=T(j)+T_all;%加上一次群体检测时间
        if infectnum>0%有一人感染
            T(j)=T(j)+T_single*(iend-i+1);%如果有人感染,需要对组内全部做单独检测
        end
        if iend==N%检测完了,结束
            break;
        end
        i=i+all_count(j);%区间向后
    end
end

F_T_theory=@(n) (T_all.*(1-P_infect).^n+(T_single*n+T_all).*(1-(1-P_infect).^n))./n;%理论计算公式
T_theory=N.*F_T_theory(all_count);%计算理论时间

plot(all_count,T,'linewidth',2);
hold on
plot(all_count,ones(size(all_count,2),1).*T0,'--','linewidth',2);
plot(all_count,T_theory,'--','linewidth',2);
xlabel("单次池检测人数/个")
ylabel("检测总时间/分钟")
legend("池检测","单独检测","池检测理论时间")
grid on
mincount=all_count(T==min(T))
mincount_theory=all_count(T_theory==min(T_theory))
title(sprintf("理论最优单次池检测人数%d,仿真人数%d,感染率%.4f",mincount_theory,N,P_infect))

结果:第一问理论一次30人,第二问可以用池检测,理论一次14人。
第一问运行结果图如下:
在这里插入图片描述
第二问运行结果图如下:
在这里插入图片描述

温馨提示:蒙特卡洛算法具有随机性,每次仿真的结果可能不一样。

  • 6
    点赞
  • 0
    评论
  • 16
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值