2009-06-02 46 views
1

好的。所以我在MatLab中有兩個互相調用的函數。MatLab遞歸錯誤(初學者)

Riemann.m

function I = Riemann(f, dx, a, b) 
    x = a:dx:b; 
    fx = f(x).*dx; 
    I = sum(fx); 

和myfunc.m

function f = myfunc(x) 
    f = sin(1./x); 
    for n=1:100 
     I = Riemann(@myfunc, 0.001, 1/n, 1); 
    end 
    plot(I) 

的問題越來越即運行。我如何調用myfunc來獲取任何東西。我試過的所有東西都以無窮遞歸調用堆棧結束(這是有道理的)。

+0

問題不在於Matlab,而在於函數本身。你可以用僞代碼重新編寫它們作爲數學函數嗎,所以我們可以看到你想要完成什麼? – rodion 2009-06-02 10:28:13

回答

4

你的問題是你的函數的定義:爲了能夠使用遞歸定義,你必須必須至少能夠計算兩個函數中的至少一個函數,至少對於某些值。您必須必須也確保每一個計算將最終依靠這些結果,你可以不遞歸遞歸。

對於你的具體問題,我有你想要整合函數f(x)= sin(1./x)的感覺。如果是這樣,你的第二個函數的代碼應爲:

function f = myfunc(x) 
    fct = @(x) sin(1./x); 
    f = fct(x); 
    for n=1:100 
     I = Riemann(fct, 0.001, 1/n, 1); 
    end 
    plot(I) 
+0

謝謝。這是做到這一點的方法。同樣,將for循環從myfunc.m中分離出來將解決這個問題。這麼簡單的事情。 – 2009-06-02 11:21:50

0

當myFunc停止調用Riemann時,您需要輸入x的最終條件。另外發送實際函數(在這種情況下罪)黎曼是一個比調用myFunc更好的主意。

0

函數myfunc不會在f = sin(1./x);之後結束。終止那裏的功能並從別處調用繪圖代碼(單獨的文件)。

手冊: 您可以用結束語句終止任何函數,但在大多數情況下,這是可選的。只有在使用一個或多個嵌套函數的M文件中才需要結束語句。在這樣一個M文件中,每個函數(包括主函數,嵌套函數,私有函數和子函數)都必須以結束語句結束。您可以用end來終止任何函數類型,但除非M文件包含嵌套函數,否則不需要這樣做。