Журнал LinuxFormat - перейти на главную

LXF82:Maxima

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: {{Цикл/Maxima}} == Maxima – функции и операторы == ''ЧАСТЬ 2 Понять философию сложного пакета – уже половина дел...)
 
м (викификация)
Строка 1: Строка 1:
 
{{Цикл/Maxima}}
 
{{Цикл/Maxima}}
== Maxima – функции и операторы ==
+
== Maxima — функции и операторы ==
''ЧАСТЬ 2 Понять философию сложного пакета – уже половина дела, однако, для того, чтобы уметь читать, надо хотя бы освоить азбуку. Сегодня '''Тихон Тарнавский''' расскажет вам об операторах (или функциях?) Maxima.''
+
''ЧАСТЬ 2 Понять философию сложного пакета — уже половина дела, однако, для того, чтобы уметь читать, надо хотя бы освоить азбуку. Сегодня '''Тихон Тарнавский''' расскажет вам об операторах (или функциях?) Maxima.''
  
 
=== Операторы Максимы ===
 
=== Операторы Максимы ===
Строка 8: Строка 8:
 
свойствах.
 
свойствах.
  
На самом деле в Максиме нет чёткого разграничения между операторами и функциями. Более того, каждый оператор – это на самом деле
+
На самом деле в Максиме нет чёткого разграничения между операторами и функциями. Более того, каждый оператор — это на самом деле
 
функция:
 
функция:
  
Строка 15: Строка 15:
 
что содержат символы, нестандартные для имён функций. Это похоже на
 
что содержат символы, нестандартные для имён функций. Это похоже на
 
работу в командной оболочке Unix, где, если в имя файла входят управляющие символы, вы можете либо взять это имя в кавычки, либо экранировать каждый такой символ обратным слэшем. В Maxima допустимы те же
 
работу в командной оболочке Unix, где, если в имя файла входят управляющие символы, вы можете либо взять это имя в кавычки, либо экранировать каждый такой символ обратным слэшем. В Maxima допустимы те же
два варианта: например, вместо +можно было бы написать \+.
+
два варианта: например, вместо «+» можно было бы написать \+.
  
 
Итак, все встроенные операторы максимы являются функциями;
 
Итак, все встроенные операторы максимы являются функциями;
Строка 26: Строка 26:
 
некоторых операторах, но и о нескольких функциях, которые по природе
 
некоторых операторах, но и о нескольких функциях, которые по природе
 
своих действий сходны с операторами. Наиболее привычные операторы
 
своих действий сходны с операторами. Наиболее привычные операторы
уже упоминались в предыдущей статье: +, , *, /, ^ или ** (возведение
+
уже упоминались в предыдущей статье: +, -, *, /, ^ или ** (возведение
 
в степень) и функцию sqrt(x) (квадратный корень). Сегодня мы поговорим ещё о нескольких достаточно распространённых.
 
в степень) и функцию sqrt(x) (квадратный корень). Сегодня мы поговорим ещё о нескольких достаточно распространённых.
  
 
Точкой обозначается матричное произведение. В документации
 
Точкой обозначается матричное произведение. В документации
утверждается, что сама точка при этом должна быть отделена пробелами от обоих своих операндов – дабы не спутать её с точкой десятичной.
+
утверждается, что сама точка при этом должна быть отделена пробелами от обоих своих операндов — дабы не спутать её с точкой десятичной.
 
На самом деле мне не удалось добиться от Максимы неадекватной реакции и в «беспробельном» варианте; что и логично, так как всё равно эти
 
На самом деле мне не удалось добиться от Максимы неадекватной реакции и в «беспробельном» варианте; что и логично, так как всё равно эти
 
две разные ипостаси точки можно различить по контексту: ведь цифры
 
две разные ипостаси точки можно различить по контексту: ведь цифры
Строка 41: Строка 41:
  
  
Восклицательный знак, стоящий после своего аргумента (т.е. постфиксный оператор), традиционно обозначает факториал. Не менее традиционно, двумя восклицательными знаками обозначен полуфакториал
+
Восклицательный знак, стоящий после своего аргумента (то есть постфиксный оператор), традиционно обозначает факториал. Не менее традиционно, двумя восклицательными знаками обозначен полуфакториал
 
