Математика. Настоящий учебник посвящен системе Mathematica прикладному пакету компьютерной алгебры, при помощи которого можно решать любые задачи, в которых в той или иной форме встречается математика
Скачать 4.43 Mb.
|
◦ Заголовки типов: Integer, Rational, Real, Complex, Symbol, String, List, etc., etc. 219 ◦ Названия доменов: Integers, Reals, Complexes, Rationals, Algebra- ics, Primes, Booleans, Interval, etc. ◦ Общие структурные манипуляции: Simplify, FullSimplify, PowerEx- pand, FunctionExpand, Refine, etc., etc., etc. ◦ Cтруктурные операции с многочленами Collect, Expand, ComplexEx- pand, Decompose, Factor, FactorTerms, etc., etc., etc. ◦ Cтруктурные операции с дробями: Denominator, Numerator, Together, Apart, ExpandDenominator, ExpandNumerator, ExpandAll, Cancel, etc., etc., etc. ◦ Cтруктурные операции в кольце Trig R тригонометрических многочле- нов: TrigExpand, TrigFactor, TrigFactorList, TrigReduce, ◦ Изменение формата (format transcription). Многие такие функции имеют имена формата SmthToSmth, ToSmth, FromSmth. Типичными приме- рами таких функций являются TrigToExp, ExpToTrig, etc., etc. • Булевы функции (boolean functions). Будевы функции принима- ют значения в домене Booleans= {True,False}. ◦ Булевы константы и логические операции (связки), т.е. функции с бу- левыми аргументами и булевыми значениями: True, False, Not, And, Or, Xor, Implies, LogicalExpand, etc. ◦ Побитовые логические операции: BitNot, BitAnd, BitOr, BitXor. ◦ Кванторы (quantifiers) ForAll, Exists, Resolve. ◦ Предикаты (predicates), которые понимаются как функции одного небулева аргумента с булевыми значениями (разумеется, в математике обычно говорит о предикатах от любого числа аргументов): AtomQ, EvenQ, IntegerQ, NameQ, NumberQ, NumericQ, OddQ, PrimeQ, StringQ, TrueQ, VectorQ. ◦ Отношения (relations, relational operators): MemberQ, Element, Equal, Unequal, Same, Unsame, Order, Greater, GreaterEqual, Less, Less- Equal, etc., etc. • Числовые функции (numeric functions) предназначены как для символьных, так и для численных вычислений. Если их аргументы явля- ются символами или точными числами, они всегда пытаются возвратить точные значения. Однако если их аргументы имеют формат приближен- ных вещественных или комплексных чисел, они работают как соответству- ющие приближенные функции. ◦ Константы E, Pi, Degree, I, GoldenRatio, Infinity, ComplexInfinity, DirectedInfinity, Indeterminate и случайные числа Random, SeedRandom, etc., etc., etc. Предостережение. Тонкость, которая может показаться весьма неожиданной тем, кто не знаком с компьютерной генерацией (псевдо)случайных чисел, состоит в том, что Random является точной, а не приближенной функцией!!! Это сделано для того, что- бы можно было использовать одно и то же случайное число в нескольких различных вычислениях, например в процессе тестирования программ. 220 ◦ Представление чисел: DigitCount, IntegerDigits, RealDigits, From- Digits, MantissaExponent, ContinuedFraction, FromContinuedFraction, etc. ◦ Численные функции (numerical functions): Abs, Sign, Max, Min, Round, IntegerPart, Floor, Ceiling, Rationalize, Re, Im, Arg, Conjugate. ◦ Элементарные функции: экспонента и логарифм Exp, Log все основ- ные тригонометрические Cos, Sin, Tan, Cot, обратные тригонометрические, гиперболические и обратные гиперболические функции. ◦ Специальные функции: в ядре Mathematica и пакетах содержатся определения сотен специальных функций таких, как гипергеометрические и связанные с ними функции, функции Бесселя, ортогональные многочле- ны, интегральные косинус и синус, эллиптические функции и интегралы, функции Матье, etc., etc., etc., etc., etc., etc. Мы не будем даже пытаться перечислять или описывать эти функции, так как обращение к ним ясно само по себе. ◦ Комбинаторные функции: Factorial, Binomial, Multinomial, Fibo- nacci, BernoulliB, StirlingS1, StirlingS2, PartitionsP, PartitionsQ, Signature, etc., etc., etc., etc. ◦ Арифметика целых чисел: FactorInteger, IntegerExponent, Mod, Quo- tient, PowerMod, Prime, PrimeQ, GCD, LCM, ExtendedGCD, etc., etc. ◦ Теоретико-числовые функции: EulerPhi, MoebiusMu, PrimePi, Divi- sors, DivisorSigma, JacobiSymbol, CarmichaelLambda, etc., etc., etc. • Приближенные функции (approximate functions) предназначе- ны для численных, а не символьных вычислений. В отличие от числовых функций приближенные функции заведомо используют приближенные ал- горитмы и даже для точных данных никогда не пытаются вычислить точ- ные значения. Название многих приближенных функций начинается с N. ◦ Приближенные вычисления (numerical calculation) и численное ре- шение уравнений (numerical equation solving): N, Chop, NSolve, NRoots, FindRoot, NSum, NProduct, NIntegrate, NDSolve, etc., etc., etc. ◦ Функции интерполяции (interpolation): Fit, FindFit, Interpola- tion, InterpolatingFunction, ListInterpolation, FunctionInterpola- tion, etc. ◦ Функции численной оптимизации (numerical optimization): NMaxi- mize, NMinimize, FindMaximum, FindMinimum, etc., etc., etc. ◦ Функции статистической обработки (data manipulation functions) вычисляют все обычные параметры выборок, рассматриваемые в теории вероятностей и математической статистике: Mean, Median, Variance, Quan- tile, StandardDeviation, etc., etc., etc. ◦ Численная обработка списков: Fourier, InverseFourier, ListConvol- ve, ListCorrelate, etc. 221 ◦ Функции управления точностью (numerical preсision functions). Многие из этих функций сами являются точными, но они служат для кон- троля ошибок приближенных вычислений и поэтому включаются в эту ка- тегорию: Precision, Accuracy, SetPrecision, SetAccuracy, PrecisionGo- al, AccuracyGoal, etc., etc., etc. • Команды работы со списками (list and matrix manipulation). Наиболее характерный для языка Mathematica класс функций. Мы счита- ем, что этот класс относится непосредственно к языку и детально обсуж- даем его в дальнейшем. Кроме того, сюда относятся команды построения таблиц и массивов, операции над векторами и матрицами и другие функ- ции линейной алгебры, а также операции над разреженными векторами и матрицами. ◦ Выделение частей списка Part, Extract. ◦ Вычеркивания Take, Drop, First, Last, Most, Rest, Delete. ◦ Вставки и замены: Insert, ReplacePart, Append, AppendTo, Prepend, PrependTo. ◦ Выборки: Select, Cases, DeleteCases, Count, Position. ◦ Сортировка списков: Sort, Order, Ordering, OrderedQ, Permutations, Signature, etc. ◦ Структурные манипуляции со списками Join, Flatten, Partition, Split, Reverse, RotateLeft, RotateRight, PadLeft, PadRight. ◦ Команды формирования списков: Range, Table, Array. ◦ Команды работы с разреженными списками: SparseArray, Normal, Ar- rayRules, etc. ◦ Форматирующие функции ColumnForm, TableForm, MatrixForm, etc., etc. ◦ Теоретико-множественные операции: Union, Intersection, Comple- ment, etc. ◦ Операции над векторами: Dot, Cross, Inner, Outer, Total, etc. ◦ Функции линейной алгебры: LinearSolve, NullSpace, LinearProgram- ming, LatticeReduce, Eigenvalues, Eigenvectors, Eigensystem etc., etc., etc. ◦ Матричные функции: Dot, Det, Minors, Tr, Transpose, MatrixPower, MatrixExp, MatrixRank, etc., etc., etc. • Процедурное программирование (flow control, procedural prog- ramming). Язык Mathematica полностью поддерживает все стили програм- мирования, среди прочего в ней есть все обычные операторы традиционных языков программирования: ◦ Присваивание и чистка (assignements): Set, SetDelayed, Unset, Clear, ClearAll, Remove, etc. ◦ Подстановки и замены (replacement rules and replacements): Rule, RuleDelayed, Replace, ReplaceAll, ReplaceRepeated, ReplaceList, etc. 222 ◦ Маркировки (tags): TagSet, TagSetDelayed, TagUnset, etc. ◦ Команды организации циклов: Do, For, While, etc. ◦ Управляющие структуры (control structures): GoTo, Label, Conti- nue, Break, etc. ◦ Конструкции локализации переменных (scoping constructs): Block, Module, With, Begin, End, etc. ◦ Условные операторы (conditionals): If, Which, Switch, etc. ◦ Удерживающие функции (holding functions): Hold, HoldAll, Hold Form, HoldComplete, HoldFirst, HoldRest, HoldPattern, etc. ◦ Вбрасывающие функции: Return, Throw, Catch, Sow, Reap, etc. • Функциональное программирование (functional programming). Значительно более характерным для языка Mathematica является функ- циональное программирование, которое приводит к более простым и более эффективным программам. Так как большинство этих конструкций явля- ются специфическими для языка Mathematica и либо отсутствуют в других языках программирования, либо присутствуют там в рудиментарном виде и под другими именами, то в дальнейшем мы все их детально обсуждаем. ◦ Чистые функции (pure functions): Function, Slot, SlotSequence, etc. ◦ Паттерны (pattern): Pattern, Blank, BlankSequence, BlankNullSe- quence, Condition, Count, etc. ◦ Композиции: Composition, InverseFunction, Identity, ComposeList, etc. ◦ Итерации: Nest, NestList, FixedPoint, FixedPointList, NestWhile, NestWhileList, Fold, FoldList, etc. ◦ Применение функций к спискам: Apply, Map, MapAt, MapAll, MapThread, MapIndexed, Scan, etc. ◦ Протаскивание и распределение действия функций: Thread, Through, Operate, Inner, Outer, Distribute, etc. • Генерация и форматирование графики и звука. Эти важнейшие функции имеют настолько развитую и сложную систему опций, что мы не будем даже пытаться описать или перечислить эти опции здесь. Кроме того, в ядре и, в особенности, в пакетах определено громадное количе- ство графических элементов возникающих в геометрии, комбинаторике, теории графов и т.д. ◦ Двумерная графика: Plot, ListPlot, ParametricPlot, etc., etc., etc. ◦ Трехмерная графика: Plot3D, ListPlot3D, ParametricPlot3D, etc., etc., etc. ◦ Другие графические форматы: ContourPlot, ListContourPlot, Densi- tyPlot, ListDensityPlot, etc., etc., etc. 223 ◦ Графические примитивы: Show, Graphics, Point, Line, Rectangle, Polygon, Circle, Disk, etc., etc., etc. ◦ Мультипликация: Animate, ShowAnimation, MoviePlot, MoviePlot3D, etc., etc. ◦ Генерация звука: Play, ListPlay, etc., etc. Кроме того, в ядре системы Mathematica имплементированы многие сотни (а вместе с пакетами — многие тысячи) других функций, кото- рые либо относятся к специальным предметным областям, либо управляют не работой ядра системы, а, скорее, его взаимодействием с внешним ми- ром (FrontEnd, системой, другими программами, файловой структурой и т.д.) В настоящем тексте мы практически не обсуждаем следующие типы команд, за исключением нескольких абсолютно необходимых: • системные команды; • команды ввода–вывода; • команды работы с файлами; • команды управления ядром; • команды управления записными книжками; • команды редактирования текста; • команды взаимодействия с другими программами (MathLink). По нашему мнению, только овладев в достаточной степени внутренними ко- мандами, относящимися собственно к языку, пользователь может начинать интересоваться значительно более сложными экстралингвистическими фе- номенами. § 4. Функции нескольких аргументов В этом параграфе мы обсудим, в чем с точки зрения языка Mathema- tica состоит различие между f[x,y], f[x][y] и f[ {x,y}]. Небрежность в формате задания аргументов функций является еще одной типичнейшей причиной ошибок программирования. Дополнительный нюанс здесь состо- ит в том, что, как мы увидим в следующих параграфах, многие функции в Mathematica могут вызываться с различным количеством аргументов. В этом месте чрезвычайно важно понять извращенную логику программи- стов, которая состоит в том, что функция определяется только тем, что она делает, а с кем она это делает — не имеет никакого значения. Как всегда, мы начинаем с напоминания того, что понимается под функ- цией нескольких аргументов в математике. Как обычно, рассмотрим отоб- ражение f : X −→ Y . Предположим, что X ⊆ X 1 × . . . × X n . В этом случае значение f ((x 1 , . . . , x n )) отображения f на n-ке (x 1 , . . . , x n ) обычно обозначается просто через f (x 1 , . . . , x n ), а f рассматривается как функ- ция n аргументов — или, как принято говорить в анализе, функция n переменных, хотя где здесь переменные и кто они такие, никто не знает. 224 Та операция стирания скобок, которую мы только что произвели, яв- ляется абсолютно недопустимой с точки зрения языка Mathematica. Дело в том, что теперь аргументами всех функций являются выражения. А с этой точки зрения у функции f , значения которой записываются в формате f[x1,...,xn], имеется n различных аргументов x 1 , . . . , x n , а вот у функции f , запись значений которой имеет формат f[ {x1,...,xn}], — всего один, а именно список (x 1 , . . . , x n )!!! Иными словами, теперь стирание второй пары скобок в выражении f ((x, y)) является грубейшей синтаксиче- ской ошибкой, которая, как правилов, приводит к тому, что система отказывается вычислять значение функции f , либо вычисляет совсем не то, что изначально имелось в виду. Иными словами, в языке Mathematica необходимо тщательнейшим образом различать следующие два понятия: • список аргументов (x 1 , . . . , x n ), который записывается в Mathema- tica как {x1,...,xn} или, в полной форме, List[x1,...,xn]; • последовательность аргументов x 1 , . . . , x n , которая записывается в Mathematica как x1,...,xn или, в полной форме, Sequence[x1,...,xn]. Как и для функций одной переменной основной формой представле- ния функций нескольких переменных считается функциональная за- пись, при которой значение функции f на последовательности аргумен- тов x 1 , . . . , x n обозначается через f[x1,...,xn]. Однако, кроме того, в InputForm для этого образа существуют еще префиксная операторная запись f@@x, при помощи оператора @@ называемого Apply. Для выраже- ния значения f[x,y] функции двух аргументов, кроме того, используется инфиксная операторная запись x ∼f∼y. Иначе говоря, образ f(x, y) можно ввести одним из трех следующих эквивалентных способов. Кро- ме того, в иллюстративных целях мы указываем еще и что происходит со списком {x1,...,xn} под действием рассмотренного нами в § 1 оператора @ Composition и под действием оператора /@ Map. Видно, что эти операторы применяются к функциям одного аргумента и дают результаты радикально отличающиеся от f (x, y). f[x,y] функциональная запись f (x, y) x ∼ f ∼ y инфиксная операторная запись f(x, y) f @@ {x,y} префиксная операторная запись f (x, y) f @ {x,y} префиксная операторная запись f ((x, y)) f /@ {x,y} префиксная операторная запись (f (x), f (y)) Таким образом, оператор @ Composition применяет функцию f к списку x с компонентами x 1 , . . . , x n , в то время как оператор @@ Apply применяет функцию f к последовательности элементов x 1 , . . . , x n — п(р)очувст- вуйте разницу!!! Наконец, оператор /@ Map применяет функцию f к каж- дой компоненте списка x. Дополнительные переливы смысла появляются вследствие того, что мно- гие функции могут вызываться с различным числом аргументов — даже если забыть про параметры!!! Скажем, операции Plus, Times, And, Or и 225 другие ассоциативные алгебраические операции могут вызываться с лю- бым количеством аргументов. При этом f(x) истолковывается как x, f (x, y) имеет обычные значения, f (x, y, z) истолковывается индуктивно как f (f (x, y), z) и т.д. Это значит, что напечатав, например, Plus[x,y] или, что то же самое, x ∼Plus∼y или, что то же самое, Plus@@{x,y}, мы вы- звали операцию сложения с двумя аргументами, что естественно, даст нам обычный результат x+y. В то же время, напечатав Plus[ {x,y}] или, что то же самое, Plus@ {x,y} мы вызвали эту функцию с одним аргументом и ответом будет {x,y}, скорее всего, не совсем то, что имелось в виду. Еще один способ задания функций нескольких переменных состоит в рассмотрении парциальных функций. Пусть, скажем, f : X × Y −→ Z функция двух аргументов. Тогда: • Зафиксировав x ∈ X мы получим функцию f(x, ∗) : Y −→ Z одного аргумента. Ясно, что функция f полностью определяется сопоставлением каждому x ∈ X соответствующей парциальной функции f(x, ∗). • Зафиксировав y ∈ Y мы получим функцию f(∗, y) : X −→ Z одного аргумента. Ясно, что функция f полностью определяется сопоставлением каждому y ∈ Y соответствующей парциальной функции f(∗, y). • В языке Mathematica мы выразили бы эти сопоставления с помощью понятия чистой/анонимной функции следующим образом. Парциальная функция f (x, ∗) записывается как Function[y,f[x,y]] или f[x,#]@. Точно так же парциальная функция f ( ∗, y) записывается как Function[x,f[x,y]] или f[#,y]@. Математики имеют обыкновение резюмировать только что сказанное следующей строкой канонических изоморфизмов: Map( |