Как определить функцию с параметром в ней в Octave? - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь определить функцию с предопределенной переменной, и 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

Octave выдает ошибку

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

Как исправить эту ошибку?

Ответы [ 2 ]

4 голосов
/ 18 февраля 2020

Вы ожидаете, что «функции командной строки» в октаве будут иметь лексическую область видимости, но это просто не тот случай.

Если бы все это было внутри функции, и вы определили вложенную функцию, она бы работала как вы ожидаете. Но такие «функции командной строки» обрабатываются так, как будто они находятся в своем собственном файле, и им ничего не известно о рабочей области, в которой они были определены.

В этом конкретном случае, поскольку ваша функция эффективно с одной линией, вы можете получить желаемый эффект, сделав вместо этого дескриптор функции, который «захватывает» локальное рабочее пространство. Т.е. это будет работать

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

Обратите внимание, однако, что 'q' будет иметь значение, которое оно имело во время захвата. Т.е., если вы обновите q динамически, его значение не будет обновлено в дескрипторе функции.

В противном случае, для более сложных функций, решение действительно состоит в том, чтобы передать его как параметр (или получить доступ к нему как к глобальному c).

1 голос
/ 18 февраля 2020

Вы можете решить эту проблему, указав q в качестве параметра функции, а затем создав анонимную функцию для вызова quad, например:

function w = tointegrate(x, q)
  w = 2 * q * sin(x);
endfunction

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