一、设计问题及原始参数 ①求解概率论相关问题 例:将A、B、C三个字母之一输入信道,输出原字母的概率为α,而输出其他字母的概率都是(1-α)/2,今将字符串AAAA、BBBB、CCCC之一输入信道,输入AAAA、BBBB、CCCC的概率分别为P1 、P2 、P3(P1 +P2 +P3=1),输入是ABCA,求输出所有情况的概率? ②求解单因素方差分析问题 例:为了寻找飞机控制板上的仪表盘的最佳布置,试实验三个方案,观察领航员在紧急情况的反应时间(以1/10秒计),随机地选择28名领航员,得他们对不同的布置方案的反应时间如下: 方案一 14 13 9 15 11 13 14 11 方案二 10 12 7 11 8 12 9 10 13 9 10 9 方案三 11 5 9 10 6 8 8 9 试在显著水平下0.05下检验各个方案是否有显著差异。 ③验证蒙提霍尔问题 蒙提霍尔问题(Monty Hall problem),也称为三门问题,是一个源自博弈论的数学游戏问题,问题的名字来自美国的电视游戏节目:Let's Make a Deal,该节目的主持人名叫蒙提·霍尔(Monty Hal1)。 这个游戏的玩法是:参赛者面前有三扇关闭的门,其中一扇门的后面藏有一辆汽车,而另外两扇门的后面则各藏有一只山羊。参赛者从三扇门中随机选取一扇,若选中后面有车的那扇门就可以赢得该汽车。当参赛者选定了一扇门,但尚未开启它的时候,节目主持人会从剩下两扇门中打开一扇藏有山羊的门,然后问参赛者要不要更换自己的选择,选取另一扇仍然关上的门。这个游戏涉及到的问题是:参赛者更换自己的选择是否会增加赢得汽车的概率? 二、设计目的: 本文主要解决三个问题:求某个事件概率的实际应用问题、单因素方差分析、蒙提霍尔问题利用MATLAB的相关知识对于问题进行编程求解,并利用概率论与数理统计的相关知识对习题进行求解分析。 三、设计内容 2.1.1 问题一的求解 问题一分析: 由问题一可知,这是一个输出根据输入的概率进行输出的结果的问题,该问题中共有三个变量A、B、C,输入的是ABCA,根据计算输出结果共有81种,需要统计输出结果的概率。可以利用蒙特卡洛法,根据其概率将区间分成3段,第一段为(0,a) ,第二段为(α,a+(1-α)/2) ,第三段为(a+(1-α)/2,1) ,利用rand函数随机生一个0-1之间的数,如果该数在第一段区间内,则原样输出,如果该数位于第二段区间,则输出其他字母,如果该数位于第三段区间,则输出另一个字母,这样就可以得到输出的结果,将这样的实验进行n次时,随机数可以认为是均匀分布的。由大数定律可知,当实验次数n增大时,频率趋近于概率。 问题一中变量有A、B、C三个变量,输出结果的排列为AAAA,BBBB,CCCC等,输出结果有81种。是否可以将排列结果用三进制数表示呢?用0,1,2表示变量A、B、C,四位三进制数可表示的个数刚好是81 ,可以利用三进制数表示输出结果。可用利用十进制将三进制的组合进行存储,此时,矩阵的数的范围是0-80。在MATLAB利用tabulate函数,统计矩阵中元素出现的频率即可。 代码:
(脚步文件:输入数据,结果的代码)
clc; clear; %设置问题中的概率 probability=0.5; %A B C对应一个三位数 data_one=0; data_two=1; data_three=2; for i=1:1000000 %Analog 是一个返回 0 或 1 或 2 的函数 %第一位相当于三进制的千位 ternary_kilobit=Analog(data_one,probability); %三进制的百分位数 ternary_Hundred=Analog(data_two,probability); %三进制十位数 ternary_ten=Analog(data_three,probability); %三进制中的单个数字 ternary_bot=Analog(data_one,probability); %将保存的三进制数转换为十进制数 Decimal_number = ternary_kilobit*27+ternary_Hundred*9+ternary_ten*3+ternary_bot; %将十进制数保存到矩阵 matrix(i) = Decimal_number; end %Tabulate (matrix(:)) 显示矩阵中数据的频率表。 % 对于矩阵中的每个唯一值,tab 函数显示数字实例的数量以及该值在矩阵中的百分比。 tabulate(matrix(:)); for i=0:80 %十进制矩阵的组成部分 Comparison_matrix_part_I(i+1)=i; end %十进制转三进制 Comparison_matrix_part_II=dec2base(Comparison_matrix_part_I,3); %dec2base 结果是一个字符类型,而Comparison_matrix_part_I需要转换为字符类型
%对照表中,前四位为三进制,后两位为十进制 comparison_matrix=[Comparison_matrix_part_II,Comparison_matrix_part_I];
(Anlog函数:设计一个模拟函数)
function result = Analog(data,probability)
%生成一个0-1的随机数
random_number = rand;
%把区间分成3个区间,(0,α),(α,α+((1-α))⁄2),(α+((1-α))⁄2,1)
if data==0
if random_number<probability
result=0;
elseif probability<mrandom number & m<probability+(1-probability)/2
result=1;
else
result=2;
end
elseif data==1
if random_number<=probability
result=data;
elseif probability<random_number & random_number<(probability+(1-probability)/2)
result=0;
else
result=2;
end
else
if 0<random_number & random_number<=probability
result=data;
elseif probability<random_number & random_number<(probability+(1-probability)/2)
result=0;
else
result=1;
end
end
2.1.2 问题一的结果分析 根据题意,输入ABCA的输出结果共有81种。 ![](https://img-blog.csdnimg.cn/49c32fc0f8e54e6a854de4a8a2845d18.png) ![](https://img-blog.csdnimg.cn/7790092df25e42909aa970f9cea6ecbc.png) ![](https://img-blog.csdnimg.cn/a1ec1f06410045b292d635418f7750d2.png) ![](https://img-blog.csdnimg.cn/085c8d794dfb4cd5a2c091b44d32e681.png) 这里Value 表示矩阵中出现的元素,Count表示元素在矩阵出现的个数,Percent表示出现的频率。 ![](https://img-blog.csdnimg.cn/ebb54a5cbd3446fda99b413ea793e8b7.png) comparison_table表示的是对照表,用于查询进制数的转换关系。前四位表示三进制数,最后两位是十进制数。 2.2.1问题二的求解 问题二分析: 问题二是一个单因素方差问题,关键是构造一个F分布,Fs-1,n-s ,由预设显著水平判断F是否落入拒绝域中。若F在拒绝域则有显著差异。 第一步根据输入的数据写于一个矩阵中,由于各个分量长度的不同,首先取出各个分量的长度,写入一个矩阵中,利用矩阵统计出最大数,然后将分量扩容,是每一个分量具有相同的长度。将分量写入同一矩阵中。 第二步,计算各个量。⑴计算总体均值,需要注意的是由于矩阵是由分量扩容组成的,需要将矩阵中的0排除。首先把矩阵非0为写入另一个矩阵中,统计该矩阵非0个数,记为logical_matrix_add,然后将矩阵进行求和,除以logical_matrix_add就可以得到矩阵的均值。⑵计算总偏差平方和SST= ,历遍矩阵,如果矩阵元素不等于0,则参与计算⑶计算误差平方和SSE= ,历遍矩阵,如果矩阵元素不等于0,则参与计算(4)计算效应平方和SSA= ,历遍矩阵,如果矩阵元素不等于0,则参与计算(5)构造分式F=SSA(s-1)SSE(n-s) ,F服从F(s-1,n-s) 。 第三步,利用finv查询在水平条件下拒绝域的范围,看F分式值是否落入其中,如果落入,则认为有显著差异。
clc;
clear;
%问题中的数据输入
data_comlogical_matrixonent_one=[14 13 9 15 11 13 14 11];
data_comlogical_matrixonent_two=[10 12 7 11 8 12 9 10 13 9 10 9];
data_comlogical_matrixonent_three=[11 5 9 10 6 8 8 7];
%获取每个 comlogical_matrixonent 的列数
numCols=[size( data_comlogical_matrixonent_one,2) size( data_comlogical_matrixonent_two,2) size( data_comlogical_matrixonent_three,2)];
% 获取 comlogical_matrixonent 的最大值
numCols_max=max(numCols);
%将 comlogical_matrixonents 写入矩阵时,comlogical_matrixonent 列需要与列一样大,因此使 ulogical_matrix 不足comlogical_matrixonents 为 0
data_comlogical_matrixonent_one=[ data_comlogical_matrixonent_one, zeros(1,numCols_max-numCols(1))];
data_comlogical_matrixonent_two=[ data_comlogical_matrixonent_two, zeros(1,numCols_max-numCols(2))];
data_comlogical_matrixonent_three=[ data_comlogical_matrixonent_three, zeros(1,numCols_max-numCols(3))];
%将 comlogical_matrixonents 写入矩阵
matrix=[ data_comlogical_matrixonent_one; data_comlogical_matrixonent_two; data_comlogical_matrixonent_three];
%freedom_one
levelCnt=size(matrix,1);
%freedom_two
observeCnt=size(matrix,2);
%logical_matrixological_matrixulation 均值
logical_matrix=(matrix>0);
logical_matrix_add=sum(sum(logical_matrix));
total_mean=(sum(sum(matrix)))/logical_matrix_add;
sum_of_Squars_Total=0;
for i=1:levelCnt
for j=1:observeCnt
%每个元素减去总均值求和
if matrix(i,j)~=0
sum_of_Squars_Total=sum_of_Squars_Total+...
(matrix(i,j)-total_mean)*(matrix(i,j)-total_mean);
end
end
end
%groulogical_matrixs 之间的平均值
groulogical_matrix_add=sum(matrix,2);
mean_between_groulogical_matrixs=[ groulogical_matrix_add(1,:)/numCols(1),...
groulogical_matrix_add(2,:)/numCols(2),groulogical_matrix_add(3,:)/numCols(3)];
Sum_of_Squares_Within=0;
for i=1:levelCnt
for j=1:observeCnt
if matrix(i,j)~=0
%S从总和中的总和中的 groulogical_matrix 减去 groulogical_matrix 均值
Sum_of_Squares_Within=Sum_of_Squares_Within+...
(matrix(i,j)-mean_between_groulogical_matrixs(i))*(matrix(i,j)-mean_between_groulogical_matrixs(i));
end
end
end
Sum_of_Squares_Between=0;
for i=1:levelCnt
for j=1:observeCnt
if matrix(i,j)~=0
Sum_of_Squares_Between=Sum_of_Squares_Between+...
(mean_between_groulogical_matrixs(i)-total_mean)*(mean_between_groulogical_matrixs(i)-total_mean);
end
end
end
%构建 F 统计量
gruological_matrixIntraDev = Sum_of_Squares_Between/(levelCnt-1);
groulogical_matrixInnerDev = Sum_of_Squares_Within/(sum(numCols)-levelCnt);
Fvalue = gruological_matrixIntraDev/groulogical_matrixInnerDev
%查询拒绝域
Deny_domains=finv(0.95,(levelCnt-1),(sum(numCols)-levelCnt))
%如果落在deny域内,则认为存在差异
if Fvalue>Deny_domains
disp('认为有显著差异')
end
2.1.2 问题二的结果分析 ![](https://img-blog.csdnimg.cn/3bb99a64e9cf4c18af2fd5ddc3812d41.png) 在该问题中,F分式值Fvalue,查询拒绝域的为Fm, Fvalue落在拒绝域中,认为有显著差异。 2.3.1问题三的求解 问题三分析: 由于游戏开始时参赛者是从三扇门中随机地选取一扇门,所以在更换选择之前,参赛者赢得汽车的概率为 1/3。经分析可知,若参赛者一开始选中汽车,则更换选择后一定选不到汽车;若参赛者一开始没有选中汽车,则更换选择后一定能选到汽车。为了求解参赛者更换选择之后赢得汽车的概率,这里引人两个随机事件:A=“一开始选中汽车”,B-“更换选择后选中汽车”。根据全概率公式可求得参赛者更换选择之后赢得汽车的概率为PB=PAPBA+PAPBA=13×0+23×1=23 。 通过蒙特卡洛方法求解参赛者更换选择之后赢得汽车的概率。为表述方便,设两只羊的编号分别为“1”和“2”,汽车的编号为“3”。现在从数字 123 中随机选取一个数字,若一开始选中1或2,则更换选择后选中 3,即赢得汽车;若一开始选中 3,则更换选择后选中1或2,即得不到汽车。将这样的试验重复进行n次记录一开始选中1或2 的次数success(即更换选择后赢得汽车的次数),从而可以确定更换选择后赢得汽车的频率 success/n。由大数定律可知当试验次数 n 增大时,频率success/n趋近于更换选择后赢得汽车的概率。
代码:
clc
clear
%先定义成功次数初始化为0, ...成功表示选择结果是车
success=0;
% total 表示蒙特卡洛模拟重复次数
total = 1000000;
for i= 1 : total
% 设置门号3为车,1、2为羊
% 在1-3之间随机生成一个门来表示你的选择
random_numbers = randi([1,3]);
%
当随机数为3时,羊被排除,
...而且羊也换了之后换了,结果不成功
%
当随机数为1或2时,排除一只羊,
...那么剩下的就是车了,更换之后,结果成功
if random_numbers==1 || random_numbers==2
success=success+1;
end
end
%num2str 将数字类型改为字符类型,
...和 success/total 表示成功的频率
disp(['蒙特卡罗方法得到的改变主意时的获奖概率为:', num2str(success/total)]);
%变量被清除,实验没有改变主意
success=0;
for i=1:total
random_numbers = randi([1,3]);
% 当随机数为3时,羊被排除,
...选择不变,结果成功
% 当随机数为1或2时,排除一只羊,剩下的就是车,
...但选择没有改变,结果是失败
if random_numbers==3
success=success+1;
end
end
%num2str 将数字类型改为字符类型,
...和 success/total 表示成功的频率
disp(['蒙特卡罗方法得到的不改变主意时的获奖概率为:', num2str(success/total)]);
2.3.2 问题三的结果分析 ![](https://img-blog.csdnimg.cn/10b4519ac8494b0083b06c3f781f7183.png) 经过模拟计算,验证更改选择后赢得汽车的概率为2/3,而不更改选择赢得汽车的概率1/3。 |