Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
Если вы хотите выполнить часть кода неоднократно, создать и использовать процедуру. Задайте процедуру с proc
команда. Заключите свой код в begin
и end_proc
команды:
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 не является идентификатором. Локальной переменной нужно было присвоить значение ему. Кроме того, вы не можете задать предположения на локальных переменных, и вы не можете объединяться относительно локальных переменных.