0

以下は、私が抱えている問題を一般化して説明するための簡単な例です。

次のような関数があるとします。

function newtraph(initialguess,funct,dfunct)
ht = funct(initialguess);
if abs(ht) < 10^(-6)
    disp(initialguess); return
elseif abs(ht) > 10^6
    disp('Fix Guess'); return
end
newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);

終了する唯一の方法 (私が知っている) は、これらの return ステートメントを使用することです。しかし、このようなさまざまな関数からの出力をベース ワークスペースの変数に割り当てたいと考えています。私は次のようなことをしたい:

function out = newtraph(initialguess,funct,dfunct)
ht = funct(initialguess);
if abs(ht) < 10^(-6)
    out = initialguess; return
elseif abs(ht) > 10^6
    disp('Fix Guess'); return
end
newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);

これは機能しませんreturn。アウトが割り当てられないようにします。

Output argument "out" (and maybe others) not assigned

解決策について私が持っているいくつかのアイデアは、グローバルまたはevalin. しかし、私が見逃している簡単な方法はありますか。このスタイルの関数からの出力をベース ワークスペースに戻したいだけですか?

念のためのテストケース:

funct=@(x) -x-cos(x); dfunct=@(x) sin(x)-1; initialguess=1;

御時間ありがとうございます。

まあ、私はばかです。それは単に最終的な割り当てを忘れたケースでした:

function out = newtraph(initialguess,funct,dfunct)
ht = funct(initialguess);
if abs(ht) < 10^(-6) %Tolerance
    out = initialguess; return
elseif abs(ht) > 10^6
    out=0; return
end
out = newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);

迅速な対応ありがとうございます。

4

3 に答える 3

1

機能しないサンプル関数はほとんどありません。割り当てるだけでいい

out = newtraph(...)

出力をキャプチャできるように、最後の行に。

コードのブランチも値を返すように、「推測の修正」を報告するときに、おそらく out = 0 またはいくつかのダミー値を割り当てる必要もあります。

于 2013-02-16T01:48:04.860 に答える
0

推測ですが、最後の行の割り当てを見逃していませんか? また、以前に out が割り当てられていなかった場合に備えて、elseif で out を初期化する必要はありませんか? いえ

ht = funct(initialguess);
if abs(ht) < 10^(-6)
    out = initialguess;
    return
elseif abs(ht) > 10^6
    disp('Fix Guess');
    if ~exist('out')
       out=1;  % you need some default value if you ever reach this code without ever initializing out
    end
    return
end
out = newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);
于 2013-02-16T01:47:26.623 に答える
0

この答えは少し遅いかもしれませんが、ここで指摘するに値するほど重要だと思います. 再帰をより明確にするために、ここで別のアプローチをお勧めします。

function out = newtraph(initialguess,funct,dfunct,counter)
maxCount = % yourValue;
ht = funct(initialguess);
if abs(ht) > 10^(-6) || abs(ht) < 10^6 || counter<maxCount % Break out after x tries
    counter = counter+1;
    out = newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct,counter);
elseif abs(ht) < 10^(-6) %Tolerance
    out = initialguess;
else
    warning('Convergence were not reached!');
    out=0;
end

好ましい構造は個人的なものかもしれませんが、この方法では、関数が収束するか発散するという停止基準に到達するまで続行することが明らかです。

また、再帰関数を停止する唯一の方法は終了基準を満たすか、プログラムがクラッシュしたときであるため、再帰関数は危険です。Matlab では、再帰を実行できる回数に制限があり、エラーがスローされます。ほとんどの場合、自分でエラーを処理する必要があります (既に を設定して行っているようにout=0;)。また、matlabs の制限は 500 回の再帰呼び出しであり、アルゴリズムに応じて、おそらく 8 ~ 20 回の呼び出しで関数を早期に終了する必要があります。

于 2014-07-21T10:17:32.270 に答える