开发区域

MATLAB高级软件开发

(构建)矩阵实验室

啊,新版本的乐趣!R2017b现在已经推出,并提供了一些很棒的新功能。所以我开始了,当我看到我的代码在新版本中被破坏时,我的快乐被粗鲁地打断了。

这对原本愉快的经历来说是多么大的损失啊!事实证明,这个错误是由于我的一些更“有创意”和“聪明”的编码实践,这些实践在过去帮助我完成了我的工作,当我深入研究时,我发现我已经被警告了几年关于这个变化。问题是我似乎从来没有时间像我想的那样仔细梳理发行说明,即使我意识到我5年前写的代码有上面提到的一些问题,这也是一个艰巨的任务。

为了解决这个问题,即使我想升级,但当我做出必要的调整时,我担心会影响到尚未升级的代码用户。

究竟该怎么办呢?

让我们使用一些连续积分!据我所知,我们仍负责这些机器,所以让我们好好利用它们吧。实际上,使用Jenkins很容易将其付诸实践。詹金斯支持这就是所谓的矩阵构建,这样我们就可以确保我们的代码可以在许多不同的MATLAB版本中工作。要设置此设置,只需在Jenkins中将项目创建为Multi-Configuration project。

一旦创建了这个项目,我们就有机会定义我们自己的配置矩阵。这意味着我们可以添加一个配置轴,我们可以在其中定义一个特定的系统属性(即环境变量)以及我们希望为每个这些值拥有的不同值。我想做的是添加MATLAB版本,并将其指向我想测试的几个版本,如下所示:

完成此操作后,Jenkins将为我们的构建创建多个配置,它将通过该值进行参数化。因此,当我们设置构建步骤时(我们将根据代码更改来运行测试),可以在构建脚本中利用这个值来确保在所有版本上都发生这种情况。例如,我们的构建脚本可以指向我想要测试的不同MATLAB版本的不同安装位置:

就这么简单!这给了我们什么?它为每个值提供了一个新的构建配置(实际上感觉像是一个新的构建)MATLAB_VERSION。为了了解这有什么帮助,让我们看一个简单的例子。这里我们有一个模拟质量弹簧阻尼器的源代码…

函数[x, t] = simulateSystem springMassDamperDesign;创建设计变量。如果~isstruct(design) || ~all(isfield(design,{“c”“k”}))错误(“simulateSystem: InvalidDesign: ShouldBeStruct”...“设计应该是一个包含字段“c”和“k”的结构”);结束%设计变量C = design.c;K = design.k;%常数变量Z0 = [-0.1;0);初始位置和速度M = 1500;%的质量Odefun = @(t,z) [0 1;- k / m - c / m] * z;[t, z] = ode45(odefun, [0,3], z0);第一列是位置(偏离平衡的位移)X = z(:, 1);

...以及根据弹簧刚度和阻尼定义系统设计的相应脚本:

M = 1500;%需要知道质量来确定临界阻尼设计。K = 5e6;%弹簧常数Design.c = 2*m*√(design.k/m);%临界阻尼系数清晰的

除了这个源代码,我们还有一个文件,定义了这个设计的几个测试,以确保它在可接受的超调和步进响应的稳定时间方面达到正确的特性:

函数tests = designTest tests = functiontests(localfunctions);结束函数testSettlingTime (testCase)测试系统在2秒内稳定在0的0.001范围内。[position, time] = simulateSystem;positionaftersettlement = position(时间> .002);对于本例,请在设置时间之后验证第一个值。verifyLessThan(testCase, abs(positionaftersettlement), 2);结束函数testOvershoot (testCase)测试以确保超调量小于0.01[position, time] = simulateSystem;超调=最大(位置);verifyLessThan(testCase, overshoot, 0.01);结束

最后,这是我们的测试运行脚本,将启动测试:

试一试导入(“matlab.unittest.TestRunner”);导入(“matlab.unittest.plugins.XMLPlugin”);导入(“matlab.unittest.plugins.ToFile”);Ws = getenv(“工作区”);SRC = fullfile(ws,“源”);目录(src);测试= fullfile(ws,“测试”);套件=测试套件(测试);创建并配置运行器运行器= testrrunner . withtextoutput (“冗长”3);为测试结果添加插件resultsDir = fullfile(ws,“检测结果”);mkdir (resultsDir);resultsFile = fullfile(resultsDir,“testResults.xml”);runner.addPlugin (XMLPlugin.producingJUnitFormat (resultsFile));Results = run .run(suite)e disp (getReport (e,“扩展”));退出(1);结束辞职(“力”);

有了这个设置,你可以看到每个构建实际上给了我们四种不同的配置,所以我们测试了所有版本。

在这里,我们可以看到我们可以升级到R2017b。这样能让你安心吗?信任您的测试可以让您毫无顾虑地升级所需的信心和/或在需要进行调整时迅速得到通知。

现在让我们改进代码。我不是设计脚本的最大粉丝,因为它冒犯了我的感情清晰的米打电话给他们。我想改变这个实现:

M = 1500;%需要知道质量来确定临界阻尼设计。K = 5e6;%弹簧常数Design.c = 2*m*√(design.k/m);%临界阻尼系数清晰的

...:

设计。K = 5e6;%弹簧常数design.c = 2*getMass*sqrt(design.k/getMass);%临界阻尼系数函数m = getMass m = 1500;%需要知道质量来确定临界阻尼结束

我觉得这样比较干净。我宁愿利用脚本中的局部函数,这样我们想要清除的变量就永远不会在工作区中创建。

但是,检查这个变化会产生以下结果:

在R2016a中,脚本中的局部函数似乎还没有出现,所以我将不得不等待这种变化,直到我不再需要在该版本中支持我的代码。谢谢,构建矩阵!




发布与MATLAB®R2017b

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map