我目前很困惑,为什么在这段代码中,我的向量的长度偏离了1。当我检查这两个长度时,我的Y向量总是一个。尽管我认为我特别将其设置为向量t的确切长度。有什么建议吗?
func = @(y,t) y*sin(t);
for i = [1/4,1/8,1/16,1/32,1/64]
[Y,t] = runge_kutta(-1,1,i,func);
disp(length(Y));
disp(length(t));
end
function [Y,t] = runge_kutta(y0,T,dt,f)
t = 0:dt:T;
Y = zeros(1,length(t));
Y(1) = y0;
for i = 1:length(t)
k_1 = f(t(i),Y(i));
k_2 = f(t(i)+0.5*dt,Y(i)+0.5*dt*k_1);
k_3 = f((t(i)+0.5*dt),(Y(i)+0.5*dt*k_2));
k_4 = f((t(i)+dt),(Y(i)+k_3*dt));
Y(i+1) = Y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*dt;
end
end
在函数runge_kutta
中,for循环从1到length(t)
,但您使用i+1
对Y
进行索引,因此当i=length(t)
时,for循环会在索引length(t)+1
处向Y
添加一个值。
关键是代码的第17行。
请参阅,在具有指定输入值的runge_kutta函数中,t
是1x5向量。然后,您输入for循环,在i=2、i=3、i=4和最后i=5的值上循环。当循环到达第17行时,即i = 5
,通过运行Y(i+1) = Y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*dt;
,您将向Y向量添加一个额外元素,因此您的Y
现在是1x6。
我不知道runge-kutta方法,但如果你想让你的t
和Y
总是有相同的长度,有很多方法可以根据你想要实现的目标来实现。如果你想去掉Y
的最后一个元素,你可以在第16行和第17行之间插入一些东西,看起来像这样:
if i == length(t)
break
end
这将在for循环的最后一次迭代中将额外元素添加到Y
之前终止循环。