本周文件交换精选

我们最好的用户提交

函数式编程构造

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

匿名函数非常强大和有用,每当我想创建一个快速函数而不需要编写MATLAB文件时,我都会使用它们。对我来说,这是我越用越喜欢的功能之一。罗兰写了这篇文章她也在其他帖子中讨论过这个话题。

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

我们通过传递一阶微分方程组的形式来求解ODE

一个二阶微分方程变成一个由两个一阶微分方程组成的方程组。

函数y = [y(2)];-1/m * (k * y(1) + b * y(2))];结束

然后你可以像这样解方程组(在定义之后kb,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] = ode45(odeFcnAnon, T, [0,1]);情节(T、Y);传奇(“位置”“速度”);

那不是很好吗?我不需要写一个单独的文件或函数。我只是“动态地”创建了ODE函数。然而,我不能创造任何功能在飞行中。一个匿名函数只能包含一个可执行语句,也就是说,我不能有多个语句或流控制命令如果

好吧,那太糟糕了!我想让我的阻尼振荡器,通过在某一时刻加上一个外力,表现得有点不同。为了做到这一点,我的ODE函数看起来像这样:

函数y = 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))];结束结束

这肯定不止一个表述。我怎么可能用匿名函数做到这一点呢?我唯一的选择是写一个单独的函数吗?...

不了!我的同事塔克来救我了!他已经为流控制命令创建了许多函数,以及在匿名函数中辅助使用的其他函数。例如,他有一个函数国际金融协会的功能形式如果

if(,…),…< >, <, >);

让我们看看ODE匿名函数是什么样的。

odeFcnAnon = @(t, y, t0, F) iif(...@() [y(2);1 / m * (k * y (1) + b * y (2) - f)),...% t + t % tTrue, @() [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);传奇(“位置”“速度”);

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

塔克的功能还有很多,他还写了详细的文档一步一步地推导出这些函数。对于这样一个复杂的话题,这篇文章写得很好。我强烈建议你通读一下。

让我再展示几个函数,剩下的就让您自己去探索。匿名函数不可能处理函数的输出。例如,在一个匿名函数中,我不能访问函数的第二个输出,也不能索引到输出的第一列。这是因为我不能在一个匿名函数中有多个语句,像这样:

@() [var1, var2] = myFunction;

为此,塔克创造了输出括弧.让我们创建一个匿名函数来解ODE,提取位置向量,并绘制它。

@(t0, F) plot(T, F)...括弧(...输出(...@()数值(@ (t, y) odeFcnAnon (t、y, t0, F), t, [0,1]),...2),...从ODE45 - 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帐户或创建一个新帐户。