具有更改数组大小的匿名函数

时间:2014-12-31 02:34:44

标签: matlab function anonymous-function

我有以下代码来解决一些常微分方程(ODE)。为了减轻在for循环的每次迭代中输入长表达式的负担,我决定定义anonymous function。当我在初始化 x 向量之前定义匿名函数时,它发现了一个错误,因为它在计算中使用了向量 x 的元素。匿名函数如下:

fnc = @(i) (-100 * (x(i) - cos(h * t(i))) - sin(h * t(i)));

为了解决这个问题,我事先将x的所有元素初始化为零,以避免它抱怨如下:

Undefined function 'x' for input
arguments of type 'double'.

然而,根据我放置匿名函数的位置,它最终弄乱了解决方案。这种行为可能是什么原因?我的代码可以在下面找到,你可以看到注释掉的区域,看看我试图实现匿名函数的位置。

close all;
clear all;
clc;
t_s = 0; % Starting time 
t_f = 1; % Finishing time
h = 0.2; % Time step 
t = t_s:h:t_f;
N = (t_f - t_s) / h; % Number of time steps (excluding initial points)
% x = zeros(1, N + 1);
fnc = @(i) (-100 * (x(i) - cos(h * t(i))) - sin(h * t(i)));
x(1) = 1; % Initial condition given in the problem
x(2) = x(1) + h * fnc(1);
for in = 3:N+1
%    fnc = @(i) (-100 * (x(i) - cos(h * t(i))) - sin(h * t(i)));
   x(in) =  x(in - 1) + (3 / 2) * h * fnc(in - 1) + (-1 / 2) * h * fnc(in - 2); 
end

1 个答案:

答案 0 :(得分:1)

创建它时,x的值被“硬连线”到匿名函数中。该函数在内部存储x当时具有的值,并始终使用该值。对x的后续更改对该功能没有影响。请参阅此示例from the documentation

  

例如,为需要系数abc的匿名函数创建函数句柄。

     

a = 1.3;
  b = .2;
  c = 30;
  parabola = @(x) a*x.^2 + b*x + c;

     

由于abc在您创建parabola时可用,因此函数句柄包含这些值。即使清除变量,值仍会保留在函数句柄中:

     

clear a b c
  x = 1;
  y = parabola(x)
  y =
  31.5000

您可以使用functions检查函数存储的值。例如:

>> x = [1 2 3 4];
>> fnc = @(i) (-100 * (x(i) - cos(h * t(i))) - sin(h * t(i)));
>> f = functions(fnc)
f = 
     function: '@(i)(-100*(x(i)-cos(h*t(i)))-sin(h*t(i)))'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}
>> f.workspace{1}
ans = 
    x: [1 2 3 4]

如果您需要依赖x的功能,请将x作为附加输入(并且每次都使用所需的x调用该函数):

fnc = @(i,x) (-100 * (x(i) - cos(h * t(i))) - sin(h * t(i)));