以下题目是来自微信公众号数学建模清风老师的题目
以下是个人结合在微信公众号上学到的知识去做的,如有不正确或不足之处,欢迎指正!
Q6.最近短视频上有一个有趣的街头抽奖游戏,规则如下:摆摊的店家准备了24个大小相同的玻璃球,其中红黄蓝各8个,装进一个袋子里,在看不见的情况下,玩家从袋子中抓出12个球,然后计算每种颜色球的个数,颜色多的球放在前面。比如5个红色4个蓝色3个黄色,这样就属于543。玩家抓出的12个球的颜色分布情况一定在下表所示的13种情况中。假设参与这个游戏是免费的,如果抽中了相应的情况,店家需要向玩家支付表中第二行所对应的金额。注意,除了543这一种情况玩家要赔给店家30元外,其余的12种情况玩家都是赚钱的,如果你运气好抓到了840这种情况(例如抽出了8个蓝球4个红球),你可以赚300元。请用MATLAB模拟这个游戏并多次运行你的代码,如果你作为玩家参与多次你是赚了还是亏了?你能从理论上解释原因吗?
情况 | 840 | 831 | 822 | 750 | 741 | 732 | 660 |
---|---|---|---|---|---|---|---|
金额 | 300 | 200 | 200 | 80 | 60 | 15 | 15 |
情况 | 751 | 642 | 633 | 552 | 543 | 444 | |
金额 | 10 | 5 | 5 | 5 | -30 | 5 |
解:我就不详细说了,代码也比较简单,后面有注释。经过多次实验,结果基本上都是543,所以玩家参与多次是亏了的。俺有幸抽到一次831。嘿嘿,有没有人从理论解释,知道的话告诉我一下。
%1~8;9~16,;17~24;
clear,clc
A=randperm(24,12); %24个随机抽12个
%颜色划分,即1~8为红,9~16为黄,17~24为蓝
for i=1:length(A)
if A(i)<9
A1(i)=A(i); %对应颜色为红的数字矩阵
elseif A(i)<17&A(i)>8
A2(i)=A(i); %对应颜色为黄的数字矩阵
else
A3(i)=A(i); %对应颜色为蓝的数字矩阵
end
end
n1=find(A1>0); %这里索引的是矩阵大于0的位置
n2=find(A2>0);
n3=find(A3>0);
%各颜色的个数总和,即大于0的位置有多少个
N1=length(n1);
N2=length(n2);
N3=length(n3);
X=horzcat(N1,N2,N3); %矩阵拼接
sort(X,'descend') %降序
Q7.层次分析法是数学建模中一个常用的模型,它主要用于解决评价类问题,也可以为评价体系中的指标确定权重。
Q8.在上一小题的基础上,请写出一段代码能够随机生成一个n阶(例如n=5)的判断矩阵,该判断矩阵要满足上一问中的三个特点。
提示:(1)判断矩阵的主对角线元素一定是1,为什么?(2)本章3.5节中我们学会了如何生成一个随机的对称矩阵,一个n阶的对称矩阵中我们只需要生成n*(n-1)/2个随机数,那么本题中这个n阶的判断矩阵中我们要生成多少个随机数?
现在给你一个矩阵A,请判断A是否符合层次分析法中判断矩阵的三个特点。
(7)
解:前面两个特点就不用说了,主要是特点3,对任意的
i
,
j
=
1
,
2
,
.
.
.
,
n
,
i,j=1,2,...,n,
i,j=1,2,...,n,均有
a
i
j
×
a
j
i
a_{ij} \times a_{ji}
aij×aji=1,我们可以换个角度去看,既然对每个
i
,
j
i,j
i,j,都有
a
i
j
×
a
j
i
a_{ij} \times a_{ji}
aij×aji=1,则这个矩阵有
A
.
∗
A
′
A.*A'
A.∗A′必须是一个全为1的矩阵,所以我们只要判断
A
.
∗
A
′
A.*A'
A.∗A′这个矩阵里的所以元素都是1即可。
function Tt=T(A)
[m,n]=size(A);
k=sum(A.*A');
for i=1:m
for j=1:n
if m~=n %判断特点1
disp('输入的矩阵不是方阵,不满足特点1')
break
elseif A(i,j)>9|A(i,j)<1/10 %判断特点2
disp('不满足特点2')
break
elseif sum(k)==m^2 %判断特点3
disp('输入的矩阵是符合所有特点的')
else
disp('输入的矩阵不满足特点3')
end
end
end
大家可以在命令窗口执行以下矩阵:
clear,clc
A=[1 2 3;4 5 6;7 8 9];
B=[1 2 11;1/12 6 5;4 7 8];
C=[1 2 3;1/2 1 2;1/3 1/2 1];
T(A)
T(B)
T(C)
(8)
解:这个和第7题类似,可以参考本章3.5节
但是不同的是:处于对称位置的元素是倒数,至于为什么对角线必须全为1,是因为对任意的
i
,
j
=
1
,
2
,
.
.
.
,
n
,
i,j=1,2,...,n,
i,j=1,2,...,n,均有
a
i
j
×
a
j
i
a_{ij} \times a_{ji}
aij×aji=1。以下代码有一个细节,就是C、H、G这里是为了使G不出现
n
a
n
nan
nan或
i
n
f
inf
inf ,即分母有效(不能为0)。代码中先取去上三角或下三角都可以,即triu与tril是可以互换的。
clear,clc
n=5;
num=n*(n-1)/2;
A=zeros(n);
A(triu(true(n),1))=randi([1,9],num,1);
B=A';
C=triu(ones(n)); %上三角全为1
H=B+C;
G=1./H; %取倒数
K=tril(G,-1); %下三角元素
W=A+K+diag(diag(ones(n)))
W.*W' %验证是否全为1矩阵
W =
1.0000 4.0000 7.0000 9.0000 7.0000
0.2500 1.0000 4.0000 5.0000 9.0000
0.1429 0.2500 1.0000 4.0000 4.0000
0.1111 0.2000 0.2500 1.0000 9.0000
0.1429 0.1111 0.2500 0.1111 1.0000
ans =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
这说明是满足要求的。也可以把矩阵w代入(7)中去验证。
Q9.生成100个随机的点,这些点都位于单位圆内:。注意,要求MATLAB输出的x和y都是长度为100的向量,分别表示这100个点的横纵坐标。
提示:我们可以借助圆的极坐标公式来生成随机数。下方我为大家准备了一个图形可视化的代码,大家将自己生成随机数的核心代码放入答题区域内,然后运行整段程序,就会出现类似于右侧的图形。如果你的点都位于单位圆内,则说明你的答案正确。
解:利用极坐标的知识,注意的是角度随机,极径也随机。
clear,clc
t=0:0.01:2*pi;
xx=cos(t);
yy=sin(t);
plot(xx,yy,'r')
hold on
axis equal
axis([-1 1 -1 1])
k=2*pi*rand(1,100);
p=rand(1,100); %利用圆的极坐标
x=p.*cos(k);
y=p.*sin(k);
scatter(x,y,'b*')
效果如下:
Q10.和上一题的思路类似,请生成100个随机的点,这些点都位于圆内。其中,圆心的坐标为(10,4),半径为10。
解:根据上面改动一下圆心和半径就可以了。
clear,clc
t=0:0.01:2*pi;
xx=10+10*cos(t);
yy=4+10*sin(t);
plot(xx,yy,'r')
hold on
axis equal
axis([-1 1 -1 1])
k=2*pi*rand(1,100);
p=rand(1,100); %利用圆的极坐标
x=10+10*p.*cos(k);
y=4+10*p.*sin(k);
scatter(x,y,'b*')
效果如下: