2009-06-02 25 views
1

だから私はお互いを呼び出すMatLabの2つの機能を持っています。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

答えて

4

あなたの問題は、あなたの関数の定義である:再帰的な定義で作業できるようにするには、あなたが少なくともいくつかの値のために、他のせずに2つの機能のうちの少なくとも一方を計算することができなければなりません。 でなければなりません。すべての計算が再帰なしで得ることができるこれらの結果に依存することを確実にしてください。

あなたの問題については、関数f(x)= sin(1./x)を積分したいと思っています。その場合、2番目の関数のコードは、次のようになります。

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

ありがとうございます。それはそれを行う方法です。また、myfunc.mからforループを分離するだけで問題が解決されます。そんな単純なこと。 –

0

myFuncがRiemannの呼び出しを停止したときに、入力xの最終条件が必要です。また、実際の関数(この場合はsin)をRiemannに送ることは、myFuncを呼び出すよりも優れたアイデアです。

0

関数myfuncは、f = sin(1./x);の後に終了しません。そこで関数を終了し、別の場所(別ファイル)からプロットコードを呼び出します。

マニュアルから: endステートメントで任意の関数を終了できますが、ほとんどの場合、これはオプションです。 endステートメントは、1つ以上のネストされた関数を使用するM-ファイルでのみ必要です。そのようなMファイル内では、すべての関数(プライマリ、ネスト、プライベート、サブ関数を含む)は、終了ステートメントで終了する必要があります。任意の関数型をendで終了することはできますが、M-ファイルに入れ子関数が含まれていない限り、そうする必要はありません。