评估单元阵列中的方程式,MATLAB

时间:2014-06-15 13:52:16

标签: matlab cell-array differential-equations

我有一个包含函数的单元格数组(带有函数句柄),我想在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.

有人可以帮我这个吗?

2 个答案:

答案 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 * 部分留给您填写,因为我不清楚为什么会有不同的initX0X变量 - 你能合并它们吗?

在访问数组时,请注意[]()括号的混合。在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