数模竞赛Paid answer

数模竞赛Paid answer

2017年认证杯SPSSPRO杯数学建模

A题 安全的后视镜

原题再现:

  汽车后视镜的视野对行车安全非常重要。一般来说,汽车的后视镜需要有良好的视野范围,以便驾驶员能够全面地了解车后方的道路情况。同时,后视镜也要使图像的畸变尽可能小,以使驾驶员能够准确地判断距离。如果汽车的后视镜使用平面镜,图像没有畸变,对距离的判断十分准确。但是当镜面大小受限时,视野相对较小。如果使用凸面镜,可以以较小的镜面获得更加宽广的视野,但是图像存在畸变,很难准确判断镜中物体与自己的距离。有的镜面是由平面镜和凸面镜拼合在一起组成,意图兼顾两者的优点。但事实上,驾驶员在观察后视镜时,两者很难同时看清。较受欢迎的做法是构造一个变曲率的后视镜,使后视镜可以兼顾两者的优点,也降低了观察和距离判断上的难度。目前市场上有售不同设计的变曲率后视镜。最常见的是一种双曲率后视镜,内侧接近平面镜,外侧则是一个凸面镜,在它们之间进行了平滑的过渡。图 1 是两个例子,为了便于驾驶员对距离进行判断,镜中由虚线或细实线示意了不同曲率的镜面间的分界线。它们的具体设计有所区别,性能也会有所不同。
  第一阶段问题: 对典型的小型家用轿车而言,共有三面后视镜,左右车门的外侧各装一面外后视镜,车内正中还有一面内后视镜。假设两面外后视镜都设计成如图 1 所示的双曲率后视镜,请你建立相应的数学模型,对外后视镜给出优化的设计方案,包括镜面的曲面外形以及分界示意线的位置。并以一种现有的轿车为例 (可自选),给出具体的计算结果,镜面的边缘轮廓可以沿用现有的设计。由于我们只做理论上的研究,所以在设计时暂不需要考虑和遵循相应的国家标准。
2017年认证杯SPSSPRO杯数学建模A题(第一阶段)安全的后视镜全过程文档及程序-LMLPHP

整体求解过程概述(摘要)

  汽车在换道、超车、转弯、掉头、倒车入库行驶时,汽车后视镜使驾驶者可以间接看清汽车后方、侧方和下方位置的环境状况,起到了“第二只眼睛”的作用。当前汽车的外后视镜多选择双曲率后视镜,内侧接近平面镜,外侧则是一个凸面镜,既扩大视野又减小畸变。镜面设计时需要考虑平面镜与凸面镜的分配比例及凸面镜的曲率大小,并保证平面镜与凸面镜的平滑过渡。针对双曲率外后视镜设计的多目标优化问题,本文进行了下列工作:
  一:建立视野及畸变率量化指标。本文采用视野面积表征视野大小,采用畸变率表征镜像失真程度。首先建立了车体坐标系、镜面坐标系,通过设定人眼、外后视镜及测试屏幕在车体系下的位置,利用后视镜曲面光学原理,求出 40X10镜面光点对应测试屏幕光点坐标,通过连接测试屏幕散乱点,计算无重复三角形面积和,考虑车身遮挡及左右眼点的交集面积表示为视野面积;分别计算测试屏幕光点在不同方向、不同眼点的畸变率,再求取其平均值作为表征畸变程度的物理量,建立畸变率模型。
  二:建立并分析多种双曲率镜面模型。在保证平滑过渡的基础上,对内侧镜面与外侧镜面曲面形式,尝试多类组合方式,建立相应镜面模型。通过计算不同镜面模型视野、畸变率的大小,定量分析了视场角及畸变率的影响因素。
  三:利用第二步得出的结论,建立镜面模型。本文选用球面作为内侧镜面的曲面,选用圆环作为外侧镜面的曲面,球面与圆环外表面完全相切,保证平滑过渡。建立多目标采用拟牛顿法作为非线性方程求解算法,结合模拟退火算法优化,得出最佳的球面与圆环面的结合位置及球面与圆环面的曲率,在保证视野畸变率的前提下,视野面积增加了 15.8%。
  此外,使用 CATIA 三维实体软件,对优化出的镜面进行验证。分析视野在路面的投影区域,验证了本文设计的镜面满足法规的要求,并且视场足够大。本文在建模过程也考虑一些其他因素,如驾驶员高度,安全性等因素对镜面设计的影响,但本文所建立的镜面模型为双曲率镜面,没有分析变曲率镜面的设计因素。考虑左右外后视镜没有耦合问题,且建模原理一致,所以本文仅对左后视镜镜面建模并优化分析。

