打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
书籍福利 | 备战数模 Part 2— “MATLAB 创新奖”论文解析

对于要参加 2018 年数模竞赛的模友们,观摩一下 2017 年的优秀赛题求解程序显然可以大幅提升功力,而“MATLAB 创新奖”获奖作品是其中的战斗机,再加上卓金武老师的点评,那就更不能错过了!

    ◆  

首先来认识一下 2017 MATLAB 创新奖获奖团队:

甲组:黄璐哲  方天庆  帅青(浙江大学)

乙组:倪永亮  崔靖  李嘉麒(南京铁道职业技术学院)

浙江大学作为中国第二所为全校师生提供全模块 MATLAB 校园版的高校,全模块的正版装备显然可以大幅提振团队战斗士气,正统的培训(官方在线培训资源)也可以增加团队战斗力。

送一幅 MATLAB 绘制的“富贵玫瑰图”,感谢两支队伍提供的获奖程序:

言归正题:

2017 MATLAB 创新奖甲组程序解析

甲组创新奖论文选做的题目是 A 题: CT 系统参数标定及成像。该问题有 4 个子问题,普遍认为第一问最关键,我们就来看第一问的求解来了解甲组“MATLAB 创新奖”程序水平。

第一问是确定 CT 系统旋转中心在正方形托盘中的位置、探测器单元之间的距离以及该 CT 系统使用的 X 射线的 180 个方向。都是基础参数,为了求解这些参数,需要推导出参数间的解析关系,然后利用题目给定的数据得到参数的数值。这篇论文也是先给出了参数的方程形式,然后利用最小二乘原理建立求解参数的模型。接着利用 MATLAB 求解模型。前面的建模还没感觉到这个队的高明之处(这个问题的建模方面更多比的是数学的基本功,但在求解的时候就已经感受到“与众不同”了,先来看看他们的求解思路(以下摘自论文):

绝大多数的队都是直接求解,所以在求解思路上这个队的优势已经体现出来了。再来看 MATLAB 代码方面,他们第一问求解的程序主要有三个文件:一个是主 M 文件,一个是担当主要求解功能的自定义函数 calibArgu,还有一个是模型形式函数 detect。

主 M 文件比较简单,主要功能是让第一题的所要求解的主要参数通过一个函数全部返回,代码如下:

%% solve question1

load Fujian %加载附件数据

[ allArgu,mdl_1,mdl_2,mdlphi,mdl_3] = calibArgu(fujian2);

从主程序可以判断出,具体求解的主体程序在函数 calibArgu 中,其代码如下:

% main function for problem 1

function [allArgu,mdl_1,mdl_2, mdlphi,mdl_3] = calibArgu( data )

......

    b0 = [d0,x0,y0,mu,phi0];

    opts = statset('TolFun',1e-5);

    mdl_1 = fitnlm(xx,yy,@detect,b0,'Options',opts);

    beta = mdl_1.Coefficients.Estimate;

......

    mdl_2 =fitnlm(xx,yy,@detectArg,b0,'Options',opts);

......   

    mdl_3 =fitnlm(xx,yy,@detect,b0,'Options',opts);

......

还有一个文件就是函数 calibArgu 中,在使用 fitnlm 时用到的模型函数形式 detect(也即是参数的解析形式)。

从浙大团队求解问题 1 的代码中,可以看出他们对 MATLAB 使用水平,具体体现在以下几个方面:

  1. 整体的 MATLAB 代码很规范,有分节、有注释,注意缩进;

  2. 主程序和自定义函数架构设计合理,通过匿名函数形式实现了 fitnlm 函数中对表达形式比较复杂的外部函数 detect 的引用,简化了程序,也便于维护;

  3. 在调用 fitnlm 时,使用了 ['Options',opts],巧妙地通过设置函数属性的方式实现了优化和精度控制;

  4. 分三步逐步实现整个问题的求解,体现了对算法、问题、数据规模的理解和驾驭水平。

以上四点中,第四点最重要, MATLAB 创新奖是从国家一等奖中挑选,这个问题的建模不容易区分出层次,但求解思路就可以有明显的区分了。如果说前面三点锁定这个队是 MATLAB 创新奖论文(体现 MATLAB 使用水平),但第四点才是确定他们是国家一等奖的关键(体现建模和求解水平)。当然他们的关系不是孤立的,前面的三点可以帮助这个队想到第四点。这里也印证了上篇文章的观点,MATLAB 的使用水平可以反向促进建模和求解思路。

在看他们论文的时候发现他们在建模前用 MATLAB 做了一些分析工作,比如数据可视化,但没有找到这部分程序,应该是分析工作和求解程序分开了。其实也可以将有助于问题分析的程序放在主程序的前面,这样在程序中既可以体现建模思路,还便于维护程序。

比如在上面的主程序前加上数据可视化的代码,再用 MATLAB publish 功能(Publish 得到的结果既包含程序,也包含每节程序的执行结果,可以将产生的报告直接放入论文中,这样可以节省不少写论文的时间),就可以得到如下的程序和结果:

%% CUMCM2017A MATLAB程序

%% 参考2017CUMCMM甲组'MATLAB创新奖'程序,获奖人:黄璐哲、方天庆、帅青。

Data Visualization

clc, clear, close all
load fujian
figure
[M, N]=size(fujian1);
[X,Y] = meshgrid(1:1:N,1:1:M);
mesh(X,Y,fujian1);
xlabel('标定模板测量点横坐标编号');ylabel('标定模板测量点纵坐标编号');
zlabel('吸收率'); title('附件1可视化结果');
figure, image(fujian2);
xlabel('角度编号');ylabel('探测器序号');
title('附件2可视化结果');

solve question1

load fujian
[ allArgu,mdl_1,mdl_2,mdlphi,mdl_3] = calibArgu(fujian2);

加上分析等内容后, 可以使得整个程序结构更清晰, 也便于在答辩的时候演示程序。 当然这些都是锦上添花的内容,最重要的还是建模、求解、编程的真功夫!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何学习MATLAB
数学建模专栏 | 开篇:如何备战数学建模竞赛之 MATLAB 编程
基于matlab的同步发电机励磁系统仿真分析与
0 MATLAB简介
MATLAB中的S-Function的用法(C语言)
matlab关联m文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服