【问题标题】:Evaluate Equation in Cell Array, MATLAB计算元胞数组中的方程,MATLAB
【发布时间】:2014-06-15 22:20:45
【问题描述】:

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

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 哪一行导致了错误?请通过添加打印语句左右自己进行一些初始调试。

标签: matlab cell-array differential-equations


【解决方案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 中,如果数组是单元格类型,那么我们使用 {} 来访问元素。对于所有其他数组,我们使用() 括号。

【讨论】:

    【解决方案2】:

    首先,您的代码还有两个问题:c 未定义,您尝试使用[]-brackets 对init 进行索引,这将抛出:

    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
    

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多