Процедуры

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Создайте процедуру

Если вы хотите выполнить часть кода неоднократно, создать и использовать процедуру. Задайте процедуру с командой proc. Заключите свой код в команды end_proc и begin:

myProc:= proc(n)
begin
   if n = 1 or n = 0 then
     1
   else
     n * myProc(n - 1)
   end_if;
end_proc:

Используйте end в качестве ярлыка для end_proc.

Вызовите процедуру

Теперь вызовите процедуру:

myProc(5)

Управляйте возвращаемыми значениями

По умолчанию процедура возвращает результат последней выполняемой команды. Если вы хотите возвратить другие результаты, используйте команду return. Например, создайте процедуру, которая вычисляет факториалы целых чисел:

myProcReturn := proc(n)
begin
   if n = 0 or n = 1 then 
      return(1);
   end_if;
   n * myProcReturn(n - 1);
end_proc:

Вызовите процедуру:

myProcReturn(5)

Чтобы отобразить результаты на вашем экране, не возвращая их, используйте команду print:

myProcPrint:= proc(n)
begin
   print(n);
   if n = 0 or n = 1 then 
      return(1);
   end_if;
   n * myProcPrint(n - 1);
end_proc:

Вызовите процедуру:

myProcPrint(5);

Возвратите несколько результатов

Чтобы возвратить несколько результатов процедуры, используйте такие структуры в качестве списков или матриц как возвращаемые значения:

myProcSort:= proc(a, b)
begin
  if a < b then
    [a, b]
  else
    [b, a]
  end_if;
end_proc:
myProcSort(4/5, 5/7)

Ответьте на символьные звонки

Много встроенных процедур MuPAD® могут ответить на символьные звонки себе, когда они не могут вычислить результаты как точные значения. Например, когда вы вычисляете sin(PI/2), функция sin возвращает точное значение 1. В то же время, когда вы вычисляете sin(x/2), функция sin отвечает на символьный звонок к себе:

sin(x/2)

Чтобы позволить вашей пользовательской процедуре ответить на символьные звонки, используйте специальный синтаксис procname(args()). Например, создайте процедуру, которая вычисляет факториал ее аргумента:

f := proc(x)
begin
  if testtype(x, Type::PosInt) then
    return(x!)
  else
    return(procname(args()))
  end_if:
end_proc:

Если ее аргумент является положительным целым числом, эта процедура возвращает точный номер:

f(5), f(10)

В противном случае это не делает ошибки, но отвечает на символьный звонок к себе:

f(1/3), f(1.1), f(x), f(x + 1)

Используйте глобальные и локальные переменные

В процедуре все переменные попадают в две категории: глобальная переменная и локальный. Глобальные переменные доступны отовсюду в блокноте. Локальные переменные доступны только из процедуры.

Глобальные переменные

Предположим, что вы хотите создать процедуру gProc и использовать глобальную переменную gVar в процедуре:

gProc := proc(x)
begin
  gVar := gVar^2 + x^2 + 1
end_proc:

Когда вы вызываете эту процедуру, значение изменений переменной gVar:

gVar := 10;
gProc(5):
gVar

Множественные вызовы изменяют значение глобальной переменной далее:

gProc(5):
gVar

Примечание

Избегайте использования ненужных глобальных переменных.

Глобальные переменные уменьшают удобочитаемость кода, занимают глобальное пространство имен, и часто приводят к ошибкам. Когда вы используете глобальные переменные в процедуре, всегда проверяете, что каждый вызов процедуры заменяет глобальные переменные, как предназначено.

Локальные переменные

Можно получить доступ и изменить локальные переменные только в процедуре. Предположим, вы используете переменную lVar в своем блокноте:

lVar := 10

Чтобы объявить локальную переменную, используйте команду local в процедуре:

lProc := proc(x)
  local lVar;
begin
  lVar := 10;
  lVar := lVar^2 + x^2 + 1
end_proc:

Когда вы вызываете эту процедуру, значение переменной lVar изменяется только в процедуре. Вне процедуры переменная не изменяет свое значение:

lProc(5):
lVar

Если вы объявляете локальную переменную, она не наследовала значение глобальной переменной с тем же именем. Локальные переменные не являются идентификаторами типа DOM_IDENT. Они принадлежат специальному доменному типу DOM_VAR. Поэтому вы не можете использовать локальную переменную в качестве символьной переменной. Прежде, чем выполнить вычисления с локальной переменной, необходимо присвоить значение той переменной. Например, без присвоения lVar:= 10, вызов процедуры lProc возвращает сообщение об ошибке:

lProc := proc(x)
local lVar;
begin
  lVar := lVar^2 + x^2 + 1
end_proc:
lProc(5)
Warning: Uninitialized variable 'lVar' is used.
  Evaluating: lProc
Error: Invalid operand. [_power]
  Evaluating: lProc

Локальные переменные не могут иметь предположений.

Восстановите значения и свойства глобальных переменных, измененных в процедурах

Когда вы используете глобальные переменные в процедуре, можно сохранить их исходные значения и свойства, и восстановить их после процедуры. Предположим, вы хотите использовать больше десятичных цифр для вычислений с числами с плавающей запятой в процедуре. По умолчанию количество цифр равняется 10:

DIGITS

Чтобы сохранить это значение по умолчанию, используйте команду save в начале процедуры:

myProcSave := proc(newDigits, x)
  save DIGITS;
begin
  DIGITS := newDigits;
  print(float(x));
end_proc:

После того, как вы вызовете процедуру myProcSave, MuPAD восстанавливает значение глобальной переменной DIGITS:

myProcSave(20, PI);
DIGITS

Комбинация save и delete позволяет вам временно освободить переменную для использования в процедуре. Например, процедура не может использовать переменную x, потому что переменной присвоили значение ему:

x := 10:
proc() 
begin
  solve(x^2 + x = 1, x)
end_proc();
Error: Invalid variable to solve for. [solve]

Используйте команду save, чтобы сохранить исходное значение 10. Затем освободите переменную x с помощью команды delete:

x := 10:
proc() 
  save x;
begin
  delete x;
  solve(x^2 + x = 1, x)
end_proc()

После вызова процедуры MuPAD восстанавливает исходное значение x:

x

Комбинация save и delete полезна когда это необходимо, чтобы использовать символьную переменную (без любого значения, присвоенного ему) в процедуре. Вы не можете использовать локальные переменные с этой целью, потому что локальная переменная в MuPAD не является идентификатором. Локальной переменной нужно было присвоить значение ему. Кроме того, вы не можете задать предположения на локальных переменных, и вы не можете объединяться относительно локальных переменных.