我对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
关于如何解决此错误的任何建议,将不胜感激。
“索引超出数组元素的数量”表示您正在索引具有一定数量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]。
因此,您需要确定哪些索引操作正在尝试访问不存在的元素。
您的主要错误是您将浮点值分配给i=1
而不是k1,k2
。在下一步中,使用索引k1(i),k2(i)
访问数组元素,修改后的i=2
仍然是数字,Matlab似乎将其解释为长度为k
的数组。您可以通过在循环开始时将1
打印为调试输出来进行测试。
您的下一个问题是,您以错误的顺序执行了Heun方法的步骤。虽然它经常在教科书中找到,但这种传统可以追溯到Heun和Kutta,但要先打印下一个值的公式,然后详细说明阶段,在计算它们时,首先需要阶段,然后插入将其值添加到步骤公式中。
然后,另一个问题是您像对待时间一样对待i
。但是,您有一个带有y
和v=y'
的二阶方程。您可以将其视为向量值一阶系统,或者需要v'=y''
和 k
的v
值。
y