问题分析:

  左后视镜内侧主要用于观察离车身较近的物体的信息(如图 ),驾驶员需通过该区域的图像信息进行距离的准确判断,因此内侧模型主要考虑图像畸变率。左后视镜外侧主要用于观察离车身较远的物体的信息,这部分信息主要是起到辅助观察的左右,对于该部分的图像可以适当放大失真率,以换求更加广泛的视野范围。因此外侧模型主要考虑在人体可接受的图像畸变率范围内(通常定为 7%),通过改变镜面曲率,尽量增加视野范围。

2017年认证杯SPSSPRO杯数学建模A题(第一阶段)安全的后视镜全过程文档及程序-LMLPHP
  由于内外侧选择不同的曲面模型,那么必然存在曲面模型衔接的问题,为了防止整个镜面的曲率突变,应该保证内外侧模型在结合处进行平滑过渡。针对上述镜面内外侧模型的功能不同,建模时需要对注意以下几点:
  1. 内外侧模型分别选取合适的曲面模型进行建模。
  2. 基于对题意的理解,保证曲面之间进行平滑过渡,本文理解为内外侧模型应该保证相切。
  3. 内外侧模型曲面类型确定之后,应针对该问题的特点,选择合适的优化算法进行模型参数优化。
  4. 对优化的结果进行仿真验证。

模型假设:

  本次建模假设如下:
  1. 人眼高度及左右位置固定,两眼距离固定,且两眼连线垂直于车身纵向平面。
  2. 后视镜的外壳与车身固定,
  3. 不考虑右侧后视镜、车内后视镜对左侧后视镜视野的影响。
  4. 不考虑反射率的问题,认为反射率为 100%。
  5. 镜面垂直垂直于水平地面。
  6. 镜面与镜壳夹角固定,本文设置镜面与镜壳平行。
  7. 后视镜外壳不影响人眼的视线。
  8. 假设镜面边缘为矩形。其他未尽假设在建模时说明。

论文缩略图:

2017年认证杯SPSSPRO杯数学建模A题(第一阶段)安全的后视镜全过程文档及程序-LMLPHP
2017年认证杯SPSSPRO杯数学建模A题(第一阶段)安全的后视镜全过程文档及程序-LMLPHP
2017年认证杯SPSSPRO杯数学建模A题(第一阶段)安全的后视镜全过程文档及程序-LMLPHP

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

clc;close all;clear;
%眼点尺寸计算
Peye_v=[-0.7 -0.4 0.25]';%眼点在车体坐标系中的位置
%x 为车头方向,y 为车左侧为正,z 为上为正
leyes=0.065;%双眼点之间的距离
Peyel_v=Peye_v+[0 0.0325 0]';
Peyer_v=Peye_v+[0 -0.0325 0]';
%镜面局部坐标系:垂直镜面向前为 x,沿镜面向后为 y 正
l_mr=0.2;
h_mr=0.1;
%镜子相对车体的安装 角度
afa=60*pi/180;
%镜子离车体的距离 ,延长线方向
dmr=0.08;
%车体坐标原点在镜面坐标系下的坐标
Pmv=[0 -l_mr/2-dmr -h_mr/2]';
%左镜面坐标系原点在车体系下的坐标
Pvm=[-(l_mr/2+dmr)*cos(afa) (l_mr/2+dmr)*sin(afa) h_mr/2]';
%右镜面坐标系原点在车体系下的坐标
Pvm_R=[-(l_mr/2+dmr)*cos(afa) -(l_mr/2+dmr)*sin(afa)-1.8 h_mr/2]';
%从右镜面坐标系到车体坐标系的转换矩阵
AvmR=[cos(pi/2-afa) cos(afa) 0;
 cos(pi/2+afa) cos(pi/2-afa) 0;
 0 0 1];