[произведение всех четных (для четного операнда) или нечетных чисел,
 
[произведение всех четных (для четного операнда) или нечетных чисел,
меньших либо равных данному, прим. ред.]. Функции abs(x) и
+
меньших либо равных данному, — прим. ред.]. Функции abs(x) и
 
signum(x) возвращают, как опять же нетрудно догадаться, модуль и
 
signum(x) возвращают, как опять же нетрудно догадаться, модуль и
знак числа. А функции max(x1,...,xn) и min(x1,...,xn) соответственно максимальное и минимальное из заданных чисел.
+
знак числа. А функции max(x1,,xn) и min(x1,,xn) — соответственно максимальное и минимальное из заданных чисел.
  
  
Строка 52: Строка 52:
 
но и комплексными числами. Сами комплексные числа записываются в
 
но и комплексными числами. Сами комплексные числа записываются в
 
Максиме в алгебраической форме, с мнимой единицей, обозначенной
 
Максиме в алгебраической форме, с мнимой единицей, обозначенной
через %i; то есть в виде a+b*%i, где a и b – соответственно действительная и мнимая части числа.
+
через %i; то есть в виде a+b*%i, где a и b — соответственно действительная и мнимая части числа.
  
 
Так, факториал задан в наиболее общем виде и представляет собой,
 
Так, факториал задан в наиболее общем виде и представляет собой,
Строка 67: Строка 67:
  
 
Второй важный момент: когда некоторая встроенная функция или
 
Второй важный момент: когда некоторая встроенная функция или
оператор Maxima не может получить для переданного выражения однозначный результат (ввиду недостаточности данных) она пытается максимально упростить это выражение. (Для некоторых функций такое
+
оператор Maxima не может получить для переданного выражения однозначный результат (ввиду недостаточности данных) — она пытается максимально упростить это выражение. (Для некоторых функций такое
 
автоупрощение регулируется специальными параметрами.) Например,
 
автоупрощение регулируется специальными параметрами.) Например,
 
если x не задан:
 
если x не задан:
Строка 78: Строка 78:
 
Как вы, вероятно, помните, в прошлый раз кроме упомянутого только что оператора блокировки вычислений мы познакомились с оператором присвоения значений, или, иначе, именования выражений, : . В
 
Как вы, вероятно, помните, в прошлый раз кроме упомянутого только что оператора блокировки вычислений мы познакомились с оператором присвоения значений, или, иначе, именования выражений, : . В
 
Maxima существуют и другие операторы именования, из которых нам на
 
Maxima существуют и другие операторы именования, из которых нам на
данный момент интересен один – оператор задания функции.
+
данный момент интересен один — оператор задания функции.
 
Обозначается он через :=, и аналогии здесь прослеживаются не с языками Pascal или Algol, как может показаться на первый взгляд, а с другими обозначениями самой Максимы: с одной стороны определение
 
Обозначается он через :=, и аналогии здесь прослеживаются не с языками Pascal или Algol, как может показаться на первый взгляд, а с другими обозначениями самой Максимы: с одной стороны определение
функции можно воспринимать как уравнение (которое обозначается знаком =), а с другой – оно родственно назначению имени некоторому
+
функции можно воспринимать как уравнение (которое обозначается знаком =), а с другой — оно родственно назначению имени некоторому
 
выражению (то есть :). То есть определение функции можно в какой-то
 
выражению (то есть :). То есть определение функции можно в какой-то
мере считать симбиозом этих двух выражений – и оттого вполне логично, что оно обозначается обоими их символами. (В продолжение этой
+
мере считать симбиозом этих двух выражений — и оттого вполне логично, что оно обозначается обоими их символами. (В продолжение этой
 
аналогии могу добавить, что в Maxima есть и расширенные варианты
 
аналогии могу добавить, что в Maxima есть и расширенные варианты
 
операторов присвоения и назначения функции, обозначаемые соответственно через :: и ::=.)
 
операторов присвоения и назначения функции, обозначаемые соответственно через :: и ::=.)
Строка 93: Строка 93:
 
А сейчас я расскажу о том, что было обещано в прошлый раз: о возможностях управлять процессом вычислений вводимых вами выражений. В
 
А сейчас я расскажу о том, что было обещано в прошлый раз: о возможностях управлять процессом вычислений вводимых вами выражений. В
 
