如何在MATLAB中正确使用Recursion?

时间:2011-01-21 15:25:57

标签: recursion matlab

我有一个简单的m文件,我已经创建了一个递归函数:

function[velocity] = terminal(m,c,t,vi)
%inputs:
% m = mass
% c = coeffcient of drag
% t = time
% vi = initial velocity

if t==18, velocity = vi+(9.8-c/m*(vi))*2;
    return 
end

velocity = vi+(9.8-c/m*(vi))*2;
velocity  %used to print out velocity for debugging
terminal(m,c,t+2,velocity);
end

正确地计算速度,因为它打印出每次递归。但是,最后返回的“ans”是递归的第一个计算值。我的问题是如何递归地正确设置matlab函数?或者它可以完成,并且使用循环更好吗?

4 个答案:

答案 0 :(得分:6)

虽然我的答案会偏离编程并进入微积分领域,但应该注意的是,你可以在没有递归循环的情况下解决你的问题,因为你可以完全使用积分求解方程v(t)。您似乎正在对坠落的身体进行Stokes' drag建模,因此您可以使用fourth formula from this integration table计算最终速度vFinal,该最终速度tDelta在给定vInitial下降后达到起始速度vFinal = 9.8*m/c + (vInitial - 9.8*m/c)*exp(-c*tDelta/m); 。以下是您得到的公式:

vFinal

通过及时推进顺序步骤(即Euler method,这将是一个更准确的答案,而不是接近{{1}},当所采用的时间步长太大时,这会显示重大错误或不稳定性)。

答案 1 :(得分:4)

忍受我,暂时没有做过很多Matlab。

但我只是迭代地调用你的函数:

velocity = vi
for t = 0:2:18
    velocity = velocity+(9.8-c/m*(velocity))*2;
end

然后对于t的每个实例,它将计算给定初始速度的速度,并用它的新速度更新该值。

要使用大小为2的增量步骤,simply add your step size to it.

更新以回应评论

答案 2 :(得分:1)

velocity = terminal(m,c,t+2,velocity)

应该有用。

答案 3 :(得分:1)

这里递归的问题是它每次都会增加函数调用开销。这将使你的代码在matlab中变得更慢,效率更低。使用循环代替你将远远领先于事物。是的,有些情况下递归是一种有价值的工具。但在许多情况下,精心编写的循环是更好的解决方案。

最后,当你使用递归时,学习何时应用memoization等工具来改善算法的行为。记忆只是意味着不重新计算你已经完成的事情。例如,可以对斐波那契序列使用递归,但这是一种非常低效的方法。