首页 > 解决方案 > 如何在 Octave 中定义一个带有参数的函数?

问题描述

我正在尝试使用预定义的变量定义一个函数,而 Octave 说该变量未定义。我正在尝试在 Octave 中运行以下代码,

q = 5;
function w = tointegrate(x)
  w = 2 * q * sin(x);
endfunction
[ans, ier, nfun, err] = quad("tointegrate", -10*q, 10*q);
ans

八度给出错误

error: 'q' undefined near line 3 column 10
error: quad: evaluation of user-supplied function failed

如何修复此错误?

标签: functionoctave

解决方案


您期望 octave 中的“命令行函数”具有词法范围,但事实并非如此。

如果所有这些都在一个函数中,并且您定义了一个嵌套函数,那么它将按您的预期工作。但是像这样的“命令行函数”被视为在自己的文件中,并且不知道定义它们的工作空间。

在这种特殊情况下,由于您的函数实际上是单行的,因此您可以通过将其设置为函数句柄来获得所需的效果,这“确实”捕获了本地工作空间。即这将工作

q = 5;
tointegrate = @(x) 2 * q * sin(x);
[ans, ier, nfun, err] = quad("tointegrate",-10 *q ,10*q);

但是请注意,“q”将具有捕获时的值。即如果你动态更新q,它的值不会在函数句柄中更新。

否则,对于更复杂的功能,解决方案实际上是将其作为参数传递(或将其作为全局访问等)。


推荐阅读