【问题标题】:Why do I keep getting an error that array indices must be positive?为什么我不断收到数组索引必须为正的错误?
【发布时间】:2019-11-20 20:19:22
【问题描述】:

它说 diff 函数位置 1 的索引必须是正整数或逻辑值,所以为什么会出现此错误?我正在尝试在 MATLAB 中实现基本的欧拉方法

y=zeros(1,6);
h=0;
x(1)= 0;
y(1)= 0;
i=1;
diff(y,x)= x+y
    while h<=1
    y(i+1)=y(i) + h*f(x(i))
    h=h+0.2;
    i=i+1;
    end

编辑:将其更改为下面的代码,但它仍然在 y(i+1)= 行中引发相同的错误...

y=zeros(1,6);
x=zeros(1,6);
h=0;
i=1;
g=x+y;
    while h<=1
    y(i+1)=y(i) + h*g(x(i),y(i));
    h=h+0.2;
    i=i+1;
    end

【问题讨论】:

  • 这看起来不像一个合适的 MATLAB 程序。 x 是什么? y? f? diff 是什么?你想定义它吗?
  • 我试图写 dy/dx 等于 x+y 但我认为它不起作用,所以我现在将其更改为随机变量。我稍微更改了代码,但我仍然收到相同的错误,但现在以 y(i+1) 开头的行。我已经编辑了帖子以显示新代码。
  • 您认为fg 是函数吗?他们不是。除非您将它们定义为函数,否则它们是变量,x(i) 是该变量(数组)的索引。

标签: arrays matlab indexing


【解决方案1】:

方法:我建议定义一个anonymous function

diffh =@(x,y) x + y;             % define this prior to use

稍后在循环中使用。 然后换一行

y(ii+1)=y(ii) + h*diffh(x(ii),y(ii));

应该可以。作为惯例,我在末尾添加了“h”,以提醒我这是一个匿名函数(请参阅末尾的注释)。

% MATLAB R2019a
y = zeros(1,6);
x = zeros(1,6);
h=0;
ii=1;
diffh =@(x,y) x + y;
while h <= 1
    y(ii+1)=y(ii) + h*diffh(x(ii),y(ii));
    x(ii+1) = x(ii)+h;
    h=h+0.2;
    ii=ii+1;
end

旁注:我还按照约定将索引 i 更改为 ii(尽管 MATLAB 不需要这样做)。除非您覆盖它们的值,否则ij 默认为sqrt(-1)。您绝对可以毫无问题地将它们用作索引(前提是您以后不需要复数或虚数)。为了确保这永远不会成为问题,许多人只是使用iijj 作为保留默认值的约定。


请注意,diff 本身就是一个 MATLAB 函数。

【讨论】:

  • 试过了,但现在我在“索引超过数组元素的数量”的第 y(ii+1) 行遇到了不同的错误。我不明白为什么它会返回它,因为它应该自动在数组中创建一个新元素来分配值,不是吗?
  • @user552217 y 的最终预期输出是什么?代码为我运行而没有错误(请参阅发布的完整代码以进行澄清)。你在重新运行之前clear h ii x y了吗?
  • 我刚刚复制并粘贴了您的代码(并且我清除了工作区)并且代码运行但它只是返回 y= [0 0 0 0 0 0 0 ]。只有前两个元素应为 0(初始 y 为 0,第二个 y 返回为 0),但元素 3 应为 0.04,元素 4 为 0.128,然后为 0.2736,最后一个元素为 0.48832。我已经手动验证了这一点,我的讲义也有这个答案。知道为什么您的代码没有给出正确答案吗?
  • 那么代码肯定有逻辑错误!必须运行,但稍后会检查。我得看看欧拉的方法才能看出错误。
  • @user552217 为什么会是0.040 + 0.2*0 仍然是 0。跟踪您的代码。 y 永远不会改变。
【解决方案2】:

在 Matlab 中使用i 作为索引通常不是一个好主意,因为i 也是虚数。或许换个名字就能解决问题。

【讨论】:

  • 尝试使用不同的变量但仍然无效:/
  • MATLAB 可以使用 i 作为索引(尽管它不是首选)。这不会导致错误(这很容易通过一个简单的循环来验证)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2017-05-07
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多