如何修复 "Index exceeds the number of array elements (1)" 错误?

How do I fix an "Index exceeds the number of array elements (1)" error?

我是 Matlab 的新手,我正在尝试创建一个 Matlab 函数,该函数应用修改后的欧拉方法来逼近某个微分方程的解。当我在命令 window 中调用函数时,我收到以下错误:

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

如有任何关于如何修复此错误的建议,我们将不胜感激。

"Index exceeds the number of array elements" 表示您正在索引一个包含 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-th(或 i+1-th)元素,它不能除非 i=1.

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

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

您的下一个问题是您以错误的顺序执行 Heun 方法的步骤。虽然它经常出现在教科书中,但可以追溯到 Heun 和 Kutta 的传统,即先打印下一个值的公式,然后打印阶段的详细信息,在计算它们时,您需要先打印阶段然后插入他们的价值进入步骤公式。

那么还有一个问题就是你把y当成了时间。但是,您有一个二阶方程,其中 v=y'v'=y''。您可以将其视为向量值一阶系统,或者您需要 v y.

k
y = zeros(1,n+1); 
v = zeros(1,n+1);
for i = 1:n
  k1y = h*v(i);
  k1v = h*f(v(i),y(i));
  k2y = h*(v(i)+k1v)
  k2v = h*f(v(i)+k1v,y(i)+k1y);
  y(i+1)=y(i)+0.5*(k1y+k2y);
  v(i+1)=v(i)+0.5*(k1v+k2v);
end