Вы ожидаете, что «функции командной строки» в октаве будут иметь лексическую область видимости, но это просто не тот случай.
Если бы все это было внутри функции, и вы определили вложенную функцию, она бы работала как вы ожидаете. Но такие «функции командной строки» обрабатываются так, как будто они находятся в своем собственном файле, и им ничего не известно о рабочей области, в которой они были определены.
В этом конкретном случае, поскольку ваша функция эффективно с одной линией, вы можете получить желаемый эффект, сделав вместо этого дескриптор функции, который «захватывает» локальное рабочее пространство. Т.е. это будет работать
q = 5;
tointegrate = @(x) 2 * q * sin(x);
[ans, ier, nfun, err] = quad("tointegrate",-10 *q ,10*q);
Обратите внимание, однако, что 'q' будет иметь значение, которое оно имело во время захвата. Т.е., если вы обновите q динамически, его значение не будет обновлено в дескрипторе функции.
В противном случае, для более сложных функций, решение действительно состоит в том, чтобы передать его как параметр (или получить доступ к нему как к глобальному c).