прошлый раз, о чём я уже вспоминал, было упомянуто только одно такое
 
прошлый раз, о чём я уже вспоминал, было упомянуто только одно такое
средство – блокировка вычислений. Здесь всё достаточно просто и дополнительно стоит остановиться только на одном моменте. Если апострофом
+
средство — блокировка вычислений. Здесь всё достаточно просто и дополнительно стоит остановиться только на одном моменте. Если апострофом
предварён вызов функции (встроенной ли, пользовательской – несущественно), то блокируется вычисление самой функции, но не её аргументов.
+
предварён вызов функции (встроенной ли, пользовательской — несущественно), то блокируется вычисление самой функции, но не её аргументов.
 
Если же поставить апостроф перед выражением, заключённым в скобки,
 
Если же поставить апостроф перед выражением, заключённым в скобки,
то невычисленными останется всё это выражение целиком, т.е. и все входящие в него функции, и все аргументы этих функций. Например:
+
то невычисленными останется всё это выражение целиком, то есть и все входящие в него функции, и все аргументы этих функций. Например:
  
  
 
В противовес блокировке вычислений, можно также принудительно
 
В противовес блокировке вычислений, можно также принудительно
вычислить любое выражение – для этого тоже существует оператор,
+
вычислить любое выражение — для этого тоже существует оператор,
 
состоящий из двух апострофов:
 
состоящий из двух апострофов:
  
  
В терминологии Maxima невычисленная форма выражения называется «noun form», вычисленная – «verb form». Сохраняя лингвистические параллели, на русский я бы это перевёл как «несовершённая форма» и «совершённая форма».
+
В терминологии Maxima невычисленная форма выражения называется «noun form», вычисленная — «verb form». Сохраняя лингвистические параллели, на русский я бы это перевёл как «несовершённая форма» и «совершённая форма».
  
 
Если говорить о ячейках ввода-вывода, то значение ячейки ввода в
 
Если говорить о ячейках ввода-вывода, то значение ячейки ввода в
Maxima закономерно сохраняется до его вычисления (т.е. в несовершённой форме), а значение ячейки вывода – после (т.е. в совершённой);
+
Maxima закономерно сохраняется до его вычисления (то есть в несовершённой форме), а значение ячейки вывода — после (то есть в совершённой);
другими словами, тут сохраняется естественный порядок «ввод >
+
другими словами, тут сохраняется естественный порядок «ввод ->
вычисление > вывод».
+
вычисление -> вывод».
  
  
Строка 117: Строка 117:
 
к функции ev(выражение). Сама функция ev предоставляет гораздо
 
к функции ev(выражение). Сама функция ev предоставляет гораздо
 
более широкие возможности, нежели простое принудительное вычисление заданного выражения: она может принимать произвольное число
 
более широкие возможности, нежели простое принудительное вычисление заданного выражения: она может принимать произвольное число
аргументов, первый из которых – вычисляемое выражение, а остальные
+
аргументов, первый из которых — вычисляемое выражение, а остальные
специальные опции, которые как раз и влияют на то, как именно будет
+
специальные опции, которые как раз и влияют на то, как именно будет
производиться вычисление. Точно так же, как двойной апостроф
+
производиться вычисление. Точно так же, как двойной апостроф -
 
сокращение для ev без дополнительных опций, есть ещё более упрощённая запись функции ev с опциями: в этом случае вместо имени функции
 
сокращение для ev без дополнительных опций, есть ещё более упрощённая запись функции ev с опциями: в этом случае вместо имени функции
и скобок вообще ничего писать не нужно; т.е. «ev(выражение, опц1,опц2, ...)» можно записать просто как «выражение, опц1, опц2,
+
и скобок вообще ничего писать не нужно; то есть «ev(выражение, опц1,опц2, )» можно записать просто как «выражение, опц1, опц2,
...».
+
…».
  
Первая из таких опций связана с автоупрощением. Глобально автоупрощение регулируется переключателем simp (от «simplification»
+
Первая из таких опций связана с автоупрощением. Глобально автоупрощение регулируется переключателем simp (от «simplification» -
 
упрощение), и по умолчанию оно включено; в любой момент его можно
 
упрощение), и по умолчанию оно включено; в любой момент его можно
 
выключить, установив значение переключателя в false. Опция функции
 
выключить, установив значение переключателя в false. Опция функции
 
