我如何解决“索引超出数组元素数(1)”的错误?

问题描述 投票:0回答:2

我对Matlab还是相当陌生,并试图创建一个Matlab函数,该函数应用修改后的Euler方法来近似某个微分方程的解。当我在命令窗口中调用该函数时,出现以下错误:

Index exceeds the number of array elements (1).
Error in modified_euler2 (line 10)
y(i+1)=y(i)+0.5*(k1(i)+k2(i));

我正在这样调用函数,并使用以下输入:modified_euler2(60,1000,9.8,0.1125,1.125,25)

该功能的完整代码如下:

function output = modified_euler2(T,n,g,C,K,L)
f = @(v,y) (g - C*abs(v)*v -max(0, K*(y - L))); 
 h = T / n; 
t = 0:h:T;        
y = zeros(1,n+1); 
v = zeros(1,n+1);
k1 = zeros(1,n+1); 
k2 = zeros(1,n+1);
 for i = 1:n+1
  y(i+1)=y(i)+0.5*(k1(i)+k2(i));
  k1 = h*f(v(i),y(i));
  k2=h*f(v(i)+h,y(i)+k1(i));

 end
 output = t,y,v,h
 figure
 plot(y)
end

关于如何解决此错误的任何建议,将不胜感激。

matlab differential-equations
2个回答
0
投票

“索引超出数组元素的数量”表示您正在索引具有一定数量n的元素的数组,但是要求第m个元素,其中m>n。因此,如果您有矢量

x = [2 4 6]

然后是x(1)=2,但是您不能执行x(6),例如,因为x仅包含3个元素。

在您的情况下,Matlab在行中告诉您确切的错误位置

y(i+1)=y(i)+0.5*(k1(i)+k2(i))

您在这里进行了几次索引操作(y(i+1)y(i)k1(i)k2(i)),并且一个(或多个)正在引起错误。问题是您要索引的变量只有一个元素(Matlab告诉您),但是您要的是第i个(或第i+1个)元素,除非[ C0]。

因此,您需要确定哪些索引操作正在尝试访问不存在的元素。


1
投票

您的主要错误是您将浮点值分配给i=1而不是k1,k2。在下一步中,使用索引k1(i),k2(i)访问数组元素,修改后的i=2仍然是数字,Matlab似乎将其解释为长度为k的数组。您可以通过在循环开始时将1打印为调试输出来进行测试。

您的下一个问题是,您以错误的顺序执行了Heun方法的步骤。虽然它经常在教科书中找到,但这种传统可以追溯到Heun和Kutta,但要先打印下一个值的公式,然后详细说明阶段,在计算它们时,首先需要阶段,然后插入将其值添加到步骤公式中。

然后,另一个问题是您像对待时间一样对待i。但是,您有一个带有yv=y'的二阶方程。您可以将其视为向量值一阶系统,或者需要v'=y'' kv值。

y
© www.soinside.com 2019 - 2024. All rights reserved.