对于要参加 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 使用水平,具体体现在以下几个方面:
整体的 MATLAB 代码很规范,有分节、有注释,注意缩进;
主程序和自定义函数架构设计合理,通过匿名函数形式实现了 fitnlm 函数中对表达形式比较复杂的外部函数 detect 的引用,简化了程序,也便于维护;
在调用 fitnlm 时,使用了 ['Options',opts],巧妙地通过设置函数属性的方式实现了优化和精度控制;
分三步逐步实现整个问题的求解,体现了对算法、问题、数据规模的理解和驾驭水平。
以上四点中,第四点最重要, 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);
加上分析等内容后, 可以使得整个程序结构更清晰, 也便于在答辩的时候演示程序。 当然这些都是锦上添花的内容,最重要的还是建模、求解、编程的真功夫!
联系客服