我有一个包含函数的单元格数组(带有函数句柄),我想在for循环中评估它们。我想评估微分方程: x1' = x2, X2' = ax2-bx1
我的代码是这样的:
init = [0,0];
F = {@(x1,x2) x2,@(x1,x2)(a*x2-b*x1)};
X0 = init;
for i=1:10
X = X0 + c*F(init(1),init(2));
X0 = X;
init[1] = {X(1)};
init[2] = {X(2)};
end
给出常数a,b和c。
我收到错误:
Subscript indices must either be real positive integers or logicals.
有人可以帮我这个吗?
答案 0 :(得分:1)
F
是1x2单元格数组。要访问此数组中的元素(在您的情况下,函数句柄),您必须使用花括号{}
来执行此操作。例如,第一个函数由F{1}
检索,第二个函数由F{2}
使用正整数索引检索。
在您的示例中,init
是1x2的零数组,因此在代码评估时
F(init(1),init(2));
它正在尝试使用不正数的索引访问F
内的内容。因此错误。
我怀疑您需要在for
循环中执行以下操作,并单独评估每个功能
for i=1:10
for j=1:2
% get the jth function handle
func = F{j};
% evaluate
X(j) = X0(j) + c*func(init(1),init(2));
% save
end
end
我已将 save * 部分留给您填写,因为我不清楚为什么会有不同的init
,X0
和X
变量 - 你能合并它们吗?
在访问数组时,请注意[]
和()
括号的混合。在MATLAB中,如果数组是cell类型,那么我们使用{}
来访问元素。对于所有其他数组,我们使用()
括号。
答案 1 :(得分:0)
首先,您的代码还有另外两个问题:c
未定义,您尝试使用init
- []
进行索引,这将抛出:< / p>
Error: File: foo Line: 8 Column: 8
Unbalanced or unexpected parenthesis or bracket.
发生下标错误是因为您尝试访问F(0,0)
,因为init(1)
和init(2)
是0
。请记住你声明F的方式,它是一个单元格数组:
>> F = {@(x1,x2) x2,@(x1,x2)(a*x2-b*x1)};
>> whos F
Name Size Bytes Class Attributes
F 1x2 288 cell
因此,F(0,0)
是非法的,因为matlab中的索引以1
开头。您的功能位于F{1}
和F{2}
。
>> F{1}
ans =
@(x1,x2)x2
>> F{2}
ans =
@(x1,x2)(a*x2-b*x1)
>> f = F{1}
f =
@(x1,x2)x2
>> f(0,0)
ans =
0