ev, одноимённая этому переключателю, позволяет включить упрощение
 
ev, одноимённая этому переключателю, позволяет включить упрощение
для данного конкретного вычисления – вне зависимости от того, включено или выключено оно глобально:
+
для данного конкретного вычисления — вне зависимости от того, включено или выключено оно глобально:
  
  
 
Тут нужно отметить ещё, что вызов kill(all) не восстанавливает
 
Тут нужно отметить ещё, что вызов kill(all) не восстанавливает
умолчательные значения переключателей; т.е. если мы, к примеру,
+
умолчательные значения переключателей; то есть если мы, к примеру,
 
изменили значение переключателя simp, как в примере выше, то для
 
изменили значение переключателя simp, как в примере выше, то для
 
того, чтобы вернуться к изначальному порядку вещей, установленному
 
того, чтобы вернуться к изначальному порядку вещей, установленному
Строка 139: Строка 139:
  
 
Опция diff принудительно раскрывает все производные и полные
 
Опция diff принудительно раскрывает все производные и полные
дифференциалы; а опция derivlist(x, y, ..., v) производные относительно переменных, заданных в качестве её аргументов, а также полные
+
дифференциалы; а опция derivlist(x, y, , v) — производные относительно переменных, заданных в качестве её аргументов, а также полные
 
дифференциалы (так как они не зависят ни от каких переменных):
 
дифференциалы (так как они не зависят ни от каких переменных):
  
  
 
Как видите, если из нескольких переменных из diff в derivlist()
 
Как видите, если из нескольких переменных из diff в derivlist()
заданы не все, то раскрывается производная только по заданным переменным; это и понятно, так как выражения diff(f, x, 1, y, 1), diff(diff(f,x), y) и diff(diff(f, y), x) математически эквивалентны [по крайней
+
заданы не все, то раскрывается производная только по заданным переменным; это и понятно, так как выражения diff(f, x, 1, y, 1), diff(diff(f, x), y) и diff(diff(f, y), x) математически эквивалентны [по крайней
мере, для «хороших» функций, прим.ред]. Если же аргумент опции
+
мере, для «хороших» функций, — прим.ред]. Если же аргумент опции
 
derivlist() вообще не является переменной дифференцирования, он
 
derivlist() вообще не является переменной дифференцирования, он
 
просто игнорируется.
 
просто игнорируется.
  
Опция nouns раскрывает вообще все несовершённые формы – и
+
Опция nouns раскрывает вообще все несовершённые формы — и
 
производные в том числе:
 
производные в том числе:
  
Строка 158: Строка 158:
  
  
Опция noeval блокирует сам этап вычисления как таковой; т.е. её
+
Опция noeval блокирует сам этап вычисления как таковой; то есть её
 
можно использовать для того, чтобы применить к выражению другие
 
можно использовать для того, чтобы применить к выражению другие
 
опции функции ev, не перевычисляя его. При этом опять-таки нужно
 
опции функции ev, не перевычисляя его. При этом опять-таки нужно
Строка 167: Строка 167:
 
перевычисляя его.
 
перевычисляя его.
  
Опция eval – напротив, проводит дополнительно ещё один процесс
+
Опция eval — напротив, проводит дополнительно ещё один процесс
 
вычисления. Здесь стоит поговорить подробнее о накопительном
 
вычисления. Здесь стоит поговорить подробнее о накопительном
 
эффекте вычисления, который я уже демонстрировал выше. Так как в
 
эффекте вычисления, который я уже демонстрировал выше. Так как в
Строка 180: Строка 180:
 
ev(ev(y), eval), таким образом вычисление в этом выражении проводится трижды. Кроме того, хочу обратить ваше внимание на порядок
 
ev(ev(y), eval), таким образом вычисление в этом выражении проводится трижды. Кроме того, хочу обратить ваше внимание на порядок
 
назначения выражений символам; здесь существенно, что на момент
 
назначения выражений символам; здесь существенно, что на момент
задания каждого выражения входящий в него символ ещё не был определён – иначе в выражение автоматически подставлялся не сам символ,
+
задания каждого выражения входящий в него символ ещё не был определён — иначе в выражение автоматически подставлялся не сам символ,
а его значение. Таким образом, если бы мы произвели эти же назначения в обратном порядке, то значением символа y стало бы xm+6 – безо
+
а его значение. Таким образом, если бы мы произвели эти же назначения в обратном порядке, то значением символа y стало бы xm+6 — безо
 
