MATLAB中等长向量的生成
我现在不明白为什么在这段代码中向量的长度为1。当我检查两个长度时,我的Y向量总是一个。尽管我想我特别设定了向量t的精确长度。有什么建议吗MATLAB中等长向量的生成,matlab,Matlab,我现在不明白为什么在这段代码中向量的长度为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)
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循环在函数runge_kutta
中的索引length(t)+1
处向Y添加一个值,for循环从1变为length(t)
,但是您使用i+1
索引Y
,因此当i=length(t)
时,for循环在索引length(t)+1
处向Y
追加一个值
请参阅,在具有指定输入值的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
我不知道龙格-库塔法,但是如果你想让你的t
和Y
始终保持相同的长度,有很多方法可以根据你想要实现的目标来实现。如果要删除Y
的最后一个元素,可以在第16行和第17行之间插入如下内容:
if i == length(t)
break
end
这将在for循环的最后一次迭代中将额外元素添加到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
我不知道龙格-库塔法,但是如果你想让你的t
和Y
始终保持相同的长度,有很多方法可以根据你想要实现的目标来实现。如果要删除Y
的最后一个元素,可以在第16行和第17行之间插入如下内容:
if i == length(t)
break
end
这将在for循环的最后一次迭代中将额外元素添加到Y
之前终止循环。奇怪的想法,在循环中添加条件。为什么不建议在1:length(t)-1上循环?或者更好的是,像往常一样,超过2:length(t)
,并将索引更改为在循环中使用i-1
和i
。我想对于同一问题可以有很多解决方案:-)我承认使用1:length(t)-1
会更容易。我的也可以,奇怪是主观的。奇怪的想法,在循环中添加条件。为什么不建议在1:length(t)-1上循环?或者更好的是,像往常一样,超过2:length(t)
,并将索引更改为在循环中使用i-1
和i
。我想对于同一问题可以有很多解决方案:-)我承认使用1:length(t)-1
会更容易。但我的也很管用,而且怪异是主观的。