Как интегрировать, используя обычную функцию вместо встроенной функции? - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь понять, как сделать интеграл в Октаве. Я не могу понять, что я делаю неправильно (или если это проблема с Octave). Я могу сделать интеграл с помощью встроенной функции, но не с нормальной функцией (см. Ниже). При использовании обычной функции Octave выбрасывает error: 't' undefined near line 8 column y. В приведенном ниже фрагменте кода строка 8 - result = 2*t.^2 +5*t;.

% Inline function (can use to integrate)
fn1 = @(t) 2*t.^2 +5*t;

% Normal function (can't use to integrate)
function result = fn2(t)
  result = 2*t.^2 +5*t;
end

% integrate using Inline function (works)
integral(fn1,0,15)

% integrate using Normal function (doesn't work)
integral(fn2,0,15)

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Есть несколько вещей, которые неверны в том, что вы говорите (включая утверждение, что октава была построена для поддержки matlab: p)

Вы объединяете понятия «нормальных» (то есть файловых) функций со встроенными функциями, с дескрипторами функций и анонимными функциями. Все это довольно базовые c понятия в октаве (и в матлабе). И что бы это ни значило, matlab и октава идентичны в этом отношении.

Вот соответствующая часть руководства. Это может показаться много, но каждая ссылка на самом деле довольно короткая и стоит прочитать. в этом вопросе раздел 11.11, посвященный дескрипторам функций и анонимным функциям.

Я попытаюсь объяснить вкратце ниже, но стоит прочитать руководство.

По сути, выражение @(t) 2*t.^2 +5*t; создает «анонимная функция» и возвращает «дескриптор функции». fn1 = @(t) 2*t.^2 +5*t; поэтому захватывает созданный дескриптор функции в переменной fn1. Это означает, что вы можете использовать дескриптор для вызова базовой функции, которую он представляет, как fn1( t ), или передать ее в качестве аргумента функциям.

С другой стороны, обычные функции обычно определяются в своих собственных .m файлы. Это делает их доступными для вызова, но не для передачи в качестве переменных. Если вы хотите передать существующую функцию m-файла в качестве переменной другой функции, вам нужно сначала создать дескриптор. Например, если у вас есть функция с именем myfunction, вы можете сделать myhandle = @myfunction. После этого вы можете передать myhandle в функции или даже вызвать его как myhandle(), чтобы вызвать основную функцию, которую она представляет (т.е. myfunction).


PS. Встроенные функции - это совсем другое (вы создаете функцию из строки), и обсуждать их не стоит, поскольку они не рекомендуются ни matlab, ни октавой.

0 голосов
/ 03 мая 2020

Использование integral(@fn2,0,15) будет работать. Хотя я до сих пор не понимаю, почему @ необходим в этом контексте.

...