MATLAB中等长向量的生成

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)

我现在不明白为什么在这段代码中向量的长度为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循环在函数
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
会更容易。但我的也很管用,而且怪异是主观的。