如何修复 "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
我是 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