%从车体坐标系到镜面坐标系的转换矩阵
Amv=[cos(pi/2-afa) cos(afa) 0;
 cos(pi-afa) cos(pi/2-afa) 0;
 0 0 1];
%从镜面坐标系到车体坐标系的转换矩阵
Avm=Amv';
%车体轮廓,车体坐标下
Pcar_v=[
1 -2.8 -2.8 1 1;
0 0 -1.8 -1.8 0;
0 0 0 0 0
];
%左侧车尾点
Pcarbk=Pcar_v(:,2);
%车体轮廓在镜面坐标下
Pcar_m=Amv*Pcar_v;
Pcar_m(1,:)=Pcar_m(1,:)+Pmv(1);
Pcar_m(2,:)=Pcar_m(2,:)+Pmv(2);
Pcar_m(3,:)=Pcar_m(3,:)+Pmv(3);
%后视镜轮廓坐标 镜面坐标下 %左上 左下 右下 右上 左上
Pmr_m=[0 0 0 0 0;
 l_mr/2 l_mr/2 -l_mr/2 -l_mr/2 l_mr/2;
 h_mr/2 -h_mr/2 -h_mr/2 h_mr/2 h_mr/2];
%右后视镜轮廓坐标 镜面坐标下 %左上 左下 右下 右上 左上
Pmr_m_R=[0 0 0 0 0;
 l_mr/2 l_mr/2 -l_mr/2 -l_mr/2 l_mr/2;
 h_mr/2 -h_mr/2 -h_mr/2 h_mr/2 h_mr/2];
%左后视镜在车体系下坐标 左上 左下 右下 右上 左上
Pmr_v=[-(dmr+l_mr)*cos(afa) (l_mr+dmr)*sin(afa) h_mr;
 -(dmr+l_mr)*cos(afa) (l_mr+dmr)*sin(afa) 0;
 -dmr*cos(afa) dmr*sin(afa) 0;
 -dmr*cos(afa) dmr*sin(afa) h_mr;
 -(dmr+l_mr)*cos(afa) (l_mr+dmr)*sin(afa) h_mr
 ]';
%使用方向余弦矩阵处理
Pmr_v=Avm*Pmr_m;
Pmr_v(1,:)=Pmr_v(1,:)+Pvm(1);
Pmr_v(2,:)=Pmr_v(2,:)+Pvm(2);
Pmr_v(3,:)=Pmr_v(3,:)+Pvm(3);
%右后视镜轮廓在车体坐标系下
Pmr_R_v=AvmR*Pmr_m_R;
Pmr_R_v(1,:)=Pmr_R_v(1,:)+Pvm_R(1);
Pmr_R_v(2,:)=Pmr_R_v(2,:)+Pvm_R(2);
Pmr_R_v(3,:)=Pmr_R_v(3,:)+Pvm_R(3);
%投影屏幕轮廓 车体坐标下
%投影屏幕大小
ls=12;
hs=4;%
diss=10;
Ps=[-diss ls/2 0;
 -diss ls/2 -hs;
-diss -ls/2 -hs
 -diss -ls/2 0;
 -diss ls/2 0]';
