数学建模比赛A题第二问程序分享

clear all;clc;close all;%载入节点数据
% [NodeLoc,NodeId1]=xlsread('附件1.csv');
% [NodeLoc2,NodeId2]=xlsread('附件2.csv');
% [~,NodeId3]=xlsread('附件3.csv');
% save NodeInfo NodeLoc NodeId1 NodeLoc2 NodeId2 NodeId3
load NodeInfoNodeNum=size(NodeLoc,1);     %NodeNum=NodeLoc矩阵第一列的长度
R=abs(min(NodeLoc(:,3)));    %R=NodeLoc矩阵第三列的最小值的绝对值
f=0.466;                     %定义常量f=0.466
MaxMove=0.6;%对坐标系进行旋转
rad=pi/180;          %rad=将一弧度分成180份(1°对应的弧度)
alpha= 36.795*rad;   %alpha=36.795°所对应的弧度(将方位角化为弧度)
beta= (90-78.169)*rad;  %beta=仰角的补角且将该角弧度化
rat_mat1=[cos(alpha) sin(alpha) 0 0;-sin(alpha) cos(alpha) 0 0;0 0 1 0;0 0 0 1;];
%写成矩阵的形式更加直观一些
%将坐标轴绕z轴旋转alpha弧度
%        cos(alpha)   sin(alpha)   0   0
%       -sin(alpha)   cos(alpha)   0   0
%            0            0        1   0
%            0            0        0   1
rat_mat2=[cos(beta) 0 -sin(beta) 0;0 1 0 0;sin(beta)  0 cos(beta) 0 ;0 0 0 1;];
%将坐标绕y轴旋转beta弧度
%        cos(beta)   0   -sin(beta)   0
%            0       1       0        0
%        sin(beta)   0    cos(beta)   0
%            0       0       0        1
rat_mat2I=[cos(-beta) 0 -sin(-beta) 0;0 1 0 0;sin(-beta)  0 cos(-beta) 0 ;0 0 0 1;];
%将坐标轴绕y轴旋转-beta弧度
rat_mat1I=[cos(-alpha) sin(-alpha) 0 0;-sin(-alpha) cos(-alpha) 0 0;0 0 1 0;0 0 0 1;];
%将坐标轴绕z轴旋转-alpha弧度
ratmat12=rat_mat1*rat_mat2;     %将坐标轴先绕z轴旋转alpha再绕y轴旋转beta
ratmat12I=rat_mat2I*rat_mat1I;  %将坐标轴先绕y轴旋转-beta再绕z轴旋转-alpha
NodeLocr=NodeLoc;NodeLocr(:,3)=NodeLocr(:,3)+R;NodeLocr(:,4)=1;  %先将NodeLoc赋值给NodeLocr,然后将NodeLocr第三列各加R,再将该矩阵加一列全是1的第四列
NodeLocr=NodeLocr*ratmat12;     %将NodeLocr这个矩阵经过ratmat12旋转(将原来的坐标加了R又加了一列1后再进行了旋转)[~,Indmid]=min(NodeLocr(:,3));  %找到NodeLocr矩阵中第三列的最小值然后赋值给Indmid
NodeLocOffset=NodeLocr(Indmid,1:3);   %找到NodeLocr矩阵的第Indmid行然后赋值给NodeLocr0ffset
NodeLocr(:,1)=NodeLocr(:,1)-NodeLocOffset(1);  %将NodeLocr的第一列都减去NodeLocr0ffset的第一个值
NodeLocr(:,2)=NodeLocr(:,2)-NodeLocOffset(2);  %将NodeLocr的第二列都减去NodeLocr0ffset的第二个值
NodeLocr(:,3)=NodeLocr(:,3)-NodeLocOffset(3)-R;%将NodeLocr的第三列都减去NodeLocr0ffset的第三个值再减R
%总结一下:以上这部分坐标转换是先将原来节点的坐标经过坐标旋转后,再找出旋转后的坐标最低点(如果画图的话就是旋转后图像Z最小的那个坐标)
%          然后将原来的每个点减去这个最低点的坐标(相当于是将原点交给了最低点),这样就实现了平移的效果,到这里坐标的变换就结束了MeshNum=size(NodeId3,1)-1;   %提取NodeId3矩阵第一列的长度-1(看看NodrId3矩阵的值就知道为什么要-1了)赋值给变量MeshNum
MeshGrid=zeros(MeshNum,3);   %生成一个MeshNum乘3阶的全零矩阵MeshGrid
for ii=1:NodeNumNodeId1Name=NodeId1{ii+1,1};Row=NodeId1Name(1)-'A'+1;Col=str2double(NodeId1Name(2:end))+1;Node_ID(Row,Col)=ii;
end
%这个循环结构的作用是将附件一的第一列分出来,然后将每个元素的字母和数字再分开,将字母转化为数字然后作为行,数字作为列,将第一列
%前的序号排进矩阵for ii=1:MeshNumfor jj=1:3NodeId1Name=NodeId3{ii+1,jj};Row=NodeId1Name(1)-'A'+1;Col=str2double(NodeId1Name(2:end))+1;MeshGrid(ii,jj)=Node_ID(Row,Col);end
end%这个循环结构的作用是将附件三以上一个循环的形式将序号保存到矩阵中TargetLoc=NodeLocr(:,1:3);
RealLoc=NodeLocr(:,1:3);
moveDisR=zeros(1,NodeNum);   %生成一个1乘NodeNum的全零矩阵
for ii=1:NodeNumLocOld=NodeLocr(ii,1:3);  %从转换后的坐标中拿出一组坐标[LocNew]=locSfun(LocOld,R,f);   %通过自定义函数计算出相对应的理想抛物面上那个节点的坐标TargetLoc(ii,:)=LocNew;moveDis=norm(LocOld-LocNew);   %计算基态节点与理想抛物面上相对应节点之间的距离if (moveDis>0)MovDir=LocNew-LocOld;MovDir=MovDir/norm(MovDir);  %计算出基态节点和抛物面对应节点连线对于坐标轴的余弦值if (moveDis<MaxMove)RealLoc(ii,:)=LocNew;    %如果距离小于可移动范围,则移动的距离就是相对应节点的距离elsemoveDis=0.6;RealLoc(ii,:)=LocOld+MovDir*MaxMove;  %如果大于或者等于最大移动距离,则将将最大移动距离分解到节点的连线方向再加上基态坐标end%这个循环结构的作用是计算出了考虑移动条件下的实际接受抛物面上各节点相对应的坐标LocDir=LocOld/norm(LocOld);movesign=-sign(MovDir*LocDir');moveDisR(ii)=movesign*moveDis;   %计算实际促动器的伸缩量end
end
%//
TargetLocr=TargetLoc;
TargetLocr(:,3)=TargetLocr(:,3)+R+NodeLocOffset(3);
TargetLocr(:,2)=TargetLocr(:,2)+NodeLocOffset(2);
TargetLocr(:,1)=TargetLocr(:,1)+NodeLocOffset(1);
TargetLocr(:,4)=1;TargetLocr=TargetLocr*ratmat12I;
TargetLocr(:,3)=TargetLocr(:,3)-R;
RealLocr=RealLoc;
RealLocr(:,3)=RealLocr(:,3)+R+NodeLocOffset(3);
RealLocr(:,2)=RealLocr(:,2)+NodeLocOffset(2);
RealLocr(:,1)=RealLocr(:,1)+NodeLocOffset(1);
RealLocr(:,4)=1;RealLocr=RealLocr*ratmat12I;
RealLocr(:,3)=RealLocr(:,3)-R;
%//这一部分是进行逆向旋转坐标轴后的结果%绘图调色
figure(1);clf;hold on;
plot3(NodeLoc(:,1),NodeLoc(:,2),NodeLoc(:,3),'r.');
plot3(TargetLocr(:,1),TargetLocr(:,2),TargetLocr(:,3),'k.');
plot3(RealLocr(:,1),RealLocr(:,2),RealLocr(:,3),'b.');
legend('基准态','理想抛物面','调整后');
axis([-320 320 -320 320 -320 0]);
axis equalfigure(2);clf;hold on;
PlotModel(NodeLoc,MeshGrid,'b');
PlotModel(TargetLocr,MeshGrid,'r');
title('基准态(蓝色)与理想抛物面(红色)')figure(3);clf;hold on;
PlotModel(NodeLoc,MeshGrid,'b');
PlotModel(RealLocr,MeshGrid,'r');
title('基准态(蓝色)与调整后抛物面(红色)')figure(4);clf;hold on;
PlotModel(TargetLocr,MeshGrid,'b');
PlotModel(RealLocr,MeshGrid,'r');
title('理想抛物面(蓝色)与调整后抛物面(红色)');%导出附件4
fid=fopen('附件4.csv','wt');
fprintf(fid,'对应主索节点编号,伸缩量(米)\n');
for ii=1:NodeNumfprintf(fid,'%s,',NodeId1{ii+1,1});fprintf(fid,'%0.4f,\n',moveDisR(ii));
end
fclose(fid);
save res2

2021高教杯数学建模A相关推荐

  1. 2021年国赛高教杯数学建模A题FAST主动反射面的形状调节解题全过程文档及程序

    2021年国赛高教杯数学建模 A题 FAST主动反射面的形状调节 原题再现   中国天眼--500 米口径球面射电望远镜(Five-hundred-meter Aperture Spherical r ...

  2. 2021年国赛高教杯数学建模B题乙醇偶合制备C4烯烃解题全过程文档及程序

    2021年国赛高教杯数学建模 B题 乙醇偶合制备C4烯烃 原题再现   C4 烯烃广泛应用于化工产品及医药的生产,乙醇是生产制备 C4 烯烃的原料.在制备过程中,催化剂组合(即:Co 负载量.Co/S ...

  3. 2021年国赛高教杯数学建模D题连铸切割的在线优化解题全过程文档及程序

    2021年国赛高教杯数学建模 D题 连铸切割的在线优化 原题再现   连铸是将钢水变成钢坯的生产过程,具体流程如下(图 1):   钢水连续地从中间包浇入结晶器,并按一定的速度从结晶器向下拉出,进入二 ...

  4. 2022 高教杯数学建模C题古代玻璃制品的成分分析与鉴别回顾及总结

    2022 高教杯数学建模C题古代玻璃制品的成分分析与鉴别回顾及总结 Paper & Code:https://github.com/Fly-Pluche/2022-mathematical-m ...

  5. 2019年国赛高教杯数学建模E题薄利多销分析解题全过程文档及程序

    2019年国赛高教杯数学建模 E题 薄利多销分析 原题再现   "薄利多销"是通过降低单位商品的利润来增加销售数量,从而使商家获得更多盈利的一种扩大销售的策略.对于需求富有弹性的商 ...

  6. 2021华为杯数学建模“空气质量预报二次建模” 思路

    2021华为杯数学建模B题思路–共享资料 1.问题1,按照附录的公式计算对应的AQI即可 2.使用PCA方式分解,将每个变量的众多值做无量纲话处理后放到统一坐标系下,找到最大特征值对应的特征,然后找出 ...

  7. 2019年国赛高教杯数学建模C题机场的出租车问题解题全过程文档及程序

    2019年国赛高教杯数学建模 C题 机场的出租车问题 原题再现   大多数乘客下飞机后要去市区(或周边)的目的地,出租车是主要的交通工具之一.国内多数机场都是将送客(出发)与接客(到达)通道分开的.送 ...

  8. 2021华为杯数学建模D题解题-抗乳腺癌候选药物的优化建模

    2021华为杯数学建模D题解题-抗乳腺癌候选药物的优化建模 赛题 1. 问题一解题:特征选择 1.1. 赛题分析 1.2. 解题:特征选择方法对比 1.3. 模型评估 2. 问题二解题:预测模型 2. ...

  9. 2018年国赛高教杯数学建模A题高温作业专用服装设计解题全过程文档及程序

    2018年国赛高教杯数学建模 A题 高温作业专用服装设计 原题再现   在高温环境下工作时,人们需要穿着专用服装以避免灼伤.专用服装通常由三层织物材料构成,记为I.II.III层,其中I层与外界环境接 ...

最新文章

  1. 图解Oracle存储过程教程
  2. Android中finish()、System.exit()、KillProcess()的区别
  3. Service的生命周期
  4. ASP.NET Core SignalR中的流式传输
  5. CentOS7 linux下yum安装redis以及使用
  6. sourceforge_SourceForge依旧re憬未来
  7. ubuntu下解决csdn网页打不开的问题
  8. 洛谷——P1317 低洼地
  9. 一线互联网企业负载均衡和应用优化基础
  10. 数据结构算法题整理4
  11. JAVA数据库连接池的工作机制
  12. PPT资源、技巧与设计网站精选【转自paratop】
  13. 鼠标左右键的快捷键是什么?
  14. Java成员变量、局部变量的默认值和初始化
  15. 使用GoLang开发游戏服务器(一)
  16. C. Pythagorean Triples
  17. 个人小程序和企业小程序
  18. 中国证券业协会会员登记注册程序
  19. 虚拟机没有网络教你如何解决
  20. 全国大学生节能减排社会实践与科技竞赛最新作品模板资料国家一等奖完整申报书说明书ppt

热门文章

  1. 面试阿里巴巴有多难,看看面经你就知道了
  2. 我是如何在一晚上拿到阿里巴巴offer的?
  3. forest_train训练文件的生成代码
  4. C语言 阿拉伯数字转换为汉语大写数字金额程序分析及源码
  5. ImageDraw类详解:几何图形的绘制与文字的绘制
  6. 广义似然比检验matlab,第5章 资产定价模型的时间序列估计与检验.pptx
  7. ZXing实现横竖屏扫描切换
  8. 解决PyCharm安装tensorflow-cpu2.1.0导入失败问题
  9. RK61 蓝牙机械键盘配合 karabiner 软件适配 MAC 系统脚本
  10. 买家用投影仪应该关注哪些数据?