以下只是一个简单的例子来概括和说明我遇到的问题。
如果我有以下功能:
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);
感谢您的快速帮助!
答案 0 :(得分:1)
你的示例函数几乎没有用。你只需要分配
out = newtraph(...)
在最后一行,这样你就可以捕获输出。
当您报告“fix guess”时,您可能还需要指定= 0或一些虚拟值,以便代码的分支也将返回一个值。
答案 1 :(得分:0)
这里只是一个猜测:你不是错过了最后一行的作业吗?如果以前没有分配出来,你也不需要在你的elseif中初始化吗?即
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);
答案 2 :(得分: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个调用,具体取决于你的算法。