Основные классы данных
Mathematica оперирует с тремя основными классами данных:
численными данными, представляющими числа различного вида; символьными данными, представляющими символы, тексты и математические выражения (формулы); списками — данными в виде множества однотипных или разнотипных данных. Каждый из этих классов данных в свою очередь имеет ряд специальных, более частных типовданных. На них мы остановимся более подробно.
Двоичные числа, биты и байты
Минимальной единицей информации в компьютерной технике является двоичная единица — бит. Она имеет представление в виде 0 или 1, удобное для реализации простейшими электронными схемами с двумя состояниями электрического равновесия (например, триггерами или иными ячейками памяти). Многоразрядные двоичные числа представляют собой набор цифр 0 и 1, например, 100110 или 111001. Каждый старший разряд относительно предыдущего имеет весовой коэффициент, равный 2. Именно с битами работает микропроцессор на нижнем уровне операций. Однако бит — слишком мелкая единица, не очень удобная в обращении. К тому же мы привыкли к куда более удобным и наглядным для нас элементам информации, таким как буквы, цифры, знаки арифметических операций, спецзнаки и символы псевдографики. В принципе, набор этих знаков, минимально необходимый для представления обычной текстовой и цифровой информации, содержит до 2 8 = 256 элементов. Каждый из них в компьютере представляется кодом от 0 до 255. Для задания таких кодов достаточно 8 бит (2^8=256), которые и образуют наиболее распространенную единицу представления информации — байт. 1024 байта образуют килобайт (Кбайт), 1024 Кбайт дают 1 Мбайт (мегабайт) и т. д. Широко применяется общеизвестный стандарт кодирования текстовой информации ASCII (American Standard Code for Information Interchange).Десятичные числа
К наиболее известным типам данных в математике относятся привычные нам десятичные числа (DECIMAL). Каждый разряд таких чисел имеет представление, заданное одной из арабских цифр — 0, 1, 2,..., 9. Весовой коэффициент старшего разряда относительно предшествующего равен 10. Количество цифр, представляющих число, может быть, в принципе, любым. Десятичные числа относятся к следующим основным типам.
Обозначение |
Тип чисел |
Примеры задания |
|
Integer |
Целочисленные |
123 |
-345 |
Rational |
Рациональные |
123/567 |
-23/67 |
Real |
Вещественные |
123. |
-123.45610 ^ 6 |
Complex |
Комплексные |
-3.5 + 0. |
56 I |
Целые числа
Целочисленные данные (Integer) — это целые числа, например 1, 2 или 123, которые представляются системой без погрешности и ограничения разрядности. Более того, арифметические операции над целыми числами система выполняет также без погрешностей и без ограничения числа цифр (рис. 3.1).
Рис. 3.1. Операции с целыми числами
Количество цифр, представляющих большое целое число, ограничено лишь его значением, но не какими-либо фиксированными форматами. Рациональные данные задаются отношением целых чисел, например 123/567, и также представляют результат точно. Поэтому система при символьных и численных расчетах всегда старается выдать результат в виде целых или рациональных чисел, там где это возможно:1000000/3000000 1/3 (124-1)/(455+1) 41/152Фактически целые числа произвольной разрядности в системах символьной математики представляются списками отдельных цифр. Особая организация списков повышает компактность представления больших целых чисел. Характерным примером работы с целыми числами большой разрядности является вычисление факториала n!=1*2*3*. . . *n. Примеры его вычисления уже приводились (см. рис. 1.16).
Числа с произвольным основанием
Для вычисления чисел с произвольным основанием используется конструкцияОснование^^ЧислоЧисло должно быть записано по правилам записи чисел с соответствующим основанием. Если основание больше 10, для обозначения значений чисел используются буквы от а до z. Наиболее известными из чисел с основанием системы счисления, превышающим 10, являются шестнадцатеричные числа (HEX — от слова hexagonal). Разряды таких чисел могут иметь следующие значения:
HEX 0123456789abCdef DECIMAL 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Каждый более старший разряд имеет весовой коэффициент относительно предыдущего разряда, равный 16. Примеры задания шестнадцатеричного и двоичного чисел:
16^^123abcde 305839326 2^^1010111 87Для представления чисел с произвольным основанием n (до 32) используется функция BaseForm[expr, n], которая возвращает выражение ехрг в форме числа с основанием n, которое указывается как подстрочный индекс. Примеры использования функции BaseForm:
BaseForm[87,2] 10101112 BaseForm[305839326,16] 123abcde16В дальнейшем мы будем использовать только десятичные числа.
Вещественные числа
Численные данные могут быть представлены также десятичными вещественными числами, которые могут иметь различную форму, например 123.456, 1.23456 10^2,12345.6 10^-2 и т. д. В общем случае они содержат мантиссу с целой и дробной частями и порядок, вводимый как степень числа 10. Как правило, вещественные числа в системах символьной математики могут иметь мантиссу с любым, но конечным числом знаков. Пробел между мантиссой и порядком эквивалентен знаку умножения *:23.456*10^100 2.345бх10^101 10^-100 1/ 100000000000000000000000000000 0000000000000000000000000000 0000000000000000000000000000000000000000000 10.^-100 1.x 10^-100Как принято в большинстве языков программирования, целая часть мантиссы отделяется от дробной части точкой, а не запятой. Mathematica производит операции с числами изначально как с целыми. Однако установка значка разделительной точки означает, что число должно рассматриваться как вещественное. Например, 1 — целое число, но 1. — уже вещественное число. Для представления выражения ехрг в форме вещественного числа используется функция N [ехрг] или N [ехрг, число_цифр_результата].
Примеры:
1/3 1/3 1./3 . 0.333333 N[1/3] 0.333333 N[2*Pi,50] 6.283185307179586476925286766559005768394338Вещественные числа всегда имеют некоторую погрешность представления результатов из-за неизбежного округления и существования так называемого машинного нуля — наименьшего числа, которое воспринимается как нуль. В терминах системы Mathematica говорят о приближении числовых данных как об их аппроксимации, хотя в отечественной литературе под аппроксимацией чаще подразумевают описание некоторой зависимости между данными достаточно приближенной аналитической зависимостью. Mathematica имеет две системные переменные, позволяющие вывести максимально и минимально возможные значения чисел, с которыми оперирует система:
$MaxMachineNumber 1.79769х10^308 $MinMachineNumber 2.22507х 10^-308Обратите внимание на то, что функция N [ехрr, m] позволяет получить число с практическим любым числом цифр результата m. Разработчики последней версии Mathematica 4 утверждают, что это верно при количестве цифр результата до одного миллиона, что с лихвой удовлетворяет требованиям подавляющего большинства расчетов и вычислений. Функции IntegerPart [x] и FractionalPart [x] обеспечивают возврат целой и дробной частей вещественного числа х:
N[Pi] 3.14159 IntegerPart[Pi] 3 FractionalPart[Pi] -3.+ Л N[FractionalPart[Pi]] 0.141593Еще одна функция RealDigits [x] возвращает список реальных цифр результата и число цифр целой части х:
RealDigits[N[2*Pi]] {{6, 2, 8, 3, 1, 8, 5, 3, 0, 7, 1, 7, 9, 5, 8, 6}, 1}Есть и множество других функций для работы с вещественными числами. Они будут рассмотрены в дальнейшем. В Mathematica 4 функция RealDigits имеет расширенные формы, например RealDigits [x, b, len, n]. Для получения цифр мантиссы введены функции MantissaExponent [x] и MantissaExpo-nent[x,b].
Комплексные числа
Многие математические операции базируются на понятии комплексных чисел. Они задаются в формеz=Re(z)+I*Im(z)или
z=Re(z)+i Im (z)где знак I (i) — мнимая единица (квадратный корень из -1), Re (z) — действительная часть комплексного числа, a Im (z) — мнимая часть комплексного числа. Пример задания комплексного числа:
2 + I3или
2 + 3*IМнимая часть задается умножением ее значения на символ мнимой единицы I. При этом знак умножения * можно указывать явно или заменить его пробелом — в последнем случае комплексное число выглядит более естественным. Функции Re [ z ] и Im [ z ] выделяют, соответственно, действительную и мнимую части комплексного числа z. Это иллюстрируют следующие примеры:
Re[3+2*1] 3 Im[3+2 I] 2Большинство операторов и функций системы Mathematica работают с комплексными числами. Разумеется, это расширяет сферу применения системы и позволяет решать с ее помощью различные специальные задачи — например, относящиеся к теории функций комплексного аргумента. Комплексные числа широко используются в практике электро- и радиотехнических расчетов на переменном токе. Символьные данные в общем случае могут быть отдельными символами (например a, b,..., z), строками (strings) и математическими выражениями ехрг (от expression — выражение), представленными в символьном виде. Символьные строки задаются цепочкой символов в кавычках, например "sssss". В них используются следующие управляющие символы для строчных объектов: \n— новая строка (line feed); \ t — табуляция. Это иллюстрируется следующими примерами:
"Hello my friend!" Hello my friend! "Hello\nmy\nfriend!" Hello my friend! "Hello\tmy\tfriend!" Hello my friend;Следует помнить, что управляющие символы не печатаются принтером и не отображаются дисплеем, а лишь заставляют эти устройства вывода выполнять определенные действия. Mathematica имеет множество функций для работы со строками, которые будут описаны в дальнейшем. Выражения в системе Mathematica обычно ассоциируются с математическими формулами, как показано в следующей таблице.
Запись на языке Mathematica |
Обычная математическая запись |
2*Sin[x] |
2*sin(x) |
2 Sin[x] |
2*sin(x) |
(а +b^2 + с^З) / (3*d - 4*e) |
(a + b 2 +с 3 )/(3d-4е) |
sqrt(2) |
Кореннь из 2 |
Integrate [Sin [x] , х] |
Интеграл sin(x) dx |
a b
c d
{х^2+у^2, 2*Sin [x] } — список из двух математических выражений. Как видно из этих примеров, элементы списков размещаются в фигурных скобках — открывающей { и закрывающей } . Списки могут быть с вложениями из списков — так получаются многоуровневые списки (двухуровневый список дает матрицу). Позже свойства и возможности списков будут рассмотрены детально. С помощью списков представляются множественные данные — массивы. В общем случае система Mathematica оперирует с объектами. Под ними подразумеваются математические выражения (ехрг), символы (symbols), строки из символов (strings), упомянутые выше числа различного типа, константы, переменные, графические и звуковые объекты и т. д. Каждый объект характеризуется своим именем — идентификатором. Это имя должно быть уникальным, то есть единственным. Существуют следующие правила задания имен: sssss — имя объекта, заданного пользователем; Sssss — имя объекта, входящего в ядро системы; $Sssss — имя системного объекта. Итак, все объекты (например функции), включенные в ядро, имеют имена (идентификаторы), начинающиеся с большой буквы (например Plus, Sin или Cos). Идентификаторы относящихся к системе объектов начинаются со знака $. Заданные пользователем объекты следует именовать строчными (малыми) буквами. Разумеется, под символами s...s подразумеваются любые буквы и цифры (но не специальные символы, такие как +, -, * и т. д.). Объекты (чаще всего это функции), встроенные в систему, принято называть внутренними или встроенными. Объекты, которые создает пользователь (в том числе используя внутренние объекты), называют внешними объектами. К ним, в частности, относятся процедуры и функции, составляемые пользователем, которые детально рассматриваются в дальнейшем.Функции, опции, атрибуты и директивы
К важному типу объектов принадлежат функции — объекты, имеющие имя и список параметров, возвращающие некоторое значение в ответ на обращение к ним по имени с указанием списка конкретных (фактических) значений параметров. В системах Mathematica 2/3/4 встроенные функции задаются в видеИ дентификатор_Функции [ol, о2, o3, ...]где ol, о2, оЗ... — объекты (параметры, опции, математические выражения и т. д.). Список входных параметров задается необычно — в квадратных скобках. В числе входных параметров могут быть специальные объекты — опции. Они задаются в виде
Имя_опции->3начение_опцииЗначением опции обычно является то или иное слово. Например, в функции построения графиков
Plot [sin[x] , {x, 0,20} ,Axes->None]опция Axes->None указывает на то, что отменяется вывод координатных осей (Axes). Функция Options [name] выводит для функции с идентификатором name список всех возможных для нее опций. Некоторые функции, например Sin, могут вообще не иметь опций, другие, такие как Solve, могут иметь целый «букет» опций:
Options [Sin] Options [Solve] {InverseFunctions -> Automatic, MakeRules -> False, Method -> 3, Mode -> Generic, Sort -> True, VerifySolutions -> Automatic, WorkingPrecision -> 00}В последнем случае характер возвращаемого функцией результата может сильно зависеть от значений опций. Назначение каждой опции мы рассмотрим в дальнейшем. В этой главе они нам пока не понадобятся. Каждый объект может характеризоваться некоторой совокупностью своих свойств и признаков, называемых атрибутами. Функция Attributes [name] возвращает список всех атрибутов функции с именем name, например:
Attributes [Sin] {bistable, NumericFunction, Protected} Attributes [Solve] {Protected}Как видите, для функции синуса характерны три атрибута: bistable — указывает на применимость в списках и таблицах; NumericFunction — указывает на отношение к числовым функциям; Protected — указывает на то, что слово Sin защищено от какой-либо модификации. Кроме того, в Mathematica 2/3/4 имеется понятие функций-директив. Эти функции не возвращают значений, а указывают, как в дальнейшем будут выполняться функции, работа которых зависит от директив. Синтаксис функций-директив тот же, что и у обычных функций. Применение опций и директив делает аппарат функций более гибким и мощным, поскольку позволяет задавать те или иные свойства функций и условия их выполнения. Это особенно важно при использовании функций в задачах графики и символьной математики. Константы являются типовыми объектами системы, несущими заранее предопределенное численное или символьное значение. Это значение не должно меняться по ходу вычисления документа. К численным константам относятся любые числа, непосредственно используемые в математических выражениях или программных объектах, например процедурах и функциях. Так, числа 1 и 2 в выражении 2*Sin [ 1 ] являются численными константами. Константы-числа не имеют идентификаторов. Идентификатором, в сущности, является само число. Его представление и хранится в памяти. Имеется также ряд именованных констант, которые можно рассматривать как функции без аргумента, возвращающие заранее заданное значение. Имена констант (и других объектов, например функций и переменных) представляются их идентификаторами — непрерывной строкой символов, отождествляемой с именем. В системе Mathematica большинство идентификаторов имеют естественный математический смысл и начинаются с большой буквы. Например, Е — это основание натурального логарифма. Используются следующие встроенные именованные константы: Complexlnf inity — комплексная бесконечность, которая представляет величину с бесконечным модулем и неопределенной комплексной фазой. Degree — число радиан в одном градусе, которое имеет числовое значение Pi/180. Е- основание натурального логарифма с приближенным числовым значением 2 . 71828.... EulerGamma — постоянная Эйлера с числовым значением 0.577216.... GoldenRatio — константа со значением (l+Sqrt[5] ) /2, определяющая деление отрезка по правилу золотого сечения. I — представляет мнимую единицу Sqrt [-1]. Infinity — «положительная» бесконечность (со знаком «минус» дает «отрицательную» бесконечность). Catalan — константа Каталана 0 . 915966.... Pi — число, имеющее значение 3 .14159... и равное отношению длины окружности к ее диаметру. Константы, имеющие значение, дают его в виде вещественного числа:
{N [Degree], N[E], N[Pi]} {0.0174533, 2.71828, 3.14159} {N[EulerGamma],N[GoldenRatio],N[Catalan]} {0.577216, 1.61803, 0.915966}Константы в описываемой системе используются вполне естественно, так что от дальнейшего их описания можно воздержаться.
Размерные величины
Mathematica позволяет оперировать с размерными величинами, которые широко используются в физических и химических расчетах. Размерные величины характеризуются не только численными значениями, но и единицами измерения, например Meter (метр), Second (секунда) и т. д. Последние могут стоять в числителе и в знаменателе выражений, представляющих размерные величины:1 Meter Meter 5Meter 5 Meter 0.5Second 0.5SecondМежду значением размерной величины и единицей измерения знак умножения можно не ставить. Это видно из приведенных выше примеров. Для облегчения ввода физических констант, представляющих собой размерные величины, в наборе файлов Mathematica можно найти файл PhysicalConstants.nb. При его загрузке появляется дополнительная палитра физических констант, показанная на рис. 3.2. Для ввода констант достаточно активизировать соответствующую кнопку с нужной константой. Будут введено выражение, задающее константу. Ниже представлены примеры ввода первой и последней констант, содержащихся в палитре, представленных в стандартной форме:
2.99792458000000028'*^8 Meter/ Second 2.99792х108 Meter/ Second 6. 9599 x 108 Meter 6.9599xl08 MeterСледует отметить, что без острой необходимости применять размерные величины не следует, поскольку они усложняют математические выражения и зачастую не позволяют выполнять с ними символьные преобразования. Рекомендуется нормировать выражения (формулы) так, чтобы результаты их вычисления имели безразмерный вид.
Рис. 3.2. Дополнительная палитра физических констант
Переменными в математике принято называть именованные объекты, которые могут принимать различные значения, находящиеся в определенном множестве допустимых значений. Подобно этому, переменными в системе Mathematica являются именованные объекты, способные в ходе выполнения документа неоднократно принимать различные значения — как численные, так и символьные. При этом символьные значения переменных, в отличие от обычных языков программирования, могут представлять собой как исполняемые математические выражения ехрг, так и некоторые обобщенные классы функций и объектов. Например, переменная может представлять графический объект, такой как изображение трехмерной поверхности, или звуковой объект, при активизации которого исполняется звук. Значением переменных могут быть также множественные объекты — списки. Имена переменных называют их идентификаторами. Они должны быть уникальными, то есть не совпадать с именами директив, атрибутов, опций и функций в ядре системы. Имена переменных должны начинаться с буквы. Общеприняты, скажем, имена х и у для функциональной зависимости у (х) или представления графиков, f — для функций. Желательно назначать именам переменных смысловые значения, например xcoordinaate или ycoordinate для координат точки. Все сказанное об идентификаторах объектов справедливо и для идентификаторов переменных, поскольку переменные — распространенные виды объектов.
Особенности применения переменных
В отличие от переменных в математике, каждая переменная в системе Mathematica, как и в любой системе программирования, всегда отождествляется с некоторой физической областью памяти, в которой и хранится значение переменной. Для уменьшения объема памяти применяются различные способы компактного размещения информации. Надо помнить, что и имя переменной занимает определенную область памяти. Распределение памяти под переменные — динамическое. Это означает, что местоположение ячеек памяти и объем памяти под ту или иную переменную не фиксированы, а меняются в ходе выполнения задачи. Заранее объявлять тип переменной не требуется. Он определяется операцией присваивания переменной некоторого значения. Такой подход упрощает построение программ и естественен при использовании переменных в обычной математической литературе. Без особых на то указаний переменные в системе Mathematica являются глобальными. Это означает, что после определения переменной ее значение можно изменить в любом месте документа или программы. Переменная появляется как действующий объект только после ее первого определения или задания. Определения переменных выполняются с помощью операции присваивания, вводимой знаком равенства:var = valueЗдесь var — имя переменной, value — ее значение. Ниже представлены основные операции по присваиванию переменным значений: х = value — переменной х присваивается вычисленное значение value; х = у = value — вычисленное значение value присваивается переменным х и у; x:=value — присваивание переменной х невычисленного значения value; х =. — с переменной х снимается определение. Примеры (комментарий ln[...] опущен): g = Plot[Sin[x],{x,0,20}] — переменной д присваивается значение в виде графического объекта; у = 1 + х ^ 2— переменной у присваивается символьное значение в виде математического выражения (1 + х ^ 2); z= {1, 2, х, a + b}— переменной z присваивается значение в виде списка, содержащего четыре элемента. Различие в присваивании переменным значений с помощью знаков «=>> и <<:=» иллюстрируют следующие примеры:
а=12; b=а 12 с:=а с 12 а=15; b 12 с 15Как видите, после первоначальных присваиваний b=а и с: =а обе переменные, b и с, имеют значение 12. Однако после присваивания переменной а нового значения (15) переменная b, которой было присвоено вычисленное значение а, остается равной 12, а переменная с, которой было присвоено невычисленное значение а, становится равной 15. Особо обратите внимание на то, что возможно снятие с переменной определения с помощью символов «=.» или функции Clear [var]. В символьной математике это очень полезная возможность, поскольку нередко переменные с одним и тем же именем в разных частях программы могут иметь разный смысл и представлять объекты, требующие значительных затрат памяти. Более того, эти объекты сохраняются даже при использовании команды New при переходе к подготовке нового документа. Поэтому рекомендуется всякий раз удалять определения переменных, как только их использование завершается. Это предотвращает возникновение конфликтов между одноименными переменными и освобождает память. Переменные могут быть локальными, то есть действующими только в пределах объекта, в котором они объявлены. Таким объектом может быть функция или процедура со списком входных параметров. Такие объекты мы рассмотрим позже.
Оценивание переменных и операции присваивания
Специфику математических выражений в системе Mathematica составляет возможность их оценивания и изменения в соответствии с заложенными в ядро системы правилами математических преобразований. В итоге после изменения значение выражения, которое присваивается переменной, может быть совсем иным, чем до оценивания. Поэтому в целом для определения переменных используют описанные ниже конструкции. Основная функция Set [ Ihs, rhs ] имеет аналогичные по действию упрощенные операторы: Ihs = rhs — вычисляет правую часть rhs и присваивает ее значение левой части Ihs. С этого момента Ihs замещается на rhs всюду, где бы этот идентификатор ни появился; {11, 12, ...} = {rl, г2, ...} — вычисляет ri и назначает полученные результаты соответствующим 11. Функция задержанного присваивания SetDelayed[lhs,rhs] может быть заменена аналогичным по действию оператором Ihs : =rhs, который назначает правой части rhs роль отложенного значения левой части Ihs. При этом rhs содержится в невычисленной форме. После этого, когда появляется идентификатор Ihs, он заменяется на значение rhs, вычисляемое каждый раз заново. При задержанном (отложенном) присваивании вывода нет, тогда как при обычном немедленном присваивании lhs=rhs значение rhs вычисляется немедленно и результат выводится в строку вывода. Функция присваивания верхнего уровня UpSet [Ihs, rhs] применяется в виде lhs A =rhs. При этом левой части Ihs присваивается значение правой части rhs, причем это значение связывается с символами, которые появляются на первом уровне вложенности в Ihs. И, наконец, функцию отложенного присваивания верхнего уровня UpSetDelayed[lhs, rhs] может заменить оператор lbs^ :=rhs. При этом величина rhs выполняет роль отложенного значения Ihs, и связывается это присваивание с символами, которые появляются на первом уровне вложенности в Ihs. Отметим еще одну важную конструкцию SetOptions [s, namel->valuel, name2->value2, . . . ], которая устанавливает для символа s указанные опции, определяемые по умолчанию. Применение различных типов операций присваивания способствует большей гибкости системы. Различия между этими операциями на первый взгляд несущественны, но они принципиальны, и это станет понятно после более детального знакомства с символьными преобразованиями и приобретения практики работы с системой. Имеются также системные переменные, значениями которых являются данные о системе и ее работе, например версия применяемой операционной системы, текущая дата, время в данный момент, машинная точность вычислений и т. д. Многие из таких переменных имеют отличительный знак $ перед своим именем. Такие переменные более подробно будут рассматриваться в дальнейшем.
Операторы и функции
Операторы и функции являются основными кирпичиками в построении математических выражений, которые вычисляются или преобразуются системой Mathematica. Кроме того, это важнейшие элементы языка программирования системы. В данном разделе мы познакомимся с этими объектами.
Математические выражения в системе Mathematica записываются с помощью операторов и функций. Операторы (от слова operator — исполнитель) являются элементами записи математических выражений, указывающими на то, какие действия производятся над символьными или числовыми данными. Когда эти данные используются совместно с операторами, их называют операндами. Выражения, составленные из операторов, операндов и функций, способны возвращать результат своего вычисления. К примеру, если вычисляется сумма 2+3, то знак «+» является оператором, числа 2 и 3 — операндами, а вся запись 2+3 — выражением. Сами по себе операторы не возвращают какого-либо значения. Существуют общепринятые приоритеты выполнения операций, например, в первую очередь выполняются сложение и вычитание, затем умножение и деление и далее другие операции. С помощью круглых скобок можно изменять последовательность выполнения действий, например, в выражении (2+3) М вначале будет вычислено 2+3, а затем уже результат будет умножен на число 4. В сомнительных случаях применение скобок особенно желательно, например 2^2+3 даст 7, а 2^ (2 + 3) даст 32. Ниже перечислены основные операторы для выполнения арифметических операций (х, у и z — операнды, задающие данные, над которыми выполняются вычисления):x+y+z Сложение x-y-z Вычитание х*у*z или x у z Умножение х/у Деление х^у Возведение х в степень у Expr //N Дает приближенное (с установленной точностью и формой) значение выражения ехргПолезно отметить, что знак пробела является арифметическим оператором умножения, если по обе стороны от него стоят операнды. Как уже отмечалось, при выполнении вычислений особая роль принадлежит символам «%». Эти символы как сами по себе, так и в качестве аргументов функций используются для указания на применение результата предшествующих операций: % — возвращает результат последней операции; %% — возвращает результат предпоследней операции; %...% — возвращает результат операции, выполненной в строке, отстоящей от конца на число повторений символа «%»; %n — возвращает результат операции в строке n. Нетрудно заметить, что применение этих символов облегчает выполнение последовательных вычислений. Как уже отмечалось, для представления арифметических выражений ехрг в виде вещественного результата используется функция N[expr,m]. Можно также задать вычисление любого выражения в численном виде, используя выражение ехрг //N:
1/3+2/7 13/21 1/3+2/7 //N 0.619048Таким образом, используя функцию N[expr,m] или вывод с помощью символов //N, можно организовать вычисления в режиме калькулятора, находясь в среде оболочки системы. Если х имеет вещественное значение, то функция
MantissaExponent[x]возвращает список, содержащий мантиссу и порядок приближенного вещественного числа х. Примеры:
123.456 10^10 1.23456 х1012 MantissaExponent[%] {0.123456, 13}
Арифметические вычисления с повышенной точностью
Важное достоинство систем символьной математики — выполнение арифметических вычислений с произвольными разрядностью и точностью. Хотя на деле они ограничены объемом ОЗУ, но для современных компьютеров с объемом ОЗУ в единицы и десятки мегабайт вряд ли можно столкнуться со случаем, когда ограничения по разрядности и точности становятся существенными. Следующие две функции, Rationalize [х] и Rationalize [x, dx], дают приближение для числа х в виде рациональных чисел. Вторая из этих функций задает приближение с заданной точностью dx. Mathematica может работать с большими числами и выполнять определенные операции с очень высокой точностью. Примеры, приведенные на рис. 3.3, иллюстрируют эти возможности. Как видно из примеров представления рациональных чисел, результат приближения зависит от заданной погрешности. Чем она меньше, тем большие значения целых чисел в числителе и знаменателе результата разыскивает система. Функция Rationalize открывает широкие возможности для разработки целочисленных алгоритмов вычислений, позволяя легко получать рациональные приближения для наиболее распространенных числовых констант — на рис. 3.3 примеры этого даны для числа 8. Обратите внимание на последние два примера — вычисление факториала достаточно большого числа. Первый результат целочисленный: он занял целых три строки, но зато он точен. С помощью функции N [ехрг] результат всегда можно представить в виде большого вещественного числа — но приближенного. При этом может использоваться научная форма представления чисел — с мантиссой и порядком.
Рис. 3.3. Примеры представления чисел в разных формах
Укороченная форма записи арифметических операций
Спецификой систем Mathematica являются арифметические операторы с укороченной формой записи, объединяющие операцию присваивания с арифметической операцией. Эти довольно специфические операторы, хорошо известные пользователям языка С, представлены ниже вместе с соответствующими им функциями.
Функция |
Оператор |
Назначение |
Increment [i] |
i++ |
Увеличивает значение i на 1 после использования i в выражении |
Decrement [i] |
i -- |
Уменьшает значение i на 1 после использования i в выражении |
Preincrement [i] |
++i |
Увеличивает значение i на 1 до использования i в выражении |
PreDecrement [i] |
--i |
Уменьшает значение i на 1 до использования i в выражении |
AddTo[x,d] |
x += dx |
Прибавляет dx к х и возвращает новое значение х |
SubtractFrom[x,dx] |
x -= dx |
Отнимает dx от х и возвращает новое значение х _ |
TimesBy
[х, с]
|
X
**= 'С
|
Умножает
х на с и возвращает новое значение х
|
DivideBy
[х, с]
|
X
/= С
|
Делит
х на с и возвращает новое значение
х
|
Ввод (In) |
Вывод (Out) |
i=0 |
0 |
++i; ++i; ++i |
3 |
i=0; i++; i++; i++ |
2 |
i=5 |
5 |
-- i |
4 |
i=5 |
5 |
i -- |
5 |
i -- |
4 |
x=5 |
5 |
x+=0 . 5 |
5.5 |
x-=0 . 5 |
5. |
x*=2 |
10. |
x/=5 |
2. |
Основные арифметические функции
Для выполнения арифметических действий в системах Mathematica 3/4 определены следующие арифметические функции: Divide [х, у] — возвращает результат деления х на у эквивалентно выражению х у ^ -1; Plus[x, у,...] — возвращает сумму элементов списка; PowerModta, b, n] — возвращает Mod[a ^ b, n]. Для b<0 возвращает инверсию остатка; Times [х, у,...] — возвращает произведение аргументов х*у*...; Mod [m, n] — возвращает остаток от деления m на п. Результат имеет такой же знак, как п. Ниже представлены примеры применения арифметических функций.
Ввод (In) |
Вывод (Out) |
Divide [1. ,3] |
0.333333 |
Mod [123, 20] |
3 |
Mod [123, -20] |
-17 |
Mod[-123,20] |
17 |
Plus[2,3,4] |
9 |
Times [2, 3,4] |
24 |
Пример обмена переменных значениями:
а=1;b=2; {а,b}={b,а}; {а,b} {2, 1}Следующие функции служат для приведения вещественных чисел к ближайшим целым по определенным правилам: Ceiling [х] — возвращает значение наименьшего целого числа, большего или равного х; Floor [х] — возвращает наибольшее целое число, не превышающее данного х; Quotient [n, m] — возвращает целое значение n/m, определяемое как Floor[n/m]; Round [х] — округляет х до ближайшего целого. Хотя аргументами этих функций указано значение х, под ним можно понимать список вещественных чисел. Следующие примеры поясняют это и наглядно иллюстрируют правила приведения к целым числам.
Ввод (In) |
Вывод (Out) |
Ceiling [{-5. 9, -5..1, 5, 5.1, 5.9}] |
{-5, -5, 5, б, 6} |
Floor [{-5. 9, -5.1,, 5, 5.1, 5.9}] |
{-6, -6, 5, 5, 5} |
Round[{-5.9, -5.1,, 5, 5.1, 5.9}] |
{-6, -5, 5, 5, 6} |
Ввод (In) |
Вывод (Out) |
LCM[124,12,6] |
372 |
GCD [144, 12, 6] | 6 |
Divisors [123] | {1,3,41,123} |
DivisorSigma [17,3] | 129140164 |
ExtendedGCD [144,12] | {12, {0,1}} |
Ввод (In) |
Вывод (Out) |
Factorial [10] |
3628800 |
20! |
2432902008176640000 |
10!! |
3840 |
20!//N |
2.4329Х10 18 |
Функции генерации случайных чисел
Для реализации статистических методов моделирования используются случайные числа. Система имеет генератор псевдослучайных чисел, доступ к которому обеспечивают следующие функции: Random [ ] — возвращает равномерно распределенное псевдослучайное число типа Real в интервале от 0 до 1; Random [type, range] — дает псевдослучайное число указанного типа type, лежащее в указанном интервале range. К возможным типам относятся Integer, Real и Complex. По умолчанию принят интервал от 0 до 1. Можно задать интервал явно в виде {min, max}; спецификация интервала в виде max эквивалентна {0, max}; SeedRandom[n] — сбрасывает (устанавливает в начальное состояйие) генератор случайных чисел, используя целое п как начальное число; SeedRandom [ ] — устанавливает генератор, используя в качестве начального числа текущее время. Хотя генерируемые числа не являются строго случайными, их количество в повторяющейся последовательности очень велико. Использование специальной установки начального состояния генератора, например по времени дня, делает повторение последовательности практически невозможным. Для проверки равномерности распределения большого массива случайных чисел можно задать с их помощью случайные координаты и затем построить точки, соответствующие координатам (х, у). Рисунок 3.4 наглядно показывает, как это делается для массива из 10 000 случайных точек. О равномерности распределения случайных чисел говорит равномерность распределения плотности точек на графике.
Рис. 3.4. Графическая иллюстрация распределения точек со случайными координатами (х, у)
Возможно, читателю не сразу понятны графические средства, использованные в документе, показанном на рис. 3.4. Это не беда — в последующих уроках они будут описаны довольно подробно.Функции выявления погрешностей и анализа структуры чисел
Следующие функции, опции и директивы используются, в основном, для выявления погрешностей вычислений и уточнения структуры чисел: Accuracy [х] — возвращает количество десятичных цифр справа от десятичной точки числа х; EvenQ [expr] — возвращает значение True, если expr есть четное число, и False — в противном случае; IntegerDigits [n] — возвращает список десятичных цифр целого числа n; IntegerDigits [n,b] — возвращает список цифр целого числа п в записи по основанию b; IntegerDigits [n, b, k] — возвращает список длиной k, содержащий самые младшие (наименьшие) значащие цифры в n; Precision [x] — возвращает количество точных знаков в числе х. Поясним применение этих функций следующими примерами.
Ввод (In) |
Вывод(Out) |
Accuracy [123 . 456] |
14 |
EvenQ [2*3+2] |
True |
EvenQ [2*3+3] |
False |
IntegerDigits [12345] |
{1, 2,3, 4, 5} |
IntegerDigits [12345, 16] |
{3, 0,3, 15} |
IntegerDigits [12352 , 16] |
{3, 0,4, 0} |
IntegerDigits [12352 ,2] |
{1,1,0,0,0,0,0,0,1,0,0,0,0,0,0} |
Precision [123. 452] |
16 |
Save["filename", fl, f2, ...]После этого функция пользователя становится внешней функцией. При этом для ввода таких функций в текущий документ (notebook) достаточно вызвать файл с именем filename:
<<filenameРекомендуется создавать файлы с типовым расширением .т. Такие файлы входят в пакеты расширений системы. Имя файла нужно задавать по общепринятым для MS-DOS правилам, то есть при необходимости указывать логическое имя дисковода и путь к файлу, например, так:
<<D: \MAT\myfunc .mСоздание внешних функций по существу означает возможность расширения системы и ее адаптации к решению типовых задач конкретного пользователя. Как уже отмечалось, в систему входит мощная библиотека внешних расширений, и каждый пользователь может пополнить ее своими собственными библиотеками расширений. Функции пользователя могут быть рекурсивными, то есть допускать в своем теле обращение к самим себе. Это связано с тем, что функция становится объявленной сразу же после задания своего имени со списком параметров. Рекурсия — мощный прием программирования, но злоупотреблять им не стоит. Многие рекурсивные алгоритмы более эффективно реализуются без рекурсии, с применением средств процедурного программирования, например циклов. Функции пользователя можно задавать и выводить на печать как на языке системы, так и на некоторых общепринятых языках программирования, например Fortran, С или ТеХ. Для этого существует ряд функций преобразования, в имена которых входит слово Form (форма) и название языка для записи функций. Основные из них — это CForm [expr], FortranForm [expr ] и TeXForm [expr]. С их помощью выражения можно преобразовать в форму, принятую для языков программирования С, Fortran и ТеХ. При преобразовании в форму языка ТеХ греческие буквы заменяются их латинскими именами, например alpha, Alpha, beta, Beta, gamma и т. д. К сожалению, в отличие от систем класса MathCAD и Maple V R3, вывод математических формул в их полностью естественном виде не предусмотрен, хотя многое для этого уже сделано. Для преобразования формул и данных, записанных на языке системы Mathematica и хранящихся в текстовых файлах, в другие формы используются следующие функции: Splice ["file.rar"] — читает текстовый файл file.mx, интерпретирует его фрагменты, заключенные в ограничители <*...*>, и пишет текстовый файл file.*, в котором эти фрагменты преобразованы в формат, определяемый расширением х (с — С, f — Fortran, tex — ТеХ); Splice ["infile", "outfile"] — то же, но с раздельным заданием имен входного и выходного файлов. Таким образом, система Mathematica может общаться с другими программами, написанными на языках программирования, получивших распространение в практике реализации математических расчетов. Этому во многом способствует возможность преобразования форматов данных и результатов вычислений в различную форму, характерную для используемой внешней системы. К примеру, если вы работаете с программами на языке Fortran, то следует использовать соответствующий формат представления данных и результатов вычислений. Mathematica может общаться также с иными системами, например текстовыми редакторами. К примеру, для передачи содержимого каких-либо ячеек в текстовый редактор Write, входящий в оболочку Windows, достаточно выделить эти ячейки и поместить их в буфер обмена, используя команду Сору из меню Edit. После этого надо запустить текстовый редактор и с помощью команды Edit | Paste поместить в окно редактирования содержимое ячеек. Если оно символьное, то с помощью редактора можно записать полученный документ с расширением .txt, то есть в стандартном текстовом формате, с которым работает большинство DOS-приложений. Логическими принято называть операции, отражающие чисто логическое соответствие между данными. В обиходном языке эти связи выражаются утверждениями типа «да» или «нет». Например, на вопрос «Сын вырос выше отца?» мы можем ответить «да» или «нет». В математике (да и в информатике) принято характеризовать логическое соответствие утверждениями True («Верно», «Истина» или «Да») и False («Неверно», «Ложь» или «Пет»). Слова True и False являются символьными константами, отражающими результаты логических операций и в системе Mathematica. Для осуществления логических операций используются следующие логические операторы:
Равенство (например, а == b) ! = Неравенство > Больше (например, b > а) >= Больше или равно < Меньше <= Меньше или равноВозможны следующие формы применения операторов сравнения:
а == b == с а != b != с х < у < z и т. д.Результатом вычисления этих выражений является выдача логических значений True или False. Это демонстрируют следующие примеры.
Ввод (In) |
Вывод (Out) |
2=2 |
True |
a=a |
True |
a=b |
a == b |
2=3 |
False |
2<3 |
True |
2>3 |
False |
2!=3 |
True |
2+1==3==4-1 |
True |
Ввод (In) |
Вывод(Out) |
And [True , True , True ] | True |
True && True && False | False |
Not [True] |
False |
Not [False] |
True |
Or [True, True, False] |
False |
2==2 && 3==3 |
True |
True && True |
True |
And[l,l,0] |
11111 1 0 |
And[l,l,0] |
1 && 1&& 0 |
Ввод (In) |
Вывод (Out) |
Positive [2-3] |
False |
Equal [1+2, 4-1] |
True |
Equal [1+2, 2] |
False |
Greater [5, 4] |
True |
Greater [5, 4,3] |
True |
Greater [5, 4, 9] |
False |
Less [3,2+3] |
True |
Positive [2] |
True |
Negative [-2] |
True |
Neganbve[2] |
False |
NonNeganive [ -2 ] |
False |
NonNegative[2] |
True |
Xor[ True, True] |
False |
Xor [False , False] |
False |
Xor [True, False] |
True |
Функции комплексного аргумента
Элементарные функции в системе Mathematica могут иметь аргумент в виде действительного числа х или комплексного z. Аргументы указываются как параметры функций в квадратных скобках. Прежде всего отметим функции для работы с комплексными числами z: Abs[z] — возвращает модуль комплексного числа z; Arg [ z ] — возвращает аргумент комплексного числа z; Conjugate [z] — возвращает комплексно-сопряженное с z число; Directedlnf inity [] — представляет бесконечную числовую величину с неопределенным направлением на комплексной плоскости; Directedlnfinity[z] — представляет бесконечную числовую величину, направление которой на комплексной плоскости определяется фазой комплексного аргумента z; Im [ z ] — возвращает мнимую часть комплексного числа z; Re [ z ] — возвращает вещественную часть числа z. Далее приведены примеры операций с комплексными числами в непосредственном режиме.
Ввод (In) |
Вывод (Out) |
z1 : =2+1*3; |
|
z2: =4+1*5; |
|
N[zl+z2] |
6. + 8.1 I |
Re [2+1*3] |
2 |
H[Im[z2]J |
5. |
N[zl/z2] |
0.560976 + 0.0487805 I |
N[Abs[zl*z2]] |
23.0868 |
Con j ugate [ z 1 ] |
2-31 |
N[zl/0] Power::infy : Infinite expression 1/0 encountered. ComplexlnfinityИтак, в этом случае система выдает сообщение об ошибке, но после него возвращает константу Complexlnfinity, означающую комплексную бесконечность. Элементарные функции, надо полагать, хорошо известны читателю, взявшемуся за изучение Mathematica. Полный набор этих функций с их синтаксисом дан в приложении. Отметим, что в Mathematica имена элементарных функций записываются с большой буквы, а их аргументы задаются в квадратных скобках. Следующие примеры иллюстрируют сказанное.
Ввод (In) |
Вывод (Out) |
Sqrt[2] |
Sqrt[2] |
Sqrt[2.] |
1.41421 |
2*Sin[l] |
2 Sin[l] |
N[2*Sin[l]] |
1.68294 |
Log[Exp[l]] |
1 |
Simplif у [Sin [x] /Cos [x] ] |
Tan[x] |
ComplexExpand [ Sin [ a+b* I ] ] |
Cos[b] Sin[a]+ I Cosfa] Sinh[b) |
Работа с объектами
В этом разделе мы познакомимся с понятием объектов и научимся работать с ними. Объект — понятие обобщенное. Под ним может подразумеваться оператор или функция, рисунок (графический объект) и т. д. Объекты могут иметь ряд свойств, определяющих их назначение и поведение.
Различные объекты системы будут более подробно описаны в дальнейшем по мере знакомства с системой. Полный список объектов, заданных в ядре системы, легко получить, используя команду ? * (ниже приведены лишь начало и конец этого списка):?* Abort AbortProtect Above Abs AbsoluteDashing AbsolutePointSize $Version $VersionNumberМожно также получить список всех определений на заданную букву, используя команду ?S*, где S — любая буква латинского алфавита. Ниже дан пример вывода всех определений ядра на букву U:
?U* UnAlias Unevaluated Update Underflow Uninstall UpperCaseQ Underoverscript Union UpSet UnderoverscriptBox Unique UpSetDelayed Underscript Unprotect Upvalues UnderscriptBox UnsameQ Using Unequal UnsetАналогичные возможности предоставляет функция Names ["S"], например, Names ["А*"] дает список всех ключевых слов, начинающихся с символа «А». Наконец, командой ?Name можно вывести справку по любому определению с именем Name. Например, после выполнения команды
?Abs Abs[z] gives the absolute value of the real or complex number z.становится ясно, что идентификатор Abs задает функцию Abs [ z ] для вычисления абсолютного значения комплексного числа. С помощью выражения ?Name можно проверить, является имя объекта Name уникальным или оно уже использовано в системе:
?sin Information::notfound : Symbol sin not found. ?Sin Sin[z] gives the sine of z.В первом случае ясно, что имя sin не использовано, а во втором случае мы видим, что имя Sin уже зарезервировано — это функция вычисления синуса. В задачу этой книги не входит описание всех без исключения определений ядра системы, так что указанные выше приемы весьма полезны, если вы обнаружили функцию, по которой нет информации. Всякий объект перед использованием должен быть определен (задан). Внутренние объекты уже заданы в ядре. Объекты пользователя последний задает в текстах своих документов (notebooks). Кроме того, некоторая совокупность новых внешних объектов может храниться в пакетах расширения, большой набор которых включен в поставку системы. Пользователь может и сам готовить пакеты расширений, обеспечивающие адаптацию системы к решению интересующего его класса задач. Пакеты расширений представлены файлами с расширением .т. Оперативную помощь о назначении какой-либо функции или объекта в ходе работы с системой можно получить, используя следующие обращения: ? Name или Names [ "Name" ] — справка по заданному слову Name; ?? Name — расширенная справка по заданному слову Name; ?Аbс* — перечень всех определений, начинающихся с символов Abc; ©ptions [name] — получение информации об опциях объекта Name. Примеры получения оперативной справки показаны на рис. 3.5.
Рис. 3.5. Примеры получения оперативной справки
Нетрудно заметить, что есть два уровня комментариев оперативной справки. Так, при обращении ?Sin получено лишь сообщение о назначении функции. Обращение ??Sin дает дополнительную информацию о признаках функции, именуемых ее атрибутами. Многие встроенные функции защищены от модификации атрибутом Protected. К примеру, нельзя определить новую функцию Sin[x]=x A 2, причем вовсе не потому, что это определение абсурдно (далее мы покажем, что можно снять защиту и переопределить любую функцию даже самым абсурдным образом), а потому, что имя функции защищено указанием атрибута Protected (Защищенное). Позднее мы ознакомимся и с иными атрибутами — под ними подразумеваются определенные свойства объектов.Средства диагностики и сообщения об ошибках
Средства диагностики органично входят во все программные модули системы Mathematica, созданные профессионально. Благодаря этому система обнаруживает неточные действия пользователя, например синтаксические ошибки при вводе идентификаторов функций и команд, неправильное использование типов данных, применение недопустимых операций (вроде злосчастного деления на ноль) и т. д. Всякий раз, когда ошибочное действие обнаружено, система выдает сообщение об ошибке в следующем виде:Тип::Метка%Диагностика:СообщениеЭти сообщения появляются в отдельных неактивных ячейках. Тип указывает на тип ошибки, например, General — ошибка общего вида, Syntax — синтаксическая ошибка, Arg — ошибка задания аргумента и т. д. Метка указывает место ошибки в списке ошибок данного типа, а Диагностика указывает (увы, не всегда...) на ошибочное выражение. Сообщение обычно раскрывает суть ошибки. Допустим, мы пытаемся вычислить значение экспоненциальной функции, указав ошибочно аргумент 2,3 с разделительной запятой вместо точки. Вот как Mathematica отреагирует на такую попытку (рис. 3.6, первый пример).
Рис. 3.6. Примеры выполнения «ошибочных» операций
Итак, ясно, что произошла ошибка задания аргумента — функция Ехр должна иметь только один аргумент, а число 2,2 система воспринимает как два аргумента, разделенные запятой. Вот еще один пример — вроде бы ошибочно заданы круглые скобки в выражении N (Ехр (2) ). Mathematica 3 в этом случае дала бы два предупреждающих сообщения:Syntax::bktwrn : "Ехр(2)" should probably be "Ехр[2]". Syntax::bktwrn : "N(Exp(2)l" should probably be "N[Exp(2)]". 2ExpNОднако Mathematica 4 в подобных случаях дает допустимую для данной системы форму представления введенного выражения. Тем не менее, надо отметить, что сообщения об ошибках системы Mathematica дают не только указания о самом по себе факте наличия ошибки, но и сообщают о том, что надо сделать для ее исправления. Как видно из сведений о подготовке пакетов расширения, сообщения об ошибках и иные сообщения (в том числе информационные) заданы в их структуре. Насколько эти сообщения точны и как они предугадывают возможные ошибки — это уже зависит от опыта программиста, готовящего программные модули.
Включение и выключение сообщений об ошибках
Опытный пользователь нередко способен опознать ошибки и без слишком назойливых сообщений о них. Например, он может судить о своей промашке просто по отказу системы выполнить вычисление и по повтору выражения в строке вывода (см. примеры выше). Кроме того, часть сообщений носит предупреждающий характер и на первых порах может игнорироваться. Для отключения сообщений об ошибках служит ключOff[Function::tag]Например, отключим сообщение об ошибках у функции Ехр:
Off[Exp::argx] Ехр[2,2] Ехр[2,2] Ехр[2] Е2 N[Exp[2]] 7.38906Для включения сообщения об ошибках используется ключ
On[Function::tag]Например, для возобновления выдачи ошибок у функции Ехр надо исполнить команду
On[Exp::argx]К сожалению, диагностика ошибок не способна опознать ошибки, имеющие формально правильный синтаксис. Чаще всего эти ошибки связаны с неверным описанием алгоритма вычислений. Например, если пользователь в математическом выражении вместо Sin [х] записал Cos [х], то эта грубая ошибка никак не будет распознана системой, поскольку синтаксически вызов функции Cos [х] записан безупречно. Часто пользователи путают идентификаторы переменных. Естественно, что ответственность за такие ситуации целиком лежит на пользователе — программисте.
Защита от модификации и ее отмена
Как уже отмечалось, объекты Mathematica имеют средства установки и снятия защиты от модификации. Для этого используются следующие функции-директивы: Protect [s1, s2,...] — устанавливает атрибут защиты от модификации Protected для перечисленных объектов si; Protect ["forml", "form2",...] — устанавливает атрибут защиты от модификации для всех объектов, имена которых сопоставимы с любым из указанных строковых шаблонов formi; Unprotect [s1, s2,...] — удаляет атрибут защиты от модификации Protected для объектов si, что делает возможной их модификацию; Unprotect ["form1", "form2",...] — снимает защиту всех объектов, имена которых текстуально (по буквам) сопоставимы с любым из указанных шаблонов formi. Приведем наглядный пример модификации встроенной функции логарифма:Log[7]=2 Set::write : Tag Log in Log[7] is Protected. 2Итак, здесь предпринята попытка приписать логарифму числа 7 вовсе не свойственное ему значение 2. В ответ система выдала сообщение, что символ Log имеет атрибут Protected, то есть защищен от модификации. С помощью директивы Unprotect снимем защиту:
Unprotect[Log] {Log}Теперь выражение Log [ 7 ] можно модифицировать:
Log[7] =2 2и использовать его уже в новом значении:
Log[7]=2 2 Log[7]+Log[3] 2 + Log[3]Для отмены произведенной модификации и защиты символа Log от изменений выполните следующие действия:
Log[7]=. Protect[Log] {Log}Теперь можно проверить, что присваивание Log [7] =2 не действует и функция Log работает как положено, возвращая значение In (7) =1. 94591:
Log[7] Log[7] N[Log[7]] 1.94591Защита идентификаторов объектов от модификации является мощным средством контроля правильности вычислений. Эту защиту вряд ли стоит снимать подавляющему большинству пользователей. Тем не менее, возможность устранения защиты позволяет переименовать объект, например, при использовании с ним новых алгоритмов вычислений или при задании системе Mathematica каких-то новых свойств, не присущих ей изначально. Важное значение в числовых и символьных преобразованиях имеют операции подстановки (rules). Их смысл заключается в замене одного объекта или его части другим объектом или частью другого объекта. Например, часто возникает необходимость вычислить значение математического выражения при замене некоторой переменной ее конкретным численным значением. Для этого достаточно вместо этой переменной подставить нужное численное значение. Куда менее тривиальной является замена переменной ее символьным значением в виде математического выражения. При этом исходное выражение может в ходе решения задачи превратиться в совершенно новое выражение, поскольку после подстановки система может провести над исходным выражением достаточно сложные математические преобразования. Говорят, что в этом случае ячейка, содержащая выражение (а точнее — само выражение), оценивается и изменяется по ходу решения задачи. Операции подстановки обычно вводятся с помощью комбинации символов «/ .»: ехрг / . х -> value — в выражение ехрг вместо переменной х подставляется ее значение value; ехрг /. {х -> xvalue,. у -> yvalue} — в выражение ехрг вместо переменных х и у подставляются их значения xvalue и yvalue.
Примеры:
l+x^3/.x->l+z 1 + (1+ z)3 х^2+2*х+3/.х->2 11Обратите внимание на то, что в результате подстановки в первом примере вместо переменной х оказалось математическое выражение (1 + z). Второй пример иллюстрирует подстановку на место переменной х ее численного значения. В целом для операций подстановок используют следующие обозначения: Ihs -> rhs — прямая подстановка Ihs в rhs; Ihs :> rhs — отложенная подстановка (RuleDelayed), которая преобразует Ihs в rhs, вычисляя rhs не сразу, а только при использовании правила подстановки. Ниже приведены еще два примера на использование операций подстановки:
р:=1+х^2+3*х^3 р/.х->1+у 1+ (1 + у)2+3 (1 + у)3 {f[1],f[2],f[3]}/.f[n_]->n^2 {1, 4, 9} f[n_]:=n^2 f[4]+f[y]+f[x+y] 16+y2+(x+y)2В первом примере подстановка произведена в математическое выражение, а во втором — в список.
Работа со списками и массивами
Списки относятся к данным множественного типа. Они имеют большое значение при обработке массивов данных и служат основой для создания векторов и матриц. В этом разделе мы познакомимся со свойствами списков, их созданием (генерацией) и использованием.
Часто математические или иные объекты содержат множество данных, которые желательно объединять под общим именем. Например, под объектом с именем М можно подразумевать квадратную матрицу размером 10x10 с общим числом элементов, равным 100. Человека с именем Victor, например, можно характеризовать целым списком разных данных — символьными фамилией, именем и отчеством, целочисленным годом рождения, вещественным ростом, объемом груди и т. д. Для объединения данных могут использоваться списки (list). Mathematica имеет обширные возможности работы с объектами-списками, содержащими не только однотипные, но и разнотипные элементы. В частности, элементами списков могут быть числа, константы, переменные, выражения и даже сами списки. Списки используются для конструирования более частных типов данных — массивов, матриц и векторов [87]. На языке данной системы список — это совокупность произвольных данных, указанных в фигурных скобках, например: {1, 4, 2, 7, 9} или {а, Ь, с, d, e, sin[x], ln[y], "string"} Возможно задание списков в списке, например, так:{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}Такой список представляет матрицу
1 2 3 4 5 6 7 8 9Однако, чтобы вывести список в такой матричной форме, надо использовать после списка выражение //MatrixForm (рис. 3.7).
Рис. 3.7. Примеры задания и вывода матрицы
На рис. 3.7 показан еще один способ задания списка или матрицы — с помощью функции List: List [a, b, с,...] — создает список {а, b,, с,...}; List [ {а,b, с,...}, {d,e, f,...}, {i, k, 1,...} ] — создает список — матрицу { {a,b, с,...}, {d,e, f,...}, {i, k, 1,...} }. Списки можно составлять, непосредственно задавая объекты в соответствии с описанным синтаксисом. Однако можно и генерировать некоторые виды списков, таких как таблицы. Списки могут быть объектами присваивания переменным, напримерV:={1, 2, 3, 4, 5}Списки характеризуются размером, который представляет собой произведение числа элементов списков по каждому направлению (размерности). Например, одномерный список является вектором и характеризуется числом элементов по единственному направлению. При этом вектор может быть вектором-строкой или вектором-столбцом. Двумерный список представляет матрицу, имеющую m строк и n столбцов. Ее размер равен mxn. Если m=n, то матрица называется квадратной. Трехмерный список можно представить в виде параллелепипеда, содержащего mxnxp элементов. Списки большей размерности трудно наглядно представить, но они вполне возможны. Напомним, что имена векторов и матриц в данной книге обозначены жирными символами, например, V для вектора и М для матрицы. Для генерации списков с элементами, являющимися вещественными и целыми числами или даже целыми выражениями, часто используется функция Table, создающая таблицу-список: Table [expr, {imax} ] — генерирует список, содержащий imax экземпляров выражения ехрг; Table [expr, {i, imax} ] — генерирует список значений ехрг при 1, изменяющемся от 1 до imax; Table [expr, {i, imin, imax}] — генерирует список значений ехрг при i, изменяющемся от imin до imax; Table [expr, {i, imin, imax, di} ] — использует шаг приращения i, равный di; Table[expr, {i, imin, imax}, {j, jmin, jmax},...] —возвращает вложенный список. Самым внешним является список по переменной i. Ниже приводятся примеры использования функции Table (первая строка каждого примера — ввод, следующая — вывод).
Пример |
Комментарий |
Table[i*j,{i,l,3},{j,l,3}] {{1, 2, 3), [2, 4, 6}, {3, 6, 9}} |
Генерация матрицы размером |
Table[N[Exp[i]],
{1,0, 2,0.5}]
{1., 1.64872, 2.71828, 4.48169, 7.38906} |
Генерация пяти значений Е ^ 1 численном виде |
Table[Exp[i],{i,l,5}]
{е, е 2 , е 3 , е 4 , е 5 } |
Генерация пяти значений Е ^ i (i=l, 2, 3,4 и 5) |
Table[Exp[i],{5}] {е i , е i , е i , е i , е i } | Генерация пяти значений Е ^i |
Пример |
Комментарий |
Range [5]
{1, 2, 3, 4,
5}
|
Генерация пяти целых чисел |
Range[0,2,0.5]
{0, 0.5, 1.,1.5, 2.} |
Генерация чисел пяти вещественных |
Пример |
Комментарий |
11:={1,2,3,4,5)
|
Задание исходного списка 11 |
11[[3]]
|
Выделение третьего элемента |
3
|
|
11[[{1,2,5}]]
|
Выделение первого, второго и пятого элементов |
(1, 2, 5}
|
|
12={{1,2,3},{4,5,6}}
|
Задание сдвоенного (двумерного) списка |
{{1, 2, 3},
{4, 5, 6}}
|
|
TableForm[12]
|
Вывод сдвоенного списка в табличной форме |
1 2 3
|
|
4 5 6
|
|
L2[[2,3]]
|
Выделение элемента сдвоенного списка |
6
|
L:={l,2,3,a,b,c} {Part[L,2],Part[L,5],Part[L,6]} {2, b, с} {Part[L,-2],Part[L,-5],Part[L,2]} {b, 2, 2}Функция Part может использоваться для выбора заданного элемента выражения из списка. В этом случае вместо i надо указать три числа — номер выражения как элемента списка, уровень выражения и порядковый номер извлекаемого из выражения объекта. Показанные на рис. 3.8 примеры иллюстрируют работу со списком, последним (четвертым) элементом которого является математическое выражение.
Рис. 3.8. Примеры выделения элементов выражения
Обратите внимание на то, что в последнем примере неверно задан уровень выражения — использованное выражение имеет только один (первый) уровень. Поэтому задание второго уровня вызывает появление сообщения об ошибке. Функция Select используется для выделения элементов списка, удовлетворяющих заданному критерию: Select [list, crit] — выбирает все элементы ei списка list, для которых функция критерия crit [ei] имеет значение True; Select [list, crit, n] — выбирает первые п элементов, для которых critfei] есть True. Ниже представлены примеры применения этой функции:Select[{1,а,2,b,3,c},NumberQ] {1, 2, 3} Select[{l,a,2,b,3,c),NumberQ,2] {1, 2} Select[{l,a,2,b,3,c},PrimeQ] {2, 3}Для вывода элементов списка используются следующие функции: MatrixFormflist] — выводит список в форме массива (матрицы); TableForm [list] — выполняет вывод элементов списка list в виде таблицы. С этими функциями используются следующие опции: TableAlignments — указывает, каким образом должно выравниваться содержимое списка в каждой размерности (слева, по центру или справа); TableDepth — устанавливает максимальное количество уровней, выводимых в табличном или матричном формате; TableDirections — указывает, как следует располагать последовательные (соседние) размерности — в виде строк или столбцов; TableHeadings — задает подписи (labels) для каждой размерности таблицы или матрицы; TableSpacing — устанавливает количество пробелов, которое следует оставлять между соседними строками или столбцами. Обратите внимание на то, что эти опции используются как для функции TableForm, так и для функции MatrixForm, используемой для вывода матриц. Вообще, векторы и матрицы являются разновидностью списков. На рис. 3.9 поясняется использование функций MatrixForm и TableForm на примере вывода списка.
Рис. 3.9. Примеры вывода списка в матричной и табличной формах
Дополнительные возможности функции TableForm демонстрирует рис. 3.10. Здесь особенно полезно отметить возможность выравнивания данных в таблицах по левому и правому краям, а также по середине. В большинстве случаев опции для функций MatrixForm и TableForm не используются. Точнее, они установлены по умолчанию. Проверить, какие опции использованы, можно, например, следующим образом:Options[MatrixForm] {TableAlignments -> Automatic, TableDepth-> со, TableDirections -> Column, TableHeadings->None, TableSpacing-> Automatic} Options[TableForm] {TableAlignments -> Automatic, TableDepth ->бесконечность, TableDirections -> Column, TableHeadings -» None, TableSpacing-> Automatic}
Рис. 3.10. Примеры вывода списка в табличной форме
Вывод можно сделать такой — Mathematica обладает обширными возможностями по части выделения элементов списков и представления списков на экране дисплея и в распечатках документов.Функции выявления структуры списков
Списки относятся к данным сложной структуры. Поэтому при работе с ними возникает необходимость контроля за структурой, иначе применение списков может привести к грубым ошибкам, как явным, сопровождаемым выдачей сообщения об ошибке, так и неявным. Последние могут привести к серьезным просчетам. Для выявления структуры списков используется ряд функций: Count [list, pattern] — возвращает количество элементов в списке list, которые соответствуют образцу pattern; Dimensions [list] — возвращает список размеров списка по каждой размерности; FreeQ [list, form] — возвращает True, если список list не содержит form; Length [list] — возвращает число элементов одномерного списка list или число размерностей в случае многомерного списка; MatrixQ [list ] — проверяет, является ли список матрицей, и дает True, если это так, и False в противном случае; MemberQ [list, form] — проверяет, есть ли form в списке, и возвращает True, если это так, и False в противном случае; Position [list, form] — возвращает номер позиции form в списке; TensorRank[list] — находит ранг списка, если он является тензором; VectorQ [list] — проверяет, является ли список вектором, и дает True, если это так, и False в противном случае. Функции с буквой Q в конце имени являются тестирующими и возвращают логические значения True или False. Остальные функции возвращают численные значения соответствующего параметра списка. Ниже даны примеры использования этих функций.
Ввод (In) |
Вывод(Out) |
11={1,2,3,4,1}; |
|
Length [11] |
5 |
Dimensions [11] |
{5} |
MatrixQ [11] |
False |
TensorRank [ 11 ] |
1 |
MemberQ[ll,l] |
True |
Count[ll,l] |
2 |
FreeQ [11, 5] |
True |
Position [11,1] |
{{1},{5}} |
VectorQ [11] |
True |
M={{1, 2,3}, {4, 5, 6}} |
|
Length [M] |
2 |
Dimensions [M] |
{2,3} |
Ввод (In) |
Вывод(Out) |
|||||||
Drop[{l |
,2 |
,3 |
,4 |
,5}, |
2] |
{3, |
4, |
5} |
Drop [ { 1 |
,2 |
,3 |
,4 |
,5}, |
-2] |
{1, |
2, |
3} |
Drop [ { a |
,b |
,c |
,d |
,e>, |
{2,4}] |
(a, |
e} |
|
Last[{l |
,2 |
,3 |
,4 |
,5}] |
5 |
|||
Rest[{l |
,2 |
,3 |
,4 |
,5}] |
{2, |
3, |
4, 5} |
|
Take[{l |
,2 |
,3 |
,4 |
,5}, |
2] |
(1, |
2} |
|
Take [ { 1 |
,2 |
,a |
,b |
,c}, |
-2] |
{b, |
c} |
|
Take [ { 1 |
,2 |
,3 |
,4 |
,5}, |
{2,4}] |
{2, |
3, |
4} |
Ввод (In) |
Вывод(Out) |
||||
1={1,2,3} |
(1, |
2, |
3} |
||
Append[l,e] |
(1, |
2, |
3, |
e} |
|
Prepend[l,e] |
{e, |
1, |
2, |
3} |
|
Insert[l,e,2] |
{1, |
e, |
2, |
3} |
|
L={1, 2, 3, 4 |
, 5} |
{1, |
2, |
3, |
4, 5} |
Insert [L, e, |
-5] |
(1, |
e, |
2, |
3, 4, 5} |
Insert [L, e, |
{{1},{5}}] |
(e, |
1, |
2, |
3, 4, e, 5} |
L:={1,2,3,4,5} {Delete[L,l],Delete[L,3],Delete[L,5]} {{2, 3, 4, 5}, {1, 2, 4, 5}, {1, 2, 3, 4}} {Delete[L,-2],Delete[L,-5]} {{1, 2, 3, 5}, (2, 3, 4, 5}} Delete[{l,2,3,{a,b,c},4,5},2] {1, 3, {a, b, c}, 4, 5}Если элементом списка является список, то он фигурирует как один элемент. Можно, однако, удалить избранный элемент из элемента списка, указав в фигурных скобках вместо i номер элемента списка во внешнем списке и номер удаляемого элемента во внутреннем списке. Это иллюстрируют следующие примеры:
Delete[(1,2,3,{а,Ь,с},4,5},{4,3}] {1, 2, 3, {а, b}, 4, 5} Delete[{1,2,3,{а, b, с},4,5},{4,1}] {1, 2, 3, {b, с}, 4, 5}Наконец, с помощью функции Delete можно удалить несколько элементов списка, указав каждый из них в фигурных скобках и оформив это указание также в фигурных скобках:
Delete [ {1,2,3, {a, b, c} , 4, 5}, {{2}, {4} ,{ 5}}] {1, 3, 5}Следует иметь в виду, что некоторые функции удаляют в списках определенные элементы. Этот вопрос будет рассмотрен ниже.
Изменение порядка расположения элементов в списке
Помимо добавления в список новых данных имеется возможность изменения порядка расположения элементов в списке. Она реализуется следующими операциями: Flatten [list] — выравнивает (превращает в одномерный) список по всем его уровням; Flatten [list, n] — выравнивает список по п его уровням; Flatten [list, n, h] — выравнивает выражения с заголовком h no n уровням; FlattenAt [list, n] — выравнивает подсписок, если он оказывается п-м элементом списка list. Если n отрицательно, позиция отсчитывается с конца; Sort [list] — сортирует элементы списка list в каноническом порядке; Sort[list,p] — сортирует согласно функции упорядочения р; Reverse [list] — возвращает список с обратным порядком расположения элементов; RotateLeft [list] — возвращает список после однократного поворота влево; RotateLeft [list, n] — возвращает список после n-кратного поворота влево; RotateRight [list] — возвращает список после однократного поворота вправо; RotateRight [list, n] — возвращает список после n-кратного поворота вправо; Transpose [list] — осуществляет транспозицию (смену строк и столбцов) для двумерного списка; Transpose [list, п] — осуществляет транспозицию n-мерного списка. Ниже приведен ряд примеров на использование этих функций.Ввод (In) | Вывод (Out) |
13={{1,2,3},{4,5,6},{7,8,9}}; | {1,2,3,4,5,6,7,8,9} |
Flatten [13] | |
FlattenAt[13,l] | {1,2,3,{4,5,6},{7,8,9}} |
Sort[{l,5,3,4,2}] | {1,2,3,4,5} |
Reverse[{l,2,3,4}] | {4,3,2,1} |
RotateLeft[ {1,2,3,4,5}, 2] | {3,4,5,1,2} |
RotateRight[{l,2,3,4,5} ,2] | {4,5,1,2,3} |
12={{a,b},{c,d}}; | |
TableForm[12] | a b c d |
TableFormf Transpose [12] ] | a c d b |
Комбинирование списков и работа с множествами
Иногда возникает необходимость комбинирования нескольких списков. Для этого используются следующие функции: Complement [list, listl, list2, ...] — возвращает список list с элементами, которые не содержатся ни в одном из списков listl, Iist2, ...; Intersection [listl, list2,...] (пересечение множеств) —возвращает упорядоченный список элементов, общих для всех списков listi; Join[list1, list2,... ] — объединяет списки в единую цепочку (выполняет конкатенацию). Join может применяться к любому множеству выражений, имеющих один заголовок; Union [listl, Iist2, ...] (объединение множеств) — удаляет повторяющиеся элементы списков и возвращает отсортированный список всех различающихся между собой элементов, принадлежащих любому из данных списков listi. Функция обеспечивает теоретико-множественное объединение списков; Union [list] — возвращает отсортированный вариант списка list, из которого удалены все повторяющиеся элементы. Приведенные ниже примеры иллюстрируют применение функций комбинирования списков.
Ввод (In) |
Вывод (Out) |
|
Complement! {1, 2, 3,4, 5}, {1, а, 2}, {b, с, 5}] |
{3, |
4} |
11={1,2,3,4,5}; |
||
12={а,b,3,4,с}; |
||
Intersection [11 , 12] |
{3, |
4} |
Join [11, 12] |
(1, |
2, 3, 4, 5, a, b, 3, 4, c} |
Union[{l,2,4,3,2,7,3,5}] |
{1, |
2, 3, 4, 5, 7}. |
Union[{3,2},{!,4}] |
(1, |
2, 3, 4} |
Union[{a,b,c,a},{l,d,3}] |
{1, |
3, a, b, c, d} |
Операции линейной алгебры
Линейная алгебра — один из фундаментальных разделов математики. Он во многом способствовал развитию методов вычислений. Средства линейной алгебры (преобразование матриц, решение систем линейных уравнений и т. д.) широко используются при решении задач механики, электро- и радиотехники и других отраслей науки и техники. В этом разделе мы познакомимся с основным набором средств системы Mathematica, предназначенных для решения задач линейной алгебры.
Совокупность данных образует массив (Array). Массивы могут быть одномерными (один список), двумерными и многомерными (два и более списка). Одномерные массивы в математике называют векторами, двумерные — матрицами. В общем случае массив характеризуется размерностью (числом измерений) и размером — произведением числа элементов по всем размерностям. Mathematica позволяет создавать многомерные массивы — число элементов в них ограничено лишь объемом памяти компьютера. Для задания массивов используются следующие функции: Array [ f, n] — генерирует список длиной п с элементами f [ 1 ], f [ 2 ], ..., f[n]; Array [f, {nl, n2, ...}] — генерирует массив размером n1x n2 x... в виде вложенных списков с элементами f [ i I, i2,...] (аргумент функции i k меняется от 1 до nk); Array[f, dims, origin] — генерирует список с размерностью dims, используя спецификацию индекса origin; Array [f, dims, origin, h] — использует заголовок h, а не List, для каждого уровня массива. Далее приводятся примеры задания массивов и их вывода.
Ввод (In)
|
Вывод (Out) | ||||||||||
Y : =Array [Exp , 4 ] Y |
{e, |
e 2 , |
e 3 , |
e 4 } |
|||||||
N[Y] |
|
|
{2. |
71828, |
7. |
38906, |
20.0855, 54 |
.5982} |
|||
Array[f,{3 |
, |
3}] |
{{f |
[1, |
1], |
f |
[1, 2] |
{ |
f[l, |
3]}, |
{f[2, 1], f[2, 2], |
|
|
|
{[2 |
, 3] |
}, |
{f |
[3, 1] |
{ |
f[3, |
2], f |
[3, 3] }} |
Array [Sin, |
3 |
,0] |
{0, |
Sin |
[1] |
, Sin[2] |
} |
|
|
||
Array [Sin, |
4 |
,l,Plus] |
Sin |
[1] |
+ Sin |
[2] + |
Sin[3] |
+ Sin |
[4] |
||
Array[f ,5, |
2 |
,2] |
2[f |
[2], |
f [ |
3] |
, f[4] |
{ |
f [5] |
, f[6] |
] |
Основные понятия линейной алгебры
Массивы, в основном в виде векторов и матриц, широко применяются при решении задач линейной алгебры. Прежде чем перейти к рассмотрению возможностей Mathematica в части решения таких задач, рассмотрим краткие определения, относящиеся к линейной алгебре. Матрица — прямоугольная двумерная таблица, содержащая m строк и п столбцов элементов, каждый из которых может быть представлен числом, константой, переменной, символьным или математическим выражением (расширительная трактовка матрицы). Квадратная матрица — матрица, у которой число строк m равно числу столбцов п. Пример квадратной матрицы размером 3x3:1 2 3 4 5 6 7 8 9Сингулярная (вырожденная) матрица — квадратная матрица, у которой детерминант (определитель) равен 0. Такая матрица обычно не упрощается при символьных вычислениях. Линейные уравнения с почти сингулярными матрицами могут давать большие погрешности при решении. Единичная матрица — это квадратная матрица, у которой диагональные элементов равны 1, а остальные элементы равны 0. Ниже представлена единичная матрица размером 4x4:
1 | 0 | 0 | 0 | ||
0 | 1 | 0 | 0 | ||
E | = | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 |
a | b | c | ||
A | = | d | e | f |
i | k | l |
a | d | i | ||
А т | = | b | e | k |
c | f | l |
A | b | c | ||
А | = | d | E | f |
i | k | L |
detА = Сумма a1j(-1)j+1M1<j>где M <J> — определитель матрицы порядка n-1, полученной из матрицы А вычеркиванием первой строки и j-то столбца. В таком виде определитель (он же детерминант) легко получить в символьных вычислениях. В численных расчетах мы будем подразумевать под определителем численное значение этого многочлена. Матрица в целой степени — квадратная матрица в степени п (п — целое неотрицательное число), определяемая следующим образом: М° = Е, М 1 = М, М 2 = = М*М,..., Мn = М n-1 -М. Идемпотентная матрица — матрица, отвечающая условию Р 2 = Р. Инволютивная матрица — матрица, отвечающая условию I 2 = Е. Симметрическая матрица — матрица, отвечающая условию А т = А. Кососимметрическая матрица — матрица, отвечающая условию А т = -А. Ортогональная матрица — матрица, отвечающая условию А т = А- 1 . Комплексно-сопряженная матрица — матрица А , полученная из исходной матрицы А заменой ее элементов на комплексно-сопряженные. Эрмитова матрица — матрица А, удовлетворяющая условию А = А . Собственный вектор квадратной матрицы А — любой вектор х е V n , х не равно 0, удовлетворяющий уравнению Ах = gx, где g — некоторое число, называемое собственным значением матрицы А. Характеристический многочлен матрицы — определитель разности этой матрицы и единичной матрицы, умноженный на переменную многочлена — |А - g Е|. Собственные значения матрицы — корни ее характеристического многочлена. Норма — обобщенное понятие абсолютной величины числа. Норма трехмерного вектора ||х|| — его длина. Норма матрицы — значение sup(||Ax||/||x||). I-норма матрицы А — число Матричная форма записи системы линейных уравнений — выражение А-Х = В, где А — матрица коэффициентов системы, X — вектор неизвестных, и В — вектор свободных членов. Один из способов решения такой системы очевиден — X = А -1 В, где А- 1 — обратная матрица. Следующая группа функций системы Mathematica позволяет осуществлять над векторами и матрицами основные операции, используемые в линейной алгебре: Cross [vl,v2, v3,...] — векторное произведение (может задаваться в виде v1*v2*v3*...); Det [m] — возвращает детерминант (определитель) квадратной матрицы m; DiagonalMatrix [list] — возвращает диагональную матрицу с главной диагональю, сформированной из элементов списка list, и нулевыми остальными элементами матрицы; Dot [a, b, с] — возвращает произведения векторов, матриц и тензоров. Операцию произведения можно задавать также в виде а. b. с; Eigensystem[m] — возвращает список {values, vectors} собственных значений и собственных векторов квадратной матрицы т; Eigenvalues [m] — возвращает список собственных значений квадратной матрицы m; Eigenvectors [m] — возвращает список собственных векторов квадратной матрицы m; IdentityMatrix [n] — возвращает единичную матрицу размером пхп (у нее диагональные элементы имеют значения 1, остальные 0); Inverse [m] — возвращает обратную матрицу для квадратной матрицы т, то есть матрицу m- 1 , которая, будучи умноженной на исходную матрицу, дает единичную матрицу; LinearSolve [m, b] — возвращает вектор х, представляющий собой решение матричного уравнения m. x==b, где m — матрица коэффициентов левой части системы линейных уравнений, х — вектор неизвестных и b — вектор свободных членов в правой части системы; Tr [list] — возвращает след матрицы или тензора (эта функция есть только у Mathematica 4); Transpose [m] — возвращает транспонированную матрицу, у которой столбцы и строки меняются местами в сравнении -с исходной матрицей m; RowReduce [m] — производит гауссовское исключение переменных, возвращая упрощенную форму матрицы m, полученную путем линейного комбинирования строк. Следующие примеры иллюстрируют применение основных из этих функций.
Ввод (In) |
Вывод (Out) |
|||
A: =IdentityMatrix [3] |
||||
А |
{{1, |
0, |
0}, |
{0, 1, 0}, {0, 0, 1}} |
MatrixExp [A] |
{{E, |
0, |
0}, |
{0, E, 0}, {0, 0, E}} |
MatrixQ [A] |
True |
|||
MatrixPower [MatrixExp [A] , -1 . 5] |
{{0. {0, |
22313, 0, 0}, {0, 0.22313, 0), 0, 0.22313}} |
||
А+{{1,2,3},{4,5,6},{7,8,9}} |
{{2, |
2, |
3}, |
{4, 6, 6}, {7, 8, 10}} |
m:={{1,2},{3,7}} |
||||
Inverse [m] |
{{7, |
-2} |
, ( |
-3, 1}} |
MatrixQ [m] |
True |
|||
RowReduce [m] |
{{1, |
0}, |
{0 |
, 1}} |
Рис. 3.11. Вычисление детерминанта, собственных значений и векторов матрицы
Приведем еще несколько примеров:m={{1,2},{3,7}} {{1, 2}, {3, 7}} Transpose[m] {{1, 3), {2, 7}} m//MatrixForm 1 2 3 7 Transpose[m]//MatrixForm Inverse[m]//MatrixForm 7 -2 -3 1В приложении указан ряд дополнительных матричных функций, применяемых реже, чем описанные выше функции.
Решение систем линейных уравнений
Приведем также примеры на решение систем линейных уравнений матричными методами. В первом из них решение выполняется в символьном виде на основании формулы X = А -1 В, где А — матрица коэффициентов системы линейных уравнений, В — вектор свободных членов. Для перемножения используется функция Dot, а для инвертирования матрицы — функция Inverse:A:={{a,b},{c,d}} B:={e,f} X:=Dot[Inverse[A],B] X {-de/(bc+ad) -bf/(bc+ad)- ce/(bc+ad) -af/(bc+ad)}Во втором примере для решения системы линейных уравнений используется функция LinearSolve:
LinearSolve[{{l,2},{3,4}},{7,9}] {-5, 6}Нередко, например в электротехнических расчетах, встречается необходимость решения систем линейных уравнений с комплексными элементами. Все описанные выше функции обеспечивают работу с комплексными числами. Следующий пример иллюстрирует решение системы линейных уравнений с комплексными данными:
А={ U+2I,2+3I},{3+4I,4+5I}} {{1+21, 2 + 31}, {3 + 41, 4+ 51}} В={21,3} {21,3} X=LinearSolve[А,В] {1/4-41, 11I/4}Число матричных функций в системе Mathematica 3/4 ограничено разумным минимумом, позволяющим реализовать множество других, более сложных матричных функций и преобразований. Их можно найти в пакетах расширения системы, посвященных линейной алгебре.
Что нового мы узнали
В этом уроке мы научились:
Использовать основные классы данных системы Mathematica. Выполнять арифметические вычисления. Применять встроенные и пользовательские функции. Получать данные об объектах. Осуществлять подстановки. Работать со списками. Создавать массивы, векторы и матрицы. Пользоваться функциями линейной алгебры