函数式编程构造
匿名函数非常强大的和有用的,我使用它们每当我想创建一个快速函数不需要编写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);传奇(“位置”,“速度”);
![](http://www.tatmou.com/blogs/images/pick/jiro/potw_functionalprogramming/potw_functionalprogramming_01.png)
那不是很好吗?我不需要写一个单独的文件或一个函数。我刚刚创建的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))));其他的%
,让我们解决。请注意,我传入两个参数,t0和F。
t0 = 15;%的力量应用于15秒F = 5;%外力(~ Y) =数值(@ (t, Y) odeFcnAnon (t、Y, t0, F), t, [0,1]);情节(T、Y);传奇(“位置”,“速度”);
![](http://www.tatmou.com/blogs/images/pick/jiro/potw_functionalprogramming/potw_functionalprogramming_02.png)
这是很酷。我能够为我的函数创建一个匿名函数,包含条件语句。
塔克有更多的功能,他写了一个详细的文档一步一步推导一些功能。这是编写良好的对于这样一个复杂的话题。我强烈推荐阅读它。
让我给更多的功能,我将离开休息你去探索。的一件事是不可能的,匿名函数是能够处理输出的功能。例如,在一个匿名函数,我不能够访问的第二输出函数,或索引的第一列输出。这是因为我不能有多个语句在一个匿名函数,如下:
@ 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”,没有任何力量的,…“位置”,“西北”)
![](http://www.tatmou.com/blogs/images/pick/jiro/potw_functionalprogramming/potw_functionalprogramming_03.png)
评论
我发现塔克的入口非常有教育意义。我学到了很多我不知道的技巧。如果你想有一些讨论这个话题,随时留言在这里或者你可以访问这篇文章在罗兰的博客,塔克的功能也会高亮显示。
- 类别:
- 选择
评论
留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。