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

在这里只是一个猜测:你不是错过了最后一行的任务吗?而且如果之前没有分配过,您是否不需要在 elseif 中初始化?IE

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 回答