文件交换的选择

我们最好的用户提交

函数式编程构造

汪东城本周的选择函数式编程构造通过麦克卢尔塔克

匿名函数非常强大的和有用的,我使用它们每当我想创建一个快速函数不需要编写MATLAB文件。对我来说,这是其中一个特性我使用得越多,我越升值。罗兰写了这篇文章在匿名函数,她已经在其他文章的主题讨论。

对于那些不熟悉匿名函数,让我给你一个简单的例子。利用我的机械工程背景,让我们模拟一个阻尼谐振子通过求解二阶微分方程数值数值

我们解决ODE通过一阶微分方程组的形式

一个二阶微分方程变成了一分之二阶微分方程组。

函数dY = odeFcn (t、y、m k, b) dY = [y (2);1 / m * (k * y (1) + b * y (2)));结束

然后你可以解决这样的系统(在定义,k,b,T):

(~ Y) =数值(@ (t, Y) odeFcn (t、Y、m k, b), t, [0,1]);

很简单。然而,而不是创建一个单独的函数文件odeFcn,我可以创建一个匿名函数。我可以这样做,因为这是一个简单的,一个语句的功能。

%定义质量、弹簧刚度和阻尼m = 5;k = 5;b = 1;%为阻尼谐振子创建匿名函数odeFcnAnon = @ (t、y) [y (2);1 / m * (k * y (1) + b * y (2)));

现在,我们可以通过函数处理(匿名函数)odeFcnAnon数值:

%定义时间向量T = 0:0.1:25;%解决(~ Y) =数值(odeFcnAnon T [0,1]);情节(T、Y);传奇(“位置”,“速度”);

那不是很好吗?我不需要写一个单独的文件或一个函数。我刚刚创建的ODE函数“动态”。然而,我无法创建任何动态函数。一个匿名函数只能包含一个可执行语句,例如我不能有多个语句或流控制命令如果

这是一个游手好闲的人!我想让dampled振荡器表现稍有不同通过添加外部力量在特定的时间。要做到这一点,我歌唱函数会看起来像这样:

函数dY = odeFcn (t、y、m k b t0, F)如果t > t0%又一次t0,应用力FdY = [y (2);1 / m * (k * y (1) + b * y (2) - F)];其他的dY = [y (2);1 / m * (k * y (1) + b * y (2)));结束结束

这当然有不止一个声明。我怎么可能和一个匿名函数做这个吗?是我唯一的选择写一个单独的功能? ?…

不了!我的同事,塔克来救援!他创造了一个流量控制命令的功能,以及其他助手在使用匿名函数的函数。例如,他有一个函数国际金融协会的函数形式如果

国际金融协会(<如果这>,<,>…<其他如果这>,<,>,……其他< >,<,>);

让我们看看我们的颂歌匿名函数的样子。

odeFcnAnon = @ (t y t0, F)国际(t > t0, @ () [y (2);1 / m * (k * y (1) + b * y (2) - f)),%如果t > t0真的,@ ()[y (2);1 / m * (k * y (1) + b * y (2))));其他的%

,让我们解决。请注意,我传入两个参数,t0F

t0 = 15;%的力量应用于15秒F = 5;%外力(~ Y) =数值(@ (t, Y) odeFcnAnon (t、Y, t0, F), t, [0,1]);情节(T、Y);传奇(“位置”,“速度”);

这是很酷。我能够为我的函数创建一个匿名函数,包含条件语句。

塔克有更多的功能,他写了一个详细的文档一步一步推导一些功能。这是编写良好的对于这样一个复杂的话题。我强烈推荐阅读它。

让我给更多的功能,我将离开休息你去探索。的一件事是不可能的,匿名函数是能够处理输出的功能。例如,在一个匿名函数,我不能够访问的第二输出函数,或索引的第一列输出。这是因为我不能有多个语句在一个匿名函数,如下:

@ myFunction () [var1 var2] =; var2 (: 1)

为此,塔克输出括弧。让我们创建一个匿名函数,解决ODE,提取位置矢量和阴谋。

plotODEFcn = @ (t0, F)情节(T)括弧(输出(@()数值(@ (t, y) odeFcnAnon (t、y, t0, F), t, [0,1]),2),%得到第二输出数值- Y“:”1));%得到的第一列Y - Y (: 1)

有点困惑?别担心。我也很困惑。如果你读了塔克的文档,你会得到一个更好的理解。

现在,我们可以很容易地创建多个情节与不同的强制条件。

图;持有所有;plotODEFcn (15、5);% 5的力量在15秒plotODEFcn (10、5);% 5在10秒plotODEFcn (20、10);% 10在20秒plotODEFcn (5,2);%的2 5秒plotODEFcn (0,0);%没有外力包含(“时间”);ylabel (“位置”);传奇(“t0 = 15, F = 5”,“t0 = 10, F = 5”,“t0 = 20, F = 10”,“t0 = 5, F = 2”,没有任何力量的,“位置”,“西北”)

评论

我发现塔克的入口非常有教育意义。我学到了很多我不知道的技巧。如果你想有一些讨论这个话题,随时留言在这里或者你可以访问这篇文章在罗兰的博客,塔克的功能也会高亮显示。




发表与MATLAB®R2012b

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。