我会指出一些问题,然后建议这样做的更简单。
从循环中的第一个行开始:
k1 = func1(i(i),s(i));
k2 = feval(func1, I(I)+(k1/2),S(I)+(k1/2));
FUNC1是DS / DT,因此S(i)+(K1 / 2)部分是正确的(几乎)。但我(i)+(k1/2)部分是
不是
正确,因为K1是DS / DT,它应该是此部分的DI / DT。你错过了h。也就是说,这些行应该看起来像这样:
k1 = func1(i(i),s(i));%ds / dt在t处
m1 = feval(func3, E(i), i (i));%di / dt在t
k2 = feval(func1, I(I)+(m1/2)*h,S(I)+(k1/2)*h);T + H / 2的%ds / dt
您的代码剩余有类似的问题。您需要首先评估所有K1,L1,M1,N1术语。然后使用这些来评估所有K2,L2,M2,N2术语。等等。不要在计算中混合K,L,M,N变量。k与s's一起去,我和我一起去,我和他一起去了。并且您需要在这些计算中包含H.
已经说明了这一切,如果你的一切繁拟,那么写入的代码会更容易和更少的代码,然后为衍生函数和RK4代码编写矢量方程。这样你就不必复制所有RK4的东西。例如,定义Y矢量
y (1) = S
Y(2)= e
y(3)=我
Y(4)= r
然后写
一
一个求导函数,以4个元素的y作为输入,返回4个元素的dy/dt作为输出。这样,您只需要一组RK4代码,而不是四组。以这种方式编码的另一个好处是,您可以直接将函数句柄和初始条件传递给ode45()函数,以再次检查您的答案。