【问题标题】:MatLab recursion error (beginner)MatLab递归错误(初学者)
【发布时间】:2009-06-02 10:18:07
【问题描述】:

好的。所以我在 MatLab 中有两个互相调用的函数。

黎曼.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 以从中获取任何信息。我尝试过的所有内容都以无穷无尽的递归调用堆栈结束(这是有道理的)。

【问题讨论】:

  • 问题不在于 Matlab,而在于函数本身。你能用伪代码将它们重写为数学函数,这样我们就可以看到你想要完成什么?

标签: matlab recursion function-handle


【解决方案1】:

你的问题在于你的函数的定义:为了能够使用递归定义,你必须能够在没有另一个的情况下计算两个函数中的至少一个,至少在某些情况下价值观。您必须还确保每次计算最终都依赖于您无需递归即可获得的结果。

对于您的具体问题,我感觉您想要集成函数 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)

【讨论】:

  • 谢谢。这就是这样做的方法。同样,只需将 for 循环从 myfunc.m 中分离出来即可解决问题。这么简单的事情。
【解决方案2】:

函数 myfunc 没有在应该结束的f = sin(1./x); 之后结束。在那里终止函数并从其他地方调用绘图代码(单独的文件)。

来自手册: 您可以使用 end 语句终止任何函数,但在大多数情况下,这是可选的。只有在使用一个或多个嵌套函数的 M 文件中才需要 end 语句。在这样的 M 文件中,每个函数(包括主函数、嵌套函数、私有函数和子函数)都必须以 end 语句终止。您可以使用 end 终止任何函数类型,但除非 M 文件包含嵌套函数,否则不需要这样做。

【讨论】:

    【解决方案3】:

    当 myFunc 停止调用 Riemann 时,您需要输入 x 的最终条件。将实际函数(在本例中为 sin)发送给 Riemann 比调用 myFunc 更好。

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 2016-09-23
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多