2012年认证杯SPSSPRO杯数学建模
A题 蜘蛛网
原题再现:
第一阶段问题
世界上生存着许多种类的蜘蛛,而其中的大部分种类都会通过结网来进行捕食。请你建立合理的数学模型,说明蜘蛛网织成怎样的结构才是最合适的。
整体求解过程概述(摘要)
众所周知,蜘蛛是一个比较庞大的物种,而蜘蛛网也在世界各地都存在着。通过人们长时间来的观察与研究,渐渐发现了蜘蛛网其结构内部的本质。作为一个长时间来捕捉猎物的利器,无论从材料的柔韧性,阻尼运动对蛛网强度的保护性,还是对紫外线光的反射性,都从各个方面反映出了蜘蛛网对于蜘蛛捕食关键性的作用。那么,面对蜘蛛网诸多性质,我们从另一方面,即蜘蛛网的结构密集度计算、建模并优化来分析蜘蛛网在捕食方面的另一重要作用。
在建模过程中,我们总体上通过构造蛛网模型模拟蛛网捕虫的过程,并通过计算捕虫随机过程的概率来优化蛛网模型。首先对于蛛网的建立,我们通过模拟蛛网的构架,即确定初始半径的大小和方向来确定蛛网以后的螺旋编织的方向和大小。其次,再在已有的蛛网架构基础上进行螺旋形展开,通过对蛛网网格的密集度限制条件对其展开进行限制,从而获得初步蛛网模型。在完成了初步的蛛网模型后,我们将把蛛网模型应用到一个空间的捕虫模拟中,在该模拟过程中,通过计算该蛛网捕虫成功的概率来验证所建蛛网的合理性。如不满足优化因子,我们将通过改变蛛网架构的初值来优化蛛网的结构。
最后,我们将综合蛛网所受张力以及在捕虫过程中的阻尼运动等物理问题,将所建立的蛛网模型应用到实际问题中,并进一步通过 GA 算法对其进行进一步优化,更加仿真地模拟蛛网的构造,方便以后的研究。
问题分析:
我们知道,在生物界的成长与优胜劣汰中,蜘蛛以其强大的生命力和竞争能力在生物界顽强生长了一亿多年,不论周遭环境如何,都可以顽强的生存下来,由此可知,蜘蛛网对于蜘蛛得以在生物界顺利存活如此之长的时间起到了至关重要的作用。自然而然的,对于至关重要的蛛网的结构、物理特性等方面的研究也就吸引了很多眼球。
第一,在结构方面,蛛网的特性之所以可以捕捉到许多昆虫,并且可以长时间编织在角落里,是与蛛网的结构密集性与稳定性是不可分割的。首先,对于蛛网密集性的分析,我们可以发现,如果不是蛛网密集度性能好,昆虫是无法大概率的被捕捉的。所以我们从蛛网的密集度着手,首先根据蛛网的密集性对蛛网的初始值进行编译,通过对许多外界因素的参考与分析进行初步参数设定,同时对建立好的初步模型螺旋展开,同时并运用 GA 算法(遗传算法)对展开后的螺旋性图进行优化处理,并得出最终密集度相对较好的蛛网。其次,通过分析蛛网的稳定性,我们再对建立出的蛛网设立密集系数,对建立出的蛛网每个模块的面积及其相互之间的受力关系进行稳定测定,如果不满足我们设定的密集系数范围,则通过改变相应的初始参数来尽量满足最终的蛛网稳定性。
第二,在物理方面,蛛网无论在力学方面还是在光学方面都有着奇特的性质。所以,我们首先将分析蛛网间的受力以及蛛网总体的重力影响来研究蛛网之所以稳定不易掉落损坏的愿意。其次,通过分析动物在撞击蛛网后,蛛网之所以可以承受住动物巨大的冲击,是与其特别的阻尼运动分不开的,所以,在力学方面,蛛网有着其特殊的性质,所以,根据这些特点,我们可以针对蛛网的结构展开进行讨论与研究。另外,正是由于光反射的原因,蛛网才得以顺利的诱惑昆虫撞向蛛网,所以,我们还可综合斜率或角度原因来对蛛网的展开角度进行构造。
同时,在建立好的模型的基础上,我们可以根据已有的 GA 算法(遗传算法)对已有模型进行进一步分析和优化,并通过进一步的严谨将蛛网模型应用至更多的蜘蛛类别中,从而达到真正仿真实验的目的。
论文缩略图:
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
部分程序代码:(代码和文档not free)
clear;
clc;
hold on;
global sumlen;
sumlen=0;
nl=0;
plot([0,0],[-20,20],'--k');
plot([-20,20],[0,0],'--k');
%% init
infil=fopen('mat.in','r');
[n,num]=fscanf(infil,'%d',1);
[nesw,num]=fscanf(infil,'%f',4);
[abell,num]=fscanf(infil,'%f',8);
[tau,num]=fscanf(infil,'%f',1);
[rho,num]=fscanf(infil,'%f',n-1);
rho(n)=0;
[r0,num]=fscanf(infil,'%f',1);
[d,num]=fscanf(infil,'%f',1);
[k,num]=fscanf(infil,'%f',1);
[es,num]=fscanf(infil,'%f',1);
[id,num]=fscanf(infil,'%f',1);
alpha=2*pi/n;
%% ellipse
syms x y;
z=[((x-nesw(2))/abell(1))^2+(y/abell(2))^2-1+x;((y-nesw(1))/abell(2))^2+(x/
abell(1))^2-1+y];
[xy01,num]=mulStablePoint(z,[1;1]);
z=[((x-nesw(3))/abell(3))^2+(y/abell(4))^2-1+x;((y-nesw(2))/abell(4))^2+(x/
abell(3))^2-1+y];
[xy02,num]=mulStablePoint(z,[1;1]);
z=[((x-nesw(4))/abell(5))^2+(y/abell(6))^2-1+x;((y-nesw(3))/abell(6))^2+(x/
abell(5))^2-1+y];
[xy03,num]=mulStablePoint(z,[1;1]);
z=[((x-nesw(1))/abell(7))^2+(y/abell(8))^2-1+x;((y-nesw(4))/abell(8))^2+(x/
abell(7))^2-1+y];
[xy04,num]=mulStablePoint(z,[1;1]);
xxl=abell(1)*cos(0)+xy01(1);
yyl=abell(2)*sin(0)+xy01(2);
for beta=0.001:0.001:2*pi;
xxn=abell(1)*cos(beta)+xy01(1);
yyn=abell(2)*sin(beta)+xy01(2);
if xxl>0 & xxn>0 & yyl>0 & yyn>0
plot([xxl,xxn],[yyl,yyn],'w');
end
xxl=xxn;
yyl=yyn;
end
xxl=abell(3)*cos(0)+xy02(1);
yyl=abell(4)*sin(0)+xy02(2);
for beta=0.001:0.001:2*pi;
xxn=abell(3)*cos(beta)+xy02(1);
yyn=abell(4)*sin(beta)+xy02(2);
if xxl>0 & xxn>0 & yyl>0 & yyn>0
plot([yyl,yyn],[-xxl,-xxn],'w');
end
xxl=xxn;
yyl=yyn;
end
xxl=abell(5)*cos(0)+xy03(1);
yyl=abell(6)*sin(0)+xy03(2);
for beta=0.001:0.001:2*pi;
xxn=abell(5)*cos(beta)+xy03(1);
yyn=abell(6)*sin(beta)+xy03(2);
if xxl>0 & xxn>0 & yyl>0 & yyn>0
plot([-xxl,-xxn],[-yyl,-yyn],'w');
end
xxl=xxn;
yyl=yyn;
end
xxl=abell(7)*cos(0)+xy04(1);
yyl=abell(8)*sin(0)+xy04(2);
for beta=0.001:0.001:2*pi;
xxn=abell(7)*cos(beta)+xy04(1);
yyn=abell(8)*sin(beta)+xy04(2);
if xxl>0 & xxn>0 & yyl>0 & yyn>0
plot([-yyl,-yyn],[xxl,xxn],'w');
end
xxl=xxn;
yyl=yyn;
end
%% main line
theta=pi/2-tau*2*pi/360;
for i=1:1:n
if theta>0
[p(i,1),p(i,2)]=drawmainline(tan(theta),abell(1),abell(2),xy01(1),xy01(2),1
);
else
if theta>-pi/2
[p(i,1),p(i,2)]=drawmainline(tan(theta+pi/2),abell(3),abell(4),xy02(1),xy02
(2),2);
else
if theta>-pi
[p(i,1),p(i,2)]=drawmainline(tan(theta+pi),abell(5),abell(6),xy03(1),xy03(2
),3);
else if theta>-3/2*pi
[p(i,1),p(i,2)]=drawmainline(tan(theta+pi*3/2),abell(7),abell(8),xy04(1),xy
04(2),4);
else
[p(i,1),p(i,2)]=drawmainline(tan(theta+2*pi),abell(1),abell(2),xy01(1),xy01
(2),1);
end
end
end
end
theta=theta-alpha-rho(i)*2*pi/360;
end
for i=1:1:n-1
plot([p(i,1),p(i+1,1)],[p(i,2),p(i+1,2)],'--k');
end
plot([p(n,1),p(1,1)],[p(n,2),p(1,2)],'--k');
%% line
l=len(p(1,1),p(1,2));
lastx=r0*p(1,1)/l;
lasty=r0*p(1,2)/l;
r=r0;
rr(1)=r0;
for i=1:1:n-1
r=r+d;
rr(i+1)=r;
l=len(p(i+1,1),p(i+1,2));
nowx=r*p(i+1,1)/l;
nowy=r*p(i+1,2)/l;
plot([lastx,nowx],[lasty,nowy]);
nl=nl+1;
line(nl,1)=(lasty-nowy)/(lastx-nowx);
line(nl,2)=lasty-line(nl,1)*lastx;
line(nl,3)=lastx;
line(nl,4)=nowx;
lastx=nowx;
lasty=nowy;
end
r=r+d;
rr(1)=r;
l=len(p(1,1),p(1,2));
nowx=r*p(1,1)/l;
nowy=r*p(1,2)/l;
plot([lastx,nowx],[lasty,nowy]);
nl=nl+1;
line(nl,1)=(lasty-nowy)/(lastx-nowx);
line(nl,2)=lasty-line(nl,1)*lastx;
line(nl,3)=lastx;
line(nl,4)=nowx;
lastx=nowx;
lasty=nowy;
flag=0;
i=2;
ii=1;
d=d*(n-1)*k;
while 1
if i>n
i=i-n;
end
if i<1
i=i+n;
end
r=rr(i)+d;
l=len(p(i,1),p(i,2));
if l<r
if flag==1
break;
end
ii=-ii;
i=i+2*ii;
flag=1;
continue;
end
nowx=r*p(i,1)/l;
nowy=r*p(i,2)/l;
plot([lastx,nowx],[lasty,nowy]);
rr(i)=r;
sumlen=sumlen+len(lastx-nowx,lasty-nowy);
nl=nl+1;
line(nl,1)=(lasty-nowy)/(lastx-nowx);
line(nl,2)=lasty-line(nl,1)*lastx;
line(nl,3)=lastx;
line(nl,4)=nowx;
lastx=nowx;
lasty=nowy;
i=i+ii;
flag=0;
d=d*k;
end
%% simulation
sumv=0;
v=0;
for i=1:1:10000
ix=25*rand(1,1);
iy=25*rand(1,1);
is=normrnd(es,id);
while is<0
is=normrnd(es,id);
end
v=v+is^3;
for j=1:1:nl
dis=abs(line(j,1)*ix+line(j,2)-iy)/sqrt(line(j,1)^2+1);
if dis>is
continue;
end
tdeta=sqrt(-2*ix*(line(j,2)-iy)+is*is*(1+line(j,1)^2)-line(j,1)^2*(ix*ix+(l
ine(j,2)-iy)^2));
tx=(ix-(line(j,2)-iy)-tdeta)/(1+line(j,1)^2);
if (line(j,3)-tx)*(line(j,4)-tx)<0
sumv=sumv+is^3;
break;
end
tx=(ix-(line(j,2)-iy)+tdeta)/(1+line(j,1)^2);
tx=(ix-(line(j,2)-iy)-tdeta)/(1+line(j,1)^2);
if (line(j,3)-tx)*(line(j,4)-tx)<0
sumv=sumv+is^3;
break;
end
end
end
%% outit
sumlen
sumv
rate=sumv/v
%% program end
axis('equal');
fclose(infil);
hold off;