%转换到镜面坐标下
Psm=Amv*Ps;
Psm(1,:)=Psm(1,:)+Pmv(1,1);
Psm(2,:)=Psm(2,:)+Pmv(2,1);
Psm(3,:)=Psm(3,:)+Pmv(3,1);
%屏幕平面 方程 x=-10
%眼点在镜面坐标系下的坐标值
Peye_m=Amv*Peye_v+Pmv;
Peyel_m=Amv*Peyel_v+Pmv;
Peyer_m=Amv*Peyer_v+Pmv;
%后视镜上的离散点坐标
num_l=40;
num_h=10;
PmEdge=zeros(3,num_l*num_h);
R=1.5;%0.4;%半径
%球心坐标
r=0.7;%环半径
Psphere=[R 0 0]';
%求法向量矩阵
Fm=zeros(3,num_l*num_h);
%反射点到车尾的向量
b2bk=zeros(3,num_l*num_h);
for i=1:num_l
 for j=1:num_h
 PmEdge(2,j+(i-1)*num_h) =-l_mr/2+ l_mr/(num_l-1)*(i-1);
 PmEdge(3,j+(i-1)*num_h) =h_mr/2- h_mr/(num_h-1)*(j-1);
 if PmEdge(2,j+(i-1)*num_h)<=0%sphere
 PmEdge(1,j+(i-1)*num_h) 
=-sqrt(R^2-PmEdge(2,j+(i-1)*num_h)^2-PmEdge(3,j+(i-1)*num_h)^2)+R;
 Fm(:,j+(i-1)*num_h)=[PmEdge(1,j+(i-1)*num_h)-Psphere(1) ...
 PmEdge(2,j+(i-1)*num_h)-Psphere(2) 
PmEdge(3,j+(i-1)*num_h)-Psphere(3)]/R; 
 else
 
PmEdge(1,j+(i-1)*num_h)=R-sqrt((R-r+sqrt(r^2-PmEdge(2,j+(i-1)*num_h)^2 ))^2-PmEdge(3,j
+(i-1)*num_h)^2);
Fm(:,j+(i-1)*num_h)=[
 
2*(sqrt((PmEdge(1,j+(i-1)*num_h)-R)^2+PmEdge(3,j+(i-1)*num_h)^2)-R+r)*((PmEdge(1,j+(i-1
)*num_h)-R)^2+PmEdge(3,j+(i-1)*num_h)^2)^-0.5*(PmEdge(1,j+(i-1)*num_h)-R); 
 2*PmEdge(2,j+(i-1)*num_h)
 
2*(sqrt((PmEdge(1,j+(i-1)*num_h)-R)^2+PmEdge(3,j+(i-1)*num_h)^2)-R+r)*((PmEdge(1,j+(i-1
)*num_h)-R)^2+PmEdge(3,j+(i-1)*num_h)^2)^-0.5*PmEdge(3,j+(i-1)*num_h)
 ];
 
Fm(:,j+(i-1)*num_h)=Fm(:,j+(i-1)*num_h)/sqrt(Fm(1,j+(i-1)*num_h)^2+Fm(2,j+(i-1)*num_h)
^2+Fm(3,j+(i-1)*num_h)^2);
 
 end
 end 
end
%画镜面在镜面坐标下的形状
subplot(3,4,4);hold on;grid on;
%镜面轮廓
plot3(Pmr_m(1,:),Pmr_m(2,:),Pmr_m(3,:));
for i=1:num_l*num_h
 plot3(PmEdge(1,i),PmEdge(2,i),PmEdge(3,i),'*g')
end
view([-60, 30])
title('镜面形状')
set(gca,'DataAspectRatio',[0.3 1 1])
%入射光线方向向量 左眼
[m n]=size(PmEdge);
FmRL=zeros(m,n);
FmRR=zeros(m,n);
for i=1:n
 FmRL(:,i)=PmEdge(:,i)-Peyel_m;%入射光线方向向量 左眼
 FmRR(:,i)=PmEdge(:,i)-Peyer_m;%入射光线方向向量 右眼