всяких принудительных вычислений.
 
всяких принудительных вычислений.
  
Строка 199: Строка 199:
  
 
Кроме константных значений есть ещё несколько видов опций.
 
Кроме константных значений есть ещё несколько видов опций.
Первый из них – это имена специальных функций, которые занимаются
+
Первый из них — это имена специальных функций, которые занимаются
 
упрощением или преобразованием математических выражений. Будучи
 
упрощением или преобразованием математических выражений. Будучи
упомянута по имени в качестве опции, такая функция просто применяется к вычисляемому выражению. Например, выражение, fullratsimp
+
упомянута по имени в качестве опции, такая функция просто применяется к вычисляемому выражению. Например, выражение, fullratsimp -
 
это то же самое, что и fullratsimp(ev(выражение)). Полный список
 
это то же самое, что и fullratsimp(ev(выражение)). Полный список
 
таких функций вы можете найти в ? evfun.
 
таких функций вы можете найти в ? evfun.
  
 
Если в качестве опции ввести имя любой другой функции, не имеющей свойства evfun, то все несовершённые вхождения этой функции
 
Если в качестве опции ввести имя любой другой функции, не имеющей свойства evfun, то все несовершённые вхождения этой функции
будут заменены совершёнными, т.е. принудительно вычислены.
+
будут заменены совершёнными, то есть принудительно вычислены.
  
 
{{Врезка
 
{{Врезка

Версия 18:18, 25 декабря 2008

Maxima — функции и операторы

ЧАСТЬ 2 Понять философию сложного пакета — уже половина дела, однако, для того, чтобы уметь читать, надо хотя бы освоить азбуку. Сегодня Тихон Тарнавский расскажет вам об операторах (или функциях?) Maxima.

Операторы Максимы

Продолжаю знакомить вас с возможностями свободной программы символьных вычислений Maxima. Начну в этот раз с краткого рассказа об основных операторах Maxima и некоторых их свойствах.

На самом деле в Максиме нет чёткого разграничения между операторами и функциями. Более того, каждый оператор — это на самом деле функция:


Здесь имена функций-операторов берутся в кавычки лишь потому, что содержат символы, нестандартные для имён функций. Это похоже на работу в командной оболочке Unix, где, если в имя файла входят управляющие символы, вы можете либо взять это имя в кавычки, либо экранировать каждый такой символ обратным слэшем. В Maxima допустимы те же два варианта: например, вместо «+» можно было бы написать \+.

Итак, все встроенные операторы максимы являются функциями; более того, вы можете наделить любую (в том числе свою собственную) функцию определёнными свойствами, которые фактически превратят её в оператор. Подробнее об этом я расскажу в следующих выпусках.

Таким образом, разделение на функции и операторы в Maxima достаточно условно. Посему в этом разделе речь пойдёт не только о некоторых операторах, но и о нескольких функциях, которые по природе своих действий сходны с операторами. Наиболее привычные операторы уже упоминались в предыдущей статье: +, -, *, /, ^ или ** (возведение в степень) и функцию sqrt(x) (квадратный корень). Сегодня мы поговорим ещё о нескольких достаточно распространённых.

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


В случае, если заданные матрицы не могут быть перемножены из-за несовпадающих размерностей, Maxima выдаст сообщение об ошибке:


Восклицательный знак, стоящий после своего аргумента (то есть постфиксный оператор), традиционно обозначает факториал. Не менее традиционно, двумя восклицательными знаками обозначен полуфакториал [произведение всех четных (для четного операнда) или нечетных чисел, меньших либо равных данному, — прим. ред.]. Функции abs(x) и signum(x) возвращают, как опять же нетрудно догадаться, модуль и знак числа. А функции max(x1,…,xn) и min(x1,…,xn) — соответственно максимальное и минимальное из заданных чисел.


Тут стоит остановиться на нескольких моментах. Во-первых, все функции и операторы Maxima работают не только с действительными, но и комплексными числами. Сами комплексные числа записываются в Максиме в алгебраической форме, с мнимой единицей, обозначенной через %i; то есть в виде a+b*%i, где a и b — соответственно действительная и мнимая части числа.

Так, факториал задан в наиболее общем виде и представляет собой, по сути, гамма-функцию (точнее, x! = gamma(x+1)), то есть определён на множестве всех комплексных чисел, кроме отрицательных целых. При этом факториал от натурального числа (и нуля) автоматически упрощается до натурального же числа:


Точно так же и модуль определён для всех комплексных чисел (напомню, что |a+b*i|=sqrt(a2+b2)). Минимум, максимум и знак определены, естественным образом, только для действительных чисел, так как комплексные числа общего вида, как известно, между собой несравнимы.

Второй важный момент: когда некоторая встроенная функция или оператор Maxima не может получить для переданного выражения однозначный результат (ввиду недостаточности данных) — она пытается максимально упростить это выражение. (Для некоторых функций такое автоупрощение регулируется специальными параметрами.) Например, если x не задан:


Подобные упрощения, равно как и «раскрытие» факториалов и арифметических операторов, не считаются вычислениями, а следовательно оператор блокировки вычислений их не предотвращает:


Как вы, вероятно, помните, в прошлый раз кроме упомянутого только что оператора блокировки вычислений мы познакомились с оператором присвоения значений, или, иначе, именования выражений, : . В Maxima существуют и другие операторы именования, из которых нам на данный момент интересен один — оператор задания функции. Обозначается он через :=, и аналогии здесь прослеживаются не с языками Pascal или Algol, как может показаться на первый взгляд, а с другими обозначениями самой Максимы: с одной стороны определение функции можно воспринимать как уравнение (которое обозначается знаком =), а с другой — оно родственно назначению имени некоторому выражению (то есть :). То есть определение функции можно в какой-то мере считать симбиозом этих двух выражений — и оттого вполне логично, что оно обозначается обоими их символами. (В продолжение этой аналогии могу добавить, что в Maxima есть и расширенные варианты операторов присвоения и назначения функции, обозначаемые соответственно через :: и ::=.)


Думаю, основы работы с функциями самоочевидны по аналогии с приведенным примером, а подробнее об этом мы поговорим в следующих выпусках.

Функция вычисления всего

А сейчас я расскажу о том, что было обещано в прошлый раз: о возможностях управлять процессом вычислений вводимых вами выражений. В прошлый раз, о чём я уже вспоминал, было упомянуто только одно такое средство — блокировка вычислений. Здесь всё достаточно просто и дополнительно стоит остановиться только на одном моменте. Если апострофом предварён вызов функции (встроенной ли, пользовательской — несущественно), то блокируется вычисление самой функции, но не её аргументов. Если же поставить апостроф перед выражением, заключённым в скобки, то невычисленными останется всё это выражение целиком, то есть и все входящие в него функции, и все аргументы этих функций. Например:


В противовес блокировке вычислений, можно также принудительно вычислить любое выражение — для этого тоже существует оператор, состоящий из двух апострофов:


В терминологии Maxima невычисленная форма выражения называется «noun form», вычисленная — «verb form». Сохраняя лингвистические параллели, на русский я бы это перевёл как «несовершённая форма» и «совершённая форма».

Если говорить о ячейках ввода-вывода, то значение ячейки ввода в Maxima закономерно сохраняется до его вычисления (то есть в несовершённой форме), а значение ячейки вывода — после (то есть в совершённой); другими словами, тут сохраняется естественный порядок «ввод -> вычисление -> вывод».


Как видите, операторы вычисления и блокировки вычислений имеют накопительный эффект. О другой стороне этого эффекта мы поговорим чуть ниже.

Оператор, обозначенный двумя апострофами, является синонимом к функции ev(выражение). Сама функция ev предоставляет гораздо более широкие возможности, нежели простое принудительное вычисление заданного выражения: она может принимать произвольное число аргументов, первый из которых — вычисляемое выражение, а остальные — специальные опции, которые как раз и влияют на то, как именно будет производиться вычисление. Точно так же, как двойной апостроф - сокращение для ev без дополнительных опций, есть ещё более упрощённая запись функции ev с опциями: в этом случае вместо имени функции и скобок вообще ничего писать не нужно; то есть «ev(выражение, опц1,опц2, …)» можно записать просто как «выражение, опц1, опц2, …».

Первая из таких опций связана с автоупрощением. Глобально автоупрощение регулируется переключателем simp (от «simplification» - упрощение), и по умолчанию оно включено; в любой момент его можно выключить, установив значение переключателя в false. Опция функции ev, одноимённая этому переключателю, позволяет включить упрощение для данного конкретного вычисления — вне зависимости от того, включено или выключено оно глобально:


Тут нужно отметить ещё, что вызов kill(all) не восстанавливает умолчательные значения переключателей; то есть если мы, к примеру, изменили значение переключателя simp, как в примере выше, то для того, чтобы вернуться к изначальному порядку вещей, установленному сразу после запуска Maxima, нам нужно не только сделать kill(all), но и вручную назначить simp:true.

Опция diff принудительно раскрывает все производные и полные дифференциалы; а опция derivlist(x, y, …, v) — производные относительно переменных, заданных в качестве её аргументов, а также полные дифференциалы (так как они не зависят ни от каких переменных):


Как видите, если из нескольких переменных из diff в derivlist() заданы не все, то раскрывается производная только по заданным переменным; это и понятно, так как выражения diff(f, x, 1, y, 1), diff(diff(f, x), y) и diff(diff(f, y), x) математически эквивалентны [по крайней мере, для «хороших» функций, — прим.ред]. Если же аргумент опции derivlist() вообще не является переменной дифференцирования, он просто игнорируется.

Опция nouns раскрывает вообще все несовершённые формы — и производные в том числе:


Опция float преобразовывает все рациональные числа в конечную десятичную запись; опция numer включает опцию float и, кроме того, приводит к десятичному виду многие математические функции от числовых аргументов:


Опция noeval блокирует сам этап вычисления как таковой; то есть её можно использовать для того, чтобы применить к выражению другие опции функции ev, не перевычисляя его. При этом опять-таки нужно понимать разницу между вычислением и упрощением:


Таким образом, мы можем принудительно упростить выражение, не перевычисляя его.

Опция eval — напротив, проводит дополнительно ещё один процесс вычисления. Здесь стоит поговорить подробнее о накопительном эффекте вычисления, который я уже демонстрировал выше. Так как в Максиме значениями символов могут выступать самые разнообразные выражения, то в эти выражения тоже могут входить некоторые символы, которые тоже могут иметь свои значения; и такая цепочка «вложенных значений» может продолжаться сколь угодно глубоко. Один вызов функции ev (без опции eval) опускается по этой цепочке в глубину на один уровень:


Напомню, что здесь ev(y), eval является сокращённой записью от ev(ev(y), eval), таким образом вычисление в этом выражении проводится трижды. Кроме того, хочу обратить ваше внимание на порядок назначения выражений символам; здесь существенно, что на момент задания каждого выражения входящий в него символ ещё не был определён — иначе в выражение автоматически подставлялся не сам символ, а его значение. Таким образом, если бы мы произвели эти же назначения в обратном порядке, то значением символа y стало бы xm+6 — безо всяких принудительных вычислений.

В продолжение разговора о накопительном эффекте и «цепочных» вычислениях придётся кстати переключатель infeval. Он заставляет ev перевычислять выражение до тех пор, пока оно не перестанет изменяться при последующих вычислениях. В частности, этот переключатель можно использовать и для того, чтобы разблокировать блокировку вычислений любой глубины вложения:


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

О других константных опциях и переключателях функции ev можно узнать из ? ev и ? evflag, а мы наверняка ещё рассмотрим многие из них позже, когда они будут более актуальны в контексте повествования.

Кроме константных значений есть ещё несколько видов опций. Первый из них — это имена специальных функций, которые занимаются упрощением или преобразованием математических выражений. Будучи упомянута по имени в качестве опции, такая функция просто применяется к вычисляемому выражению. Например, выражение, fullratsimp - это то же самое, что и fullratsimp(ev(выражение)). Полный список таких функций вы можете найти в ? evfun.

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


Также в качестве опции можно задать назначение символа или функции; все такие назначения действуют локально в пределах вычисляемого выражения, и все подстановки производятся параллельно:

Опция подстановки символа допустима не только в виде оператора присвоения, но и в виде равенства; сделано это, в частности, для того, чтобы в качестве подстановок можно было использовать решения, найденные функцией solve:


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



Персональные инструменты
купить
подписаться
Яндекс.Метрика