我有以下代码来解决一些常微分方程(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
答案 0 :(得分:1)
创建它时,x
的值被“硬连线”到匿名函数中。该函数在内部存储x
当时具有的值,并始终使用该值。对x
的后续更改对该功能没有影响。请参阅此示例from the documentation:
例如,为需要系数
a
,b
和c
的匿名函数创建函数句柄。
a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;
由于
a
,b
和c
在您创建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)));