Математика. Настоящий учебник посвящен системе Mathematica прикладному пакету компьютерной алгебры, при помощи которого можно решать любые задачи, в которых в той или иной форме встречается математика
Скачать 4.43 Mb.
|
§ 1. Функциональная и операторная запись функций Для каждой функции дается: 1) краткое изложение ее сущности, 2) сокращенное определение одним словом, 3) условный знак ее. (Введение знаков позволит впоследствии сравнить построение ска- зок схематически). Вслед за этим следуют примеры. Примеры большей частью далеко не исчерпывают нашего материала. Они даны лишь как образцы. В.Я.Пропп, Морфология волшебной сказки В обычном математическом словоупотреблении, по крайней мере в боль- шинстве элементарных учебных текстов, слово функция используется как синоним термина отображение. Иными словами, считается, что функция F задается тройкой F = (X, Y, f ) или, в обычных обозначениях f : X −→ Y . При этом X является областью определения функции F , Y — об- ластью значений, а f состоит в сопоставлении каждому элемента x множества X единственного элемента y множества Y , обозначаемого f (x) и называемого образом элемента x под действием f . Для обозначения то- го, что x переходит в y под действием f , используется специальная стрелка x 7→ f(x). Запись образа x под действием f как f(x) c явным заключением аргумента в скобки называется функциональной, кроме нее для образа x под действием f часто употребляются операторные записи f x и xf , индексная запись f x и некоторые другие более специальные нотации, ис- пользующие особые символы, указывающие на применение функции, под- черкивающие симметрию между функцией и аргументом, etc. Например, в теории групп и теории Галуа чрезвычайно часто используется экспонен- циальная запись x f , в линейной алгебре и функциональном анализе — копуляционная запись hf, xi и т.д. До Кантора, Дедекинда и Пеано считалось, что функция задается фор- мулой или законом, но начиная с конца XIX века надолго восторжество- вала чисто экстенсиональная точка зрения, согласно которой f отождеств- ляется с графиком Γ(f ) = {(x, f(x)) | x ∈ X}. Как правило в математи- ческих текстах допускается вольность речи, состоящая в обозначении F и f одной и той же буквой: функция f . Тем не менее, математики твердо придерживаются того принципа, что область определения и область значений входят в определение функции. Иными словами, для того, чтобы две функции f : X −→ Y и g : U −→ V были равны, необходимо, чтобы X = U , Y = V и f (x) = g(x) для всех x ∈ X. Мы не обсуждаем здесь абсурдную методистскую терминологию, при которой областью значений функции называется ее образ f (X) = {f(x) | x ∈ X}. Множество всех отображений из X в Y обычно обозначается через Map(X, Y ) или Y X Однако даже в самой математике в некоторых случаях удобно исклю- чить область значений из определения функции. Получающийся при этом объект называется семейством. Иными словами, для того, чтобы два се- мейства f : X −→ Y и g : U −→ V были равны, необходимо, чтобы X = U и f (x) = g(x) для всех x ∈ X. В этом случае, конечно, f(x) = g(x) ∈ Y ∩ V , но не утверждается, что Y = V . Таким образом, семейство представляется 214 функцией, но является не функцией, а классом эквивалентности функций относительно отношения эквивалентности, забывающего область значений. В упомянутом выше школьном понимании функция определяется именно как семейство! Для семейств в математике обычно используется индексная запись, аргументы называются индексами, а образ x под действием f обо- значается через f x или f x , или еще как-нибудь в таком духе. Семействами являются векторы, матрицы и много других важнейших объектов. Компьютерная алгебра делает следующий шаг в том же направлении и исключает из понятия равенства функций не только область значений, но и область определения. Вернее, наподобие того, как это делается в школьной математике для вещественных функций, системы компьютерной алгебры считают, что у каждой функции имеется естественная область опре- деления, а именно множество всех выражений, для которых имеют смысл все функции, которые входят в определение функции f , определения всех фигурирующих в ее определении функций, etc. Иными словами, функция понимается как правило, алгоритм или инструкция, которая перерабаты- вает ввод в вывод, а откуда именно берется ввод, не конкретизируется. Две функции считаются равными, если они всегда перерабатывают один и тот же вход в один и тот же выход. Комментарий. Разумеется, такая установка становится возможной только потому, что Computer Science имеет дело исключительно с конечными объектами. В контексте бесконечных множеств подобная точка зрения невозможна просто по той причине, что совокупность всех объектов, над которыми можно произвести какую-то операцию, как правило, не является множеством. Тем самым, попытка сравнивать функции игнори- руя их область определения сразу порождает словесные артефакты и языковые ошибки известные как “теоретико-множественные парадоксы”. В языке Mathematica основной формой представления функций во всех случаях считается функциональная запись. При этом образ элемен- та x под действием функции f обозначается через f[x]. Однако, кроме того, в InputForm для этого образа существуют еще и две операторных записи, префиксная f@x и постфиксная x//f. В дальнейшем мы узнаем, что к тому же образу можно обратиться, вызывая его через конструкции чистой/анонимной функции. Разумеется, для случая, когда у исполь- зуемой функции уже есть имя — здесь, например, это имя "f" — эти кон- струкции не только не содержат ничего нового, но и являются более гро- моздкими, чем описанные ранее. Однако позже мы увидим, что они дают нам инструмент поразительной силы, позволяющий обращаться по име- ни к любой функции, не давая ей имени!!! Иначе говоря, образ f(x) можно ввести одним из пяти следующих эквивалентных способов: f[x] функциональная запись f (x) f @ x префиксная операторная запись f (x) x // f постфиксная операторная запись f (x) Function[z,f[z]][x] запись f (x) как значения чистой функции f[#]&[x] запись f (x) как значения анонимной функции 215 Следует иметь в виду, что с внутренней точки зрения операторные запи- си функций являются чисто лингвистическими конструкциями, идиомами используемыми в качестве сокращений функциональной записи, которая является единственной внутренней формой: Sin[x]===Sin@x===(x//Sin)===Function[z,Sin[z]][x]===Sin[#]&[x]. В этой формуле сразу бросается в глаза то, что (x // Sin) заключено в скобки, а Sin @ x — нет. Это связано со следующим: • Постфиксная форма // имеет весьма низкий приоритет, более низкий, чем все арифметические и логические операции. В большинстве случаев функция, примененная при помощи // будет применяться ко всему выражению в целом. Например, x+y//f интерпретируется как f[x+y], а не x+f[y]. Для того, чтобы получить x+f[y], нужно напечатать x+(y//f). • Префиксная форма @ имеет чрезвычайно высокий приоритет, более высокий, чем все арифметические операции и большинство других операций. Как правило функция f примененная при помощи @ будет при- меняться к первому символу, а не ко всему выражению в целом. Так, на- пример, f@x*y будет интерпретировано как f[x]*y, а вовсе не как f[x*y]. Для того, чтобы получить f[x*y], нужно напечатать f@(x*y). Низкий приоритет постфиксной операторной формы задания функции яв- ляется ее достоинством, а не недостатком. Мы, например, часто пользуемся постфиксной формой для просмотра или форматирования вывода. Дело в том, что напечатав в конце ввода // MatrixForm, // TableForm, или что- нибудь в таком духе, Вы можете post factum применить эти команды ко всему предшествующему вводу, без необходимости возвращаться к его на- чалу и ставить скобки. В то же время, за исключением обозначения ком- позиции, где она действительно чрезвычайно полезна, префиксная форма @ используется только в некоторых очень специальных ситуациях. Пояснение. Высокий приоритет @ связан с тем, что его использование в указанном смысле вторично. Основное значение этого оператора состоит в том, чтобы служить в качестве сокращения для композиции функций Composition. А именно, функ- ция Composition[f,g] представляет собой композицию функций f ◦ g. По определению (f ◦g)(x) = f(g(x)) — читается образ x под действием композиции функций g и f, именно в таком порядке!!!. Полная запись значения (f ◦g)(x) с использованием функции Compo- sition должна выглядеть следующим образом: Composition[f,g][x]. Ясно, однако, что это все равно будет переработано во внутреннию форму f[g[x]] и поэтому продвинутые пользователи пишут просто f@g@x, без всяких там скобок. С другой стороны, операция ◦ ассоциативна и обладает тем свойством, что композиция одной функции есть сама эта функция. Иными словами, Composition обладает атрибутами Flat и OneIdentity. В частности, это значит, что значение f (x) можно записать еще и так : Composition[f][x]. Так вот, f@x как раз и является сокращением этой записи. Как мы узнаем в следующих параграфах, все символы, кроме букв, цифр и $, и многие сочетания двух или трех символов интерпретируются Mathe- matica как операторы. Однако не для всех из них заданы алгоритм вы- числения или трансформационные правила. Это сделано для того, что- бы пользователь мог ввести операторные сокращения для наиболее часто встречающихся определенных им функций. 216 § 2. Специфика функций компьютерной алгебры Everything is a function. Steven Wolfram Многие языки программирования проводят строгие формальные раз- личия между функциями, операциями, операторами, командами, проце- дурами, типами или классами объектов и т.д. В свою очередь, скажем, операции столь же жестко подразделяются на арифметические операции, отношения, логические операции и т.д. Язык Mathematica переносит все подобные различия из области синтаксиса в область интерпретации. С лингвистической и, тем более с внутренней точки зрения любые преобра- зования объектов или формы их записи, любые модификации их значений или приписывания им свойств, любые группировки, любые контрольные и управляющие структуры, любые инструкции и предписания по дальнейшей работе системы, любые форматирования выражений, управление вводом и выводом, и пр., и пр., и пр. рассматриваются языком Mathematica как функции — или, что то же самое, как команды. С принципиальной точки зрения понятие функции в компьютерной ал- гебре постижимо разумом и гораздо ближе к общематематическому пони- манию, чем понятие функции в традиционных языках программирования. В то же время имеется немало прагматических моментов, которые от- личают использование функций в языке Mathematica: • Прежде всего, нужно понимать, что функции компьютерной ал- гебры работают не с объектами, а с выражениями. Это значит, что даже если два выражения являются просто двумя именами или дву- мя различными формами записи имени одного и того же математического объекта, (как, скажем, (x + 1) 2 и x 2 + 2 ∗ x + 1 в кольце многочленов), то переписывание выражения из одной формы в другую рассматривается как нетривиальная функция!!! При стандартных установках ядра такое переписывание отнюдь не происходит автоматически, а производится при помощи специальных структурных команд. • Для вычислений чрезвычайно важным является понимание того, что одна и та же функция или команда может вести себя различ- ным образом: дефолтные установки опций, используемые алгоритмы и т.д. могут меняться в зависимости от того, к какому типу объектов она при- меняется. Например, большинство числовых функций работают абсолютно по разному, в соответствии с тем, являются ли их аргументы точными це- лыми, рациональными или гауссовыми числами (с которыми производятся обычные безошибочные вычисления, основанные на модулярной арифмети- ке и пр.); точными алгебраическими числами (такими как Sqrt[2], Gold- enRatio, вычисления с которыми производятся при помощи чрезвычайно тонких алгебраических алгоритмов основанных на методах теории Галуа и алгебраической геометрии), точными вещественными или комплексными числами (такими как E, Pi, Cos[1] или 2*Pi*I — такие числа трактуют- ся как символы и обрабатываются полиномиальными алгоритмами) или, 217 наконец, приближенными вещественными или комплексными числами (для которых числовые функции по умолчанию используют все прелести округления, абсолютные и относительные погрешности и пр.) • Одна и та же функция может вызываться с разным количе- ством аргументов — в некоторых случаях с любым количеством аргу- ментов или вообще без аргументов. Например, ассоциативные арифмети- ческие операции, логические связки, команды List и Sequence и многие другие функции могут вызываться с любым конечным количеством аргу- ментов. В то же время многие другие функции (большинство числовых функций, многие предикаты и отношения, команды построения списков, структурные команды, управляющие структуры и т.д.) могут вызываться только со строго определенным количеством аргументов (обычно одним, двумя, тремя или четырьмя) строго определенных форматов и вызов их с любым другим количеством аргументов или с аргументами нештатных форматов рассматривается как синтаксическая ошибка. • Разные аргументы функций имеют абсолютно различный ста- тус. Простейшим из таких различий является различие между собственно аргументами, присутствие которых при любом вызове функции обязатель- но, и параметрами, некоторые из которых могут быть опущены. Кроме того, как мы узнаем в § 5, некоторые аргументы — в исключительных случаях, например, для команд построения графики два–три десятка ар- гументов!!! — (опции и атрибуты) и вовсе скрыты от начинающего поль- зователя. • Самым мощным — но и самым трудным для понимания и грамотного использования, по крайней мере для того, кто не знаком с λ-исчислением и не программировал в Lisp!! — инструментом программирования в язы- ках Maple и Mathematica являются чистые функции pure functions, у которых нет не только области определения, не только области значений, не только собственного имени, но даже аргументов (если быть совсем точ- ным, их аргументы не имеют имен, а являются просто щелями, в кото- рые можно засунуть что угодно!!) В чистой функции от функции остается только правило, по которому аргументу сопоставляется его образ. Чи- стые функции позволяют ссылаться по имени на функции, у которых нет обычных имен!! § 3. Основные классы функций языка Mathematica В этой главе мы перечислим функции действующих лиц в том порядке, в каком это диктуется самой сказкой. В.Я.Пропп, Морфология волшебной сказки Сейчас мы просто перечислим основные типы функций, в соответ- ствии с их интерпретацией, а не синтаксисом!!! Наша классифика- ция в основном следует классификации функций в разделе Built-in Func- tions встроенной помощи, хотя мы не всегда перечисляем функции в том 218 же порядке. Некоторые из этих функций детально обсуждаются в сле- дующих параграфах, в то время как некоторые другие относятся к пред- метной области, а не к языку. Поскольку между классами функций нет ярких языковых контрастов, некоторые функции описываются в несколь- ких подразделах (например, как структурные манипуляции и как числовые функции!) • Алгебраические и символьные вычисления (algebraic computa- tion). Это одна из самых многочисленных и важных групп функций, ко- торые покрывают практически всю школьную математику, значительную часть вузовской программы высшей математики и некоторые более специ- альные темы. ◦ Арифметические операции: Plus, Minus, Subtract, Times, Divide, Po- wer, Sqrt, NonCommutativeMultiply, etc. ◦ Итерационные операции Sum, Product, etc. ◦ Функции, связанные с многочленами: PolynomialQ, Variables, Expand, Coefficient, CoefficientList, CoefficientArrays, Exponent, etc. Предостережение. В языке Mathematica такие функции, как Coefficient, Variables, а также арифметические функции в кольце многочленов называются полиномиальными функциями. Мы избегаем это название, так как в русском — да и в английском!!! — языке выражение полиномиальная функция устойчиво используется для отображения K −→ K, c 7→ f(c), где f ∈ K[x] фиксированный многочлен. ◦ Арифметика многочленов: Factor, FactorList, PolynomialQuotient, PolynomialRemainder, PolynomialGCD, PolynomialLCM, PolynomialMod, Po- lynomialReduce, Resultant, GroebnerBasis, etc., etc., etc. ◦ Решение уравнений (equation solving): Solve, Roots, Root, RootSum, ToRadicals, Reduce, RootReduce, Eliminate, SolveAlways, ToRules, etc., etc. ◦ Символьное дифференцирование и интегрирование (symbolic calcu- lus): Limit, D, Dt, Derivative, Integrate, Series, O, DSolve, Residue, Maximize, Minimize, etc., etc. ◦ Символьные интегральные преобразования (integral transforms): FourierTransform, InverseFourierTransform, LaplaceTransform, Inver- seLaplaceTransform, etc., etc., etc., etc. • Структурные манипуляции (expression manipulation). Большая часть описанных здесь `функций' не являются функциями в математиче- ском смысле, так как они состоят либо в определении структуры выраже- ния, либо в переписывании одной формы представления объекта в другую. Однако с точки зрения Mathematica это один из важнейших классов функ- ций. ◦ Форма выражений и выделение их частей: FullForm, TreeForm, Head, Part, Level, Length, Depth, etc., etc. |