MatLab递归错误(初学者)

MatLab recursion error (beginner)

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

黎曼.m

1
2
3
4
function I = Riemann(f, dx, a, b)
   x = a:dx:b;
   fx = f(x).*dx;
   I = sum(fx);

和myfunc.m

1
2
3
4
5
6
function f = myfunc(x)
   f = sin(1./x);
   for n=1:100
        I = Riemann(@myfunc, 0.001, 1/n, 1);
   end
   plot(I)

问题是让它运行。我如何调用 myfunc 以从中获取任何信息。我尝试过的一切都以无穷无尽的递归调用堆栈结束(这是有道理的)。


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

对于您的具体问题,我感觉您想集成函数 f(x)=sin(1./x)。如果是这样,您的第二个函数的代码应为:

1
2
3
4
5
6
7
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)


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

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


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