Matlab 我如何修复一个";索引超过数组元素数(1)“;错误?

Matlab 我如何修复一个";索引超过数组元素数(1)“;错误?,matlab,differential-equations,Matlab,Differential Equations,我对Matlab相当陌生,尝试创建一个Matlab函数,该函数应用修改的Euler方法来近似某个微分方程的解。在命令窗口中调用函数时,我收到以下错误: 我使用以下输入调用函数,如下所示: modified_euler2(601000,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

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

我使用以下输入调用函数,如下所示:
modified_euler2(601000,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
-th元素,其中
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=0(1,n+1);
v=零(1,n+1);
对于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);
结束

感谢您的回复。我试图使用命令窗口强制该行中使用的每个变量具有合适的数组大小:y=zeros(1,n+1)v=zeros(1,n+1)k1=zeros(1,n+1)k2=zeros(1,n+1)。不幸的是,我在同一行中仍然得到完全相同的错误。为什么Matlab认为这些变量只有一个元素?我已经检查过了,当从工作区单击时,它们中的每一个都有正确数量的元素。我想知道这是否与所使用的语法有关。特别地,如果存在y(i+1)=以外的东西。。。我应该使用的。你也必须检查变量的值。例如,如果执行
x=zero(5,1)
,则以后的
x=4
x
将不再是1x4。@LucSC:更明确地说,请在第一次循环期间和之后检查这些变量的格式。
y(i+1)=y(i)+0.5*(k1(i)+k2(i))