end
%入射光线单位方向向量
for i=1:n
d=sqrt(FmRL(1,i)^2+FmRL(2,i)^2+FmRL(3,i)^2);
FmRL(:,i)=FmRL(:,i)/d;
d=sqrt(FmRR(1,i)^2+FmRR(2,i)^2+FmRR(3,i)^2);
FmRR(:,i)=FmRR(:,i)/d;
end
%反射向量
b_left=zeros(m,n);
b_right=zeros(m,n);
for i=1:n
b_left(:,i)=FmRL(:,i)-2*(Fm(:,i)'*FmRL(:,i))*Fm(:,i);
b_right(:,i)=FmRR(:,i)-2*(Fm(:,i)'*FmRR(:,i))*Fm(:,i);
end
%转到车体系
b_v_left=Avm*b_left;
b_v_right=Avm*b_right;
%反射点到车尾的向量
b2bk=zeros(3,num_l*num_h);
%车体系下镜边缘点的位置
P_v_mEedge=zeros(m,n);
for i=1:n
 P_v_mEedge(:,i)=Avm*(PmEdge(:,i)+Pvm);
 b2bk(:,i)=Pcarbk- P_v_mEedge(:,i);%镜上点到车尾的向量
 b2bk(:,i)=b2bk(:,i)/sqrt(b2bk(1,i)^2+b2bk(2,i)^2+b2bk(3,i)^2); 
end
%屏幕边缘坐标转到车体系下
% PmEdgeV=Avm*P_v_mEedge;
%求车体系下的交点 %屏幕交点在车体系下的
Psv_L=-diss*ones(m,n);
Psv_R=-diss*ones(m,n);
for i=1:n
 KK=(-diss-P_v_mEedge(1,i))/b_left(1,i);
Psv_L(2,i)=KK*b_left(2,i)+P_v_mEedge(2,i);
Psv_L(3,i)=KK*b_left(3,i)+P_v_mEedge(3,i);
 KK=(-diss-P_v_mEedge(1,i))/b_right(1,i);
 Psv_R(2,i)=KK*b_right(2,i)+P_v_mEedge(2,i);
 Psv_R(3,i)=KK*b_right(3,i)+P_v_mEedge(3,i);
end
Psm_L=Amv*Psv_L;
Psm_R=Amv*Psv_R;
%车体系下绘图
subplot(1,4,[1 3]);hold on;grid on;
title('屏幕投影')
%eye 
plot3(Peye_v(1,1),Peye_v(2,1),Peye_v(3,1),'*')
plot3(Peyel_v(1,1),Peyel_v(2,1),Peyel_v(3,1),'*')
plot3(Peyer_v(1,1),Peyer_v(2,1),Peyer_v(3,1),'*')
%car
plot3(Pcar_v(1,:),Pcar_v(2,:),Pcar_v(3,:));
%左镜面轮廓
plot3(Pmr_v(1,:),Pmr_v(2,:),Pmr_v(3,:));
%右镜面轮廓
plot3(Pmr_R_v(1,:),Pmr_R_v(2,:),Pmr_R_v(3,:));
%幕轮廓
plot3(Ps(1,:),Ps(2,:),Ps(3,:));
set(gca,'DataAspectRatio',[1 1 1])
xlim([-10 2]);
view([100 25])
for i=1:n
 if b2bk(2,i)<=b_left(2,i)
 plot3(Psv_L(1,i),Psv_L(2,i),Psv_L(3,i),'r*');
 else
 plot3(Psv_L(1,i),Psv_L(2,i),Psv_L(3,i),'g.'); 
 end
 if b2bk(2,i)<=b_right(2,i)
 plot3(Psv_R(1,i),Psv_R(2,i),Psv_R(3,i),'bo');
 else
 plot3(Psv_R(1,i),Psv_R(2,i),Psv_R(3,i),'c.');
 end
end
dt = DelaunayTri(Psv_L(2,:)',Psv_L(3,:)');
k = convexHull(dt);
abs(trapz(dt.X(k,1),dt.X(k,2)))
dt = DelaunayTri(Psv_R(2,:)',Psv_R(3,:)');
k = convexHull(dt);
abs(trapz(dt.X(k,1),dt.X(k,2)))
distortioncalc;
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可
01-19 09:05