簡體   English   中英

如何在 MATLAB 中正確使用遞歸?

[英]How do I correctly use Recursion in MATLAB?

我有一個簡單的 m 文件,我將其創建為遞歸 function:

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 function? 還是可以做到,用循環是不是更好?

雖然我的答案會偏離編程並進入微積分領域,但應該注意的是,你可以在沒有遞歸循環的情況下解決你的問題,因為你可以使用積分精確求解方程v(t) 看來,你模擬斯托克斯拖上落體,這樣你就可以使用第四公式從這個積算表計算的最終速度vFinal是連續下跌一段時間后達到tDelta給出起始速度vInitial 以下是您得到的公式:

vFinal = 9.8*m/c + (vInitial - 9.8*m/c)*exp(-c*tDelta/m);

通過及時推進順序步驟(即歐拉方法 ,當所采用的時間步長太大時,可以顯示重大錯誤或不穩定性),這將是比近似vFinal更准確的答案。

忍受我,一段時間沒有做過很多Matlab。

但我只是迭代地調用你的函數:

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

然后對於t的每個實例,它將計算給定初始速度的速度,並用它的新速度更新該值。

要讓它采用大小為2的增量步驟, 只需將步長添加到它即可。

更新以回應評論

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

應該管用。

這里遞歸的問題是它每次都會增加函數調用開銷。 這將使你的代碼在matlab中變得更慢,效率更低。 使用循環代替你將遠遠領先於事物。 是的,有些情況下遞歸是一種有價值的工具。 但在許多情況下,精心編寫的循環是更好的解決方案。

最后,當您使用遞歸時,了解何時應用memoization等工具來改進算法的行為。 記憶只是意味着不重新計算你已經完成的事情。 例如,可以對斐波那契序列使用遞歸,但這是一種非常低效的方法。

function 的返回值是velocity Matlab 將返回分配給 function 主體中速度的最后一個值。 即使velocity被分配到遞歸的更深處,這對 Matlab 也沒有關系。下一次調用terminal()時的velocity是一個不同的變量!

將最后一行更改為

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
velocity = terminal(m,c,t+2,velocity);
end

給出預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM