我有一个简单的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函数?或者它可以完成,并且使用循环更好吗?
答案 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等工具来改善算法的行为。记忆只是意味着不重新计算你已经完成的事情。例如,可以对斐波那契序列使用递归,但这是一种非常低效的方法。