Математика. Настоящий учебник посвящен системе Mathematica прикладному пакету компьютерной алгебры, при помощи которого можно решать любые задачи, в которых в той или иной форме встречается математика
Скачать 4.43 Mb.
|
Глава 2. ЧТО ТАКОЕ Mathematica? Математическое понимание представляет собой нечто, в корне от- личное от вычислительных процессов; вычисления не могут полно- стью заменить понимание. Вычисление способно оказать понима- нию чрезвычайно ценную помощь, однако само по себе вычисление подлинного понимания не дает. Однако математическое понима- ние часто оказывается направленно на отыскание алгоритмиче- ских процедур для решения тех или иных задач. В этом случае ал- горитмические процедуры могут взять управление на себя, предо- ставив интеллекту возможность заняться чем-то другим. Прибли- зительно таким образом работает хорошая система обозначений — такая, например, как та, что принята в дифференциальном ис- числении, или же всем известная десятичная система счисления. Овладев алгоритмом, скажем, умножения чисел, Вы можете вы- полнять операцию умножения совершенно бездумно, алгоритми- чески, при этом в процессе умножения Вам совершенно ни к чему “понимать”, почему в данной операции применяются именно эти алгоритмические правила, а не какие-то другие. Роджер Пенроуз. Тени разума. Гл.3. О невычислимости в мате- матическом мышлении Тот, кто прочел Главу 1, знает, что Mathematica является системой ком- пьютерной алгебры общего назначения, при помощи которой можно решать любой тип задач, в которых в той или иной форме встречается математи- ка. При этом система Mathematica наряду с Maple является единственной такой high-end 4 системой, которая настолько проста в использовании, что доступна школьникам и студентам младших курсов. § 1. Достоинства и особенности системы Mathematica Одной из самых удивительных сторон компьютеров является то, что они становятся все лучше и лучше, в то время как все осталь- ное становится все хуже и хуже. Дональд Кнут. Санкт-Петербургский Университет, N.15, 1994. По удобству использования, продуманности интерфейса и встроенной по- мощи, унификации формата применяемых командных слов и конструкций, их предсказуемости и близости к реальному математическому английско- му языку, Mathematica значительно удобнее всех других систем, включая Maple. Другими принципиальными моментами, которые заставили нас сде- лать выбор в пользу системы Mathematica в нашей собственной работе, яв- ляются поддерживаемый ей более гибкий стиль программирования и более высокое качество графики. Огромными достоинствами системы Mathematica являются 4 Словарь дает следующие переводы компьютерного термина high-end: мощный, про- фессиональный, высококачественный; высокого класса; с широкими функциональными возможностями. Поскольку ни один из этих переводов не отражает всего пафоса и всех коннотаций оригинала, мы оставляем этот термин as is. 25 • Простота использования • Высочайшая вычислительная эффективность • Эффективная генерация графики высочайшего качества • Близость используемого языка к реальной математической практике • Богатство и гибкость языка • Высочайшая степень унификации • Высокая предсказуемость • Неограниченная расширяемость • Независимость от платформы • Совместимость различных версий • Использование явных форматов В том, что касается трех последних пунктов, мы можем подтвердить их следующим примером из личного опыта. Один их авторов этой кни- ги впервые познакомился с системой Mathematica на презентации фирмы Wolfram Research на Международном Математическом Конгрессе в Киото в 1990 году и начал систематически использовать ее с 1991 года, в 1991– 1992 годах главным образом на платформе Макинтош, начиная с 1992 года на UNIX'овских рабочих станциях (DEC, Sun, HP) для научных вычислений, а с 1995 года, кроме того, и на PC для небольших вычислительных задач и учебных целей. При этом все программы, написанные начиная с 1991 года (версии 2.0 и 2.2), под Макинтош и UNIX оказались полностью работоспо- собными и на PC под версии 3.0, 4.0 и 5.0 начала 2000-х. Более того, в блок- нотах, написанных под Макинтош, правильно воспроизводились даже фор- матирование, свойства ячеек и экранная графика. Программы написанные под UNIX в чисто текстовом режиме первоначально нуждались в некотором дополнительном форматировании, чтобы стать полноценным блокнотом, однако в середине 1990-х годов с появлением версий Mathematica под XWin и эта проблема была решена. Чтобы быть справедливыми, необходимо отметить, что полной совместимости современных версий с предыдущими нет, и некоторые, казалось бы удобные функции, как например, Inequal- ityPlot (до версии 5.2), позволявшая изобразить определяемую неравен- ствами область на плоскости, прекратили свое существование. Однако, разработчики всегда предлагают новые функции, перекрывающие реали- зованные ранее возможности. Так, функция RegionPlot (версия 6 и позже) включает функциональность предшественницы и близка по правилам обра- щения. Пример использования этой функции приведен в § 6 Главы 3. По- дробная информация о совместимости версий системы Mathematica пред- ставлена в разделе Version Advisory системы Помощи Mathematica (см. ниже в § 4), в частности, в материалах Incompatible Changes since Math- ematica Version 1 и Standard Packages Compatibility Guide. На сайте www.wolfram.com в разделе Краткая история изменений системы Mathe- matica 5 перечислены нововведения от версии к версии, а система Помощи 5 https://www.wolfram.com/mathematica/quick-revision-history.html 26 Mathematica при поиске справки о функции, которая более не поддержива- ется, сообщает название и правила использования ее заменившей, причем с обязательным примером, как использовалась прежняя функция. Концептуальное программирование вместо процедурного и ре- курсивного A language that doesn't affect the way you think about programming is not worth knowing. Dennis M. Ritchie Основная догма традиционного процедурного программирования в стиле ПошелНа (GoTo) состоит в том, что компилируемая программа все- гда исполняется быстрее, чем интерпретируемая. Язык Mathematica под- держивает все стили программирования, включая, конечно, и процедурное программирование, хотя в гораздо большей степени ему свойственны функ- циональное программирование, основанное на рекурсии и концептуальное программирование, состоящее в том, что мы даем прямое математическое определение того, что хотим вычислить. Проиллюстрируем различные стили программирования на примере вы- числения n!. Конечно, в ядре системы Mathematica есть функция Facto- rial, вычисляющая факториал, поэтому этот пример приводится исклю- чительно с тем, чтобы сравнить на простейшем материале разные стили программирования. Вот как, примерно, могла бы выглядеть в языке Math- ematica программа для определения факториала в стиле ПошелНа: In[1]:=factor1[n ]:=Block[ {m=1},For[i=1,i<=n,i++,m=m*i];m] Однако гораздо быстрее написать рекуррентное определение факториала в стиле функционального программирования In[2]:=factor2[0]=1; factor2[n ]:=factor2[n-1]*n Конечно, более опытный программист, который экономит свое время, а не время компьютера, именно так и поступит. Однако одной из самых сильных сторон языка Mathematica является обилие мощных встроенных функций для работы с выражениями, в частности, списками и применения функций к различным их уровням. Поэтому тот, кто не является програм- мистом, но приобщился к йоге системы Mathematica определит n! либо как произведение элементов списка {1, . . . , n}: In[3]:=factor3[n ]:=Apply[Times,Range[n]] либо просто как произведение чисел от 1 до n: In[4]:=factor4[n ]:=Product[i, {i,1,n}] А теперь сравним, сколько времени занимает вычисление 50000! при по- мощи четырех этих программ. Мы думаем, что результат окажется оше- ломляющим для сторонников традиционного программирования. Вот как выглядит фактический результат 6 (для получения которого в зависимости 6 Приведены результаты вычислений на стандартном персональном компьютере клас- са Pentium выпуска начала 2000-x. Ноутбук c процессором x64 класса Intel Core I7 27 от того, как сконфигурировано ядро Вашей версии, может понадобить- ся изменить глубину рекурсии, сделав ее достаточно большой, например, бесконечной $RecursionLimit=Infinity): In[5]:=Timing[factor1[50000];] Out[5]= {2.534,Null} In[6]:=Timing[factor2[50000];] Out[6]= {2.493,Null} In[7]:=Timing[factor3[50000];] Out[7]= {0.251,Null} In[8]:=Timing[factor4[50000];] Out[8]= {0.231,Null} Производит впечатление, не так ли? Рекурсивная программа работает не медленнее, а даже чуть быстрее, чем процедурная, а работа со списком в десять раз быстрее, чем каждая из них!!! А вот с какой, примерно, ско- ростью вычисляется оптимизированная внутренняя функция Factorial: In[9]:=Timing[Factorial[50000];] Out[9]= {0.121,Null} Мы видим, что это еще примерно в два раза быстрее, чем работа со спис- ком, что, впрочем, неудивительно, так как код, описывающий встроенные команды, использует быстрые алгоритмы и оптимизирован по скорости. Философский вывод из этого состоит в следующем: чем проще напи- сана программа, тем быстрее она работает! Быстрее всего работают внутренние функции системы Mathematica, потом математические опреде- ления, которые Вы даете в терминах этих функций. Программы в тради- ционном стиле — притом как процедурном, так и функциональном!!! — работают значительно медленнее. Устойчивые навыки традиционно- го программирования являются скорее помехой, чем помощью для эффективного программирования на языке Mathematica, зато по- нимание смысла и математической структуры используемых объектов ре- шающим образом ускоряет не только процесс написания программ, но их их работу. Недостатки системы Mathematica. Первые версии системы Mathema- tica обладали рядом серьезных недостатков, начиная с невозможностью прервать вычисление. В сочетании с отсутствием комбинации из трех паль- цев Ctrl+Alt+Del в тогдашней операционной системе MacOS, это часто при- водило к драматическим последствиям. Однако в дальнейшем разработчи- ки системы планомерно устраняли все очевидные недостатки: there are two ways to make a perfect piece of software. One is to make it so simple, that there obviously are no deficiencies. Another one is to make it so complicated, that выпуска 2018 года выполняет расчет на порядок быстрее, но качественно результаты сохраняются. 28 there are no obvious deficiencies. Создатели системы Mathematica пошли по второму пути. Единственным очевидным недостатком системы является высокая стои- мость лицензии (в мае 2019 года - 985$ за Stardard Desktop/Cloud). Впро- чем, компания Wolfram Research предлагает систему студенческих и ака- демических скидок и версия 12 для персонального компьютера обойдется студенту в 160$. Кроме того, имеется возможность купить подписку для он-лайн доступа на год и даже на семестр, которые стоят в разы дешевле. Если позволить себе пошутить, то можно упрекнуть Mathematica в том, что она не умеет варить кофе. Впрочем, nobody is perfect, ведь даже emacs, который умеет все, варит очень плохой кофе. § 2. Структура системы Mathematica There are things on heaven and earth, Horatio, Man was not meant to know. — На свете есть много такого, Горацио, чего человеку знать не положено. William Shakespear. Hamlet Mathematica является одной из самых сложных до сих пор написанных общедоступных систем программного обеспечения. Более крупные систе- мы как правило создавались лишь для каких-то очень специальных целей, таких как астрономические, ядерные, космические исследования, проекти- рование, геологоразведка, военное планирование, крупные экономические задачи и т.д. 1. Быстрый старт. Запуск системы осуществляется стандартным образом: щелчком по иконке в строке быстрого доступа на экране пер- сонального компьютера или через меню приложений операционной систе- мы. После запуска появляется окно приветствия, предоставляющее доступ к списку последних открытых на локальном компьютере или в “облаке” файлов (Recent files), разделу документации (Documentation), ресурсам пакета на сайте разработчика (Resources) 7 и сайту сообщества (Communi- ty) в интернете, объединяющем пользователей системы Mathematica. Пе- реключателем Show at Startup показ окна приветствия можно отменить, однако, учитывая, что раздел документации является по сути прекрасным гипертекстовым учебником по языку и системе Mathematica, содержащим замечательные примеры и иллюстрации, и к тому же исполненным на язы- ке системы, для изучающих Mathematica регулярный старт с просмотра разделов документации может оказаться небесполезным. Ресурсы системы Mathematica содержат целый спектр разделов: от книги создателя системы Стивена Вольфрама “Элементарное введение в язык Wolfram Language” 8 и демонстраций, содержащих полнофункциональные интерактивные приме- ры с исходным кодом, до материалов для программистов и каталога книг по системе Mathematica и языку Wolfram Language. 7 http://www.wolfram.com 8 www.wolfram.com/language/elementary-introduction/2nd-ed/ 29 2. Структура системы. Полная установка системы Mathematica для операционной системы MS Windows занимает около 10 гигабайт дисковой памяти и состоит из более, чем 40000 файлов, сгруппированных в почти 4000 папок. По умолчанию система устанавливается в папку C: \Program Files\Wolfram Research\Mathematics\<номер версии> Папка содержит большие поддиректории SystemFiles, Documentation и AddInd, служебный каталог Configuration, запускающий файл Mathemat- ica.exe и файлы MathKernel.exe / WolframKernel.exe и math.exe / wolf- ram.exe, обеспечивающие разными способами доступ к ядру системы, ре- ализованному динамической библиотекой WolframEngine.dll. Вниматель- ный читатель обратит внимание, что объединенные в пары файлы одина- ковы по размеру. Более подробно о структуре системы Mathematica можно прочитать в учебнике на сайте Wolfram Research в статье “The Structure of the Wolfram System” 9 Cистема Mathematica построена по модульному принципу и eё ядро, фак- тически выполняющее вычисления, отделено от интерфейса, который об- рабатывает взаимодействие с пользователем. Структурно система состоит из следующих основных компонентов: • MathKernel – ядро системы, обеспечивающее вычисления; • FrontEnd – интерфейс, отвечающий за диалог с пользователем; • процедуры обмена данными MathLink, JLink, NETLink и т.д. • пакеты расширений Add-ons, Packages, Dictionaries, Graphics. Ниже мы чуть подробнее опишем некоторые аспекты, связанные с реали- зацией и функциями ядра, а также стандартные пакеты. 3. MathKernel. Основной частью системы, определяющей ее вычисли- тельные возможности, является, конечно, ядро MathKernel. В свою очередь ядро всех высокоуровневых систем компьютерной алгебры состоит из двух частей. Во-первых, это скомпилированный код на каком-то низкоуровне- вом языке, как правило, C или Lisp. Во-вторых, это высокоуровневый код в языке самой системы, содержащий таблицы (основные математические формулы, таблицы интегралов, интегральных преобразований и т.д.) В системах Maple и Mathematica и большинстве других новых систем низко- уровневый код написан на C или C++, в то время как в Axiom и большинcтве более старых систем — на Lisp. В настоящее время ядро Mathematica включает миллионы строк кода на языке C. К этому количеству следует добавить сотни тысяч строк кода, написанных собственно в системе Mathematica, т.е. на языке существенно более высокого уровня. Стоит представить себе, что 1 500 000 строк в C это около 50 тысяч печатных страниц, т.е. 100 книг по 500 страниц. Подчерк- нем, что речь идет исключительно о коде в C. 9 reference.wolfram.com/language/tutorial/TheStructureOfTheWolframSystem.html 30 4. FrontEnd. Реализация интерфейса FrontEnd занимает — в зависимо- сти от платформы — еще несколько сотен тысяч строк кода на C. Значи- тельная часть этого кода посвящена поддержанию многочисленных фор- матов ввода–вывода. Кроме того, FrontEnd содержит достаточно мощный текстовый редактор (WordProcessor). Достаточно сказать, что Mathemat- ica содержит словарь и spell checker на 125 000 слов, из которых около 100 000 — обычные слова английского языка, около 20 000 — математиче- ские и научные термины и около 5 000 — внутренние и системные команды, определенные в ядре Mathematica и ее стандартных расширениях. Интерфейс FrontEnd работает независимо от ядра системы MathKernel. Эти две части системы могут работать по отдельности, например, первая - на компьютере пользователя с хорошим монитором для вывода качествен- ных изображений, а ядро - на удаленном компьютере с мощным процессо- ром, для выполнения собственно вычислений. Интерфейс FrontEnd может запускать и несколько ядер для выполнения параллельных высчислений на нескольких компьютерах. Взаимодействие интерфейсной части и ядра системы обеспечивается компонентом пакета MathLink. При старте системы Mathematica файл Mathematica.exe запускает ин- терфейс FrontEnd и Вы фактически имеете дело со специализированным текстовым и графическим редактором, а вовсе не с системой символьных вычислений. Так происходит до тех пор, пока Вы первый раз не набрали на клавиатуре комбинацию клавиш Shift+Enter. В этот момент происходит вызов ядра, которое может загружаться, в зависимости от конфигурации и других выполняемых системой процессов, несколько секунд. С другой стороны, Вы можете просто запустить на выполнение программу MathK- ernel.exe. В этом случае Вы обращаетесь непосредственно к вычисли- тельному ядру системы, минуя FrontEnd, и общение с ядром происходит в текстовом режиме, так что графика выглядит несколько ностальгически, напоминая об удаленных терминалах начала 1990-х годов. 5. Версии системы. Начиная с 1988 года, до апреля 2019 года вы- пущено основных 12 версий системы Mathematica. Разработчики требова- тельно подходят к выпуску очередного релиза и каждая новая версия дей- ствительно оказыватся функциональнее, эффективнее, полнее и удобней предыдущих. Описание текущей версии системы и список ранее выпущен- ных с дополнениями и измененями представлены на сайте www.wolfram.com в разделе “Краткая история изменений системы Mathematica” 10 10 http://www.wolfram.com/mathematica/quick-revision-history.html/ 31 § 3. Главное меню Mathematica Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing. Dick Brandon При запуске системы Mathematica открывается новый блокнот с рабочим названием Untitled-1. Рабочее окно содержит системную кнопку стан- дартного назначения в верхнем левом углу и строку главного меню, со- держащую 10 разделов. В зависимости от настроек системы, при запус- ке может открываться приветствие Welcome Screen и одна или несколько палитр Palettes. В настоящем параграфе мы опишем общую структуру главного меню и пройдемся коротко по его разделам, опуская при этом описание тех очевидных команд, которые в системе Mathematica действу- ют точно так же как в любой другой программе под MacOS, Windows или XWin. Тот, кто использовал одну такую программу, использовал их все и поэтому нет нужды повторять очевидные вещи. Каждый, кто сам хоть раз включал компьютер, помнит и общеупотребимые комбинации “горячих” клавиш от Ctrl+A до Ctrl+Z. • File — этот раздел содержит обычные команды: New, Open, Close, Save / Save As, Print, Exit и три подменю, на которые следует обратить специальное внимание. Специфичными для системы Mathematica явля- ются подменю Save to Wolfram Cloud, Publish to Cloud и CDF Prewiew. Первое позволяет сохранить файл блокнота в интернете в поддеживаемом Wolfram Research “облаке” с возможностью в дальнейшем доступа из сети. С помощью второго можно выложить создаваемый файл в интернете для всех или с доступом по паролю. Третье меню предназначено для сохране- ния блокнота формате CDF (Computable Document Format) - разработанном компанией Wolfram Research формате документов для создания динами- ческие генерируемого интерактивного контента с возможностями управ- ления, элементами анимации и другими характерными для презентаций атрибутами. • Edit содержит обычные команды Cut, Copy, Paste, Clear, Select All, Find, Undo / Redo доступные также с помощью стандартных комбинаций горячих клавиш. Отметим, что команда Copy As позволяет копировать выделенный фрагмент в различных форматах, включая LaTeX и MathML. Специфичной для системы Mathematica является команда Check Balance, позволяющая контролировать требуемую правилами синтаксиса системы парность скобок в выражениях. В меню Edit также включены команда вызова системы проверки правописания Check Spelling и ссылка доступа к параметрам системы. • Insert наряду обычными для текстовых редакторов командами встав- ки символа, картинки, разрыва страницы или гиперссылки содержит также специфичные для системы Mathematica команды Input from Above и Out- put from Above, копирующие и помещающие в позицию курсора соответ- ствующее содержание - ввод Input или Ouput ближайшей предшествующей 32 ячейки Cell. Команда Inline Free-form Input предназначена для ввода произвольного текста в позицию курсора в поле Input для последующе- го преобразования в конструкции Wolfram Language. Меню Insert также содержит большое количество разнообразных шаблонов для ввода элемен- тов текста, характерных для научных публикаций: надстрочных и под- строчных индексов, таблиц и матриц, библиографических ссылок и др. С помощью подменю Automatic Numbering можно создавать различные ну- меруемые структуры: разделы документа, формулы и пр. • Format содержит большое количество подменю, описывающих стили, шрифты, размеры, цвет, выравнивание и пр. и пр. Style, Font, Face, Size, Text Color, Background Color, Text Alignment, Text Justifica- tion, Word Wrapping. Следует отметить, что в меню формат Format пред- ставлены стили, как применяемые к отдельным элементам блокнота, так и предназначенные для оформления документа блокнота как целого: Style- sheet и Screen Environment. Подменю Cell Dingbat позволяет выбрать разнообразные графические символы, которыми можно отмечать элементы в блокноте. Доступ ко всей системе опций предоставляет специальный ин- струмент Option Inspector, который предъявляет их сгруппированными в соответствии с функциями. Данное подменю позволяет не только осу- ществить настройку конкретного параметра, но и установить уровень, на котором эта настройка будет действовать: глобально, для всего блокнота или для области выбора. • Cell содержит специфическое для интерфейса системы Mathematica управление ячейками. Подменю Convert To преобразуют вид выбранного фрагмента, установленный по умолчанию. При этом основными возмож- ностями являются четыре формата: два явных InputForm и OutputForm и два неявных: StandardForm и TraditionalForm. Например, если Вы в ка- честве формата по умолчанию для ячейки ввода установлен StandardForm, то при набираемая в ячейке ввода стрелка -> будет автоматически конвер- тироваться в → и т.д. Хотя, конечно, ядро системы будет, по-прежнему, видеть то, что Вы фактически ввели с клавиатуры, а именно, ->. Суще- ствуют различные мнения по поводу того, удобны неявные форматы или, все же, скорее нет. По нашему мнению, явный формат позволяет гораздо легче локализовать синтаксические ошибки. Поэтому если Вы хотите ви- деть то, с чем на самом деле производится вычисление, оставьте InputForm и OutputForm в качестве установок ввода и вывода! В некоторых случаях, предлагаются и другие форматы такие, как Raw InputForm без сопровож- дающей разметки языка Wolfram Language или платформо-независимый Bitmap. Два других подменю Cell Properties и Cell Grouping связа- ны со свойствами ячеек и их группировкой. Команды из подменю Cell Properties позволяют изменить такие свойства текущей ячейки, как Open, Editable, Active, Initialization и т.д. С другой стороны, команды из подменю Cell Grouping, позволяет группировать ячейки или разбивать группы, в то время как команды Divide Cell и Merge Cells позволяют разделять и сливать ячейки. Подменю Cell Tags предназначено для по- 33 иска помеченных ячеек, а подменю Notebook History дает возможность отслеживать историю изменений в блокнотах и ячейках и просматривать эти изменения с привязкой к дате и времени. Последнее может быть полез- но, чтобы вспомнить, как пользователь выполнял свои исследования, если например, возникла необходимость изменить их ход. Для специалиста мо- жет оказаться полезна и команда Show Expression, демонстрирующая код на языке Wolfram Language, реализующий содержащующуюся в ячейке за- пись. • Graphics содержит средства для работы с изображениями, включая графический редактор и средства расположения и группировки. • Evaluation содержит команды Evaluate для выполнения введенных в ячейку команд, а также вычислений, содержащихся в группе ячеек или всем блокноте. Имеются средства отладки Debugger, команды управления ядром Kernel, организации параллельной обработки и т.д. • Palette - палитры операторов и функций, предназначенные для облег- чения ввода. Это панели инструментов с пиктограммами для ввода матема- тических символов, функций и команд управления системой. Для удобства пользователя инструменты палитр сгруппированы, их можно перемещать по экрану. В систему могут быть установлены дополнительные палитры, в загруженные или разработанные пользователем. В меню Palette в стиле палитр включены также средства выбора вида диаграмм, цветовых схем, специальных символов и средства настройки презентаций, подготовленных на языке Wolfram Language. • Window содержит средства настройки панели инструментов блокнота, перечисляет все открытые в системе окна, управляет их расположением и размером, а также позволяет увеличить (Magnification) изображение в окне. • Help обеспечивает доступ к различным системам информации и помо- щи, а также другим ресурсам, поддерживающим работу системы. Встро- енная помощь более подробно описана в следующем параграфе. § 4. Система помощи Mathematica Лев Толстой очень любил играть на балалайке (и, конечно, детей), но не умел. Даниил Хармс, Веселые ребята В системе Mathematica есть несколько способов получить помощь, в частности • возникающее при запуске FrontEnd приветствие = Welcome Screen алиас Startup Palette, • вызываемая из меню FrontEnd встроенная помощь = Help Browser, • вызываемые непосредственно из блокнота или другого документа MathKernel информационные запросы ? = Query и ?? = Information. 34 • справочные команды Definition, FullDefinition, Names. Обсудим чуть подробнее, что это такое. 1. Приветствие. При каждом запуске системы появляется - если Вы его не отключили - приветствие, о котором мы говорили в пункте 1. Быстрый старт предыдущего параграфа. Необходимую информацию можно най- ти в разделе документации, на сайте разработчика www.wolfram.com и в материалах сообщества Wolfram в интернете. Помимо ответов на всевоз- можные вопросы пользователей системы Mathematica рекомендованные в Приветствии ресурсы интернета позволяют скачать несколько тысяч до- полнительных пакетов, блокнотов, статей, графических объектов и дру- гих документов, содержащих определения десятков тысяч функций сверх примерно 5000 тысяч стандартных функций. 2. Встроенная помощь. Система Mathematica предлагает чрезвычай- но детальную интерактивную помощь, которая вызывается через рубрику Help главного меню, либо нажатием клавиши F1, позволяющей получить справку о выделенной функции. Структура меню Help следующая: ◦ Documentation Center — обеспечивает доступ к документации по Wol- fram Language. ◦ Find Selected Function — показывает информацию по выделенной функции, включая примеры. ◦ Wolfram Website — ссылка ведет на сайт Wolfram Research. ◦ Demonstrations — ведет на сайт, где представлены избранные демон- страции, выполненные в системе Mathematica. ◦ Internet & Mail Settings — список функций Mathematica, требую- щих подключения к интернету, и параметры настройки подключения. ◦ Give Feedback — позволяет письменно обратиться к службе поддерж- ки со страницы сайта Wolfram Research. ◦ Register this Mathematica — позволяет зарегистрировать вашу ко- пию системы Mathematica и Вас как пользователя. ◦ Why the Beep? — подскажет, почему раздался звуковой сигнал интер- фейса FrontEnd. ◦ Why the Coloring? — поясняет подсветку синтаксиса. ◦ Welcome Screen — открывает экран приветствия. ◦ About Mathematica — дает информацию о вашей системе, включая возможность измерить производительность системы на Вашем компьютере. Следует особо отметить разнообразные и обширные материалы, пред- ставленные в Documentation Center. По сути это и справочные ресурсы, и прекрасные интерактивные учебники по различным разделам системы Mathematica и другим продуктам Wolfram Research. В контексте нашего учебника нельзя не упомянуть материалы, представленные в разделе Re- sources: он-лайн учебники, объединенные названием “Fast Introduction”: 35 для тех, кто осваивает возможности программирования на языке Wolfram Language, и для студентов, изучающих математику. Последний учебник 11 охватывает широкий спектр математических дисциплин для средней шко- лы и за ее пределами - от арифметики до математического анализа и мат- ричной алгебры. Замечательная подборка ярких профессионально испол- ненных примеров, понятныx и начинающему, предназначена для быстрого освоения возможностей языка Wolfram Language для расчетов, графиков и презентаций. 3. Информационные запросы. Как и в большинстве других систем информационные запросы ?name и ??name дают информацию об объекте с именем name. А именно, ответ на запрос ?name воспроизводит определение и описывает использование этого объекта. Ответ на запрос ??name, кроме того, перечисляет его атрибуты и опции вместе с их текущими значениями. Полная форма запроса Information[name]. Например, если Вы хотите узнать, что делает функция Plot, то Вы можете напечатать ??Plot или Information[Plot] Если Вы точно не помните имя интересующего Вас объекта, то в за- просах, как обычно, можно использовать знак *, называемый в этом слу- чае WildCard или MetaCharacter. Этот знак может ставиться в любое место запроса и заменяет любую конечную последовательность букв, по- являющихся в этом месте имени. Например, ответом на запрос ??Plot* является список из 18 имен Plot, PlotLabels, PlotRangeClipping Plot3D, PlotLayout, PlotRangeClipPlanesStyle Plot3Matrix, PlotLegends, Plo- tRangePadding PlotDivision, PlotMarkers, PlotRegion PlotJoined, Plot- Points, PlotStyle PlotLabel, PlotRange, PlotTheme; в то время как отве- том на запрос ??*Plot будет показан список из 64 функций от ArrayPlot до WaveletMatrixPlot, включая, разумеется и Plot. Информацию об определении объекта можно получить также при помо- щи команд Definition или FullDefinition. А именно, Definition[name] дает определение объекта name, а FullDefinition[name] — определение самого этого объекта и всех объектов, от которых зависит его определе- ние. Для того, чтобы узнать определение встроенного объекта, нужно ис- пользовать команду FullDefinition[name], так как в этом случае Defini- tion[name] даст только список атрибутов и опций вместе с их текущими значениями. Еще один народный способ увидеть список всех имен, содержащих фраг- мент blabla состоит в том, чтобы напечатать Names["*blabla*"]. Напри- мер, напечатав в начале сессии Names["*"] Вы получите список всех функ- ций, откомпилированных при загрузке ядра (скажем, в нашей версии Math- ematica 11.3 при первом вызове ядра компилируются 6293 функции). В дальнейщем в течение сессии при подгрузке дополнительных пакетов и по мере того, как Вы определяете новые объекты, список имен будет увели- чиваться. 11 https://www.wolfram.com/language/fast-introduction-for-math-students/en/ 36 § 5. Палитры А что нам с этих трехсот грамм будет? Мы же гипербореи. Венедикт Ерофеев Из подменю Palettes главного меню доступны 9 палитр, влючая 3 в подменю Other. Эти палитры весьма неравноценны и по своим возможно- стям палитры Basic Math Assistant и Classroom Assistant существенно превосходят все остальные. Фактически эти две палитры являются вирту- альными расширениями клавиатуры, которые позволяют вводить все обычные символы и проводить все обычные математические вычисления, из тех, что могут понадобиться студенту младших курсов технических, эко- номических и естественнонаучных специальностей, вообще не зная языка Mathematica! • Basic Math Assistant вызывается как одна палитра, но фактически является блоком из нескольких палитр, содержащих основные операций, которые могут понадобиться студенту: от математических констант до средств набора сложных математических выражений. • Classroom Assistant в дополнение к предыдущей палитре имеет бло- ки с символами навигации, средства форматирования и палитру клавиату- ры • Algebraic Manipulation вызывает полтора десятка простейших ко- манд манипуляции с многочленами, рациональными дробями, тригономет- рическими и экспоненциальными выражениями. Абсолютно бесполезно то- му, кто минут пять работал с системой. • Basic Math Input позволяет вводить в традиционной форме верхние и нижние индексы, дроби, радикалы, суммы и произведения, интегралы и частные производные, матрицы, греческие буквы и несколько десятков наиболее употребительных математических знаков. • Basic Typesetting — примерно то же самое, что Basic Math Input, но несколько обширнее и позволяет вводить в традиционной форме не толь- ко матрицы, но и таблицы, системы уравнений и пр., около сотни специаль- ных знаков, и некоторые другие фишки и дингбаты, символы специальных клавиш, и тому подобное. • Chart Element Schemes предназначен для удобного выбора всевозмож- ных двумерных и 3D диаграмм • Chart Element Schemes дает возможность выбирать средства установ- ки цветов в документе блокнота • Special Characters позволяет вводить буквы с диакритическими зна- ками, используемые в романских, славянских, германских, и некоторых других языках, символы валют и т.д. При желании можно создать свои собственные палитры, установить до- полнительные и настроить главное меню так, чтобы необходимые автома- тически вызывались при запуске системы. 37 § 6. Сессии и вычисления Если Вы работаете с системой Mathematica под Windows, MacOS или XWin, то, скорее всего, основными понятиями, в терминах которых происходит Ваше взаимодействие с системой, на внутреннем уровне (BackEnd) являют- ся сессии и вычисления, а на внешнем уровне (FrontEnd) — блокноты и ячейки. Предостережение. Разумеется, это не относится к случаям профессионального ис- пользования системы, скажем, в чисто текстовом режиме (в этом случае блокноту отве- чал бы файл, а ячейке — командная строка), в многопроцессорном или многосессионном режиме и т.д. Однако все это вряд ли представляет интерес для начинающего. Между внутренними и внешними понятиями можно установить следую- щее приблизительное соответствие: Kernel FrontEnd Session = ceccия Notebook = блокнот Evaluation = вычисление Cell = ячейка Разумеется, это соответствие, а не биекция, во время одной сессии можно открывать несколько блокнотов и, наоборот, записанный блокнот может использоваться на протяжении нескольких сессий. Точно так же одна и та же ячейка может в разные моменты сессии вызываться для различных вычислений. Комментарий. Непосвященному предыдущее заявление может показаться нелепым, как же один и тот же текст может порождать разные вычисления. Ну, во-первых, текст ячейки может редактироваться. Во-вторых, результат любого вычисления зависит не только от того, что мы вычисляем, но и от того, в каком состоянии находится система в момент вычисления . Например, могут измениться определения исполь- зованных в этом вычислении функций — или функций, фигурирующих в определении этих функций, — а также значения различных переменных или параметров, опций и атрибутов. Среди этих параметров могут быть и такие, которые при нормальных усло- виях не видны пользователю, например, значение затравки генератора случайных чисел, зависящее от времени суток. Кроме того, поведение системы зависит от фаз луны — You are lucky, full Moon tonight! — и многих других факторов. Обсудим эти ключевые понятия чуть подробнее. С внешней точки зре- ния сессия представляет собой период непрерывной работы ядра MathKer- nel между его вызовом и прекращением его работы (безразлично, по при- чине сознательного выхода или самопроизвольного коллапса). Все функ- ции сохраняют свои определения, а все переменные — свои значения на протяжении всей сессии, по крайней мере до тех пор, пока эти функции или переменные не были удалены, или их определения и значения не были вычищены или модифицированы. Все введенные во время сессии, но не сохраненные в блокнот или файл определения и все вычисленные, но не сохраненные значения теряются!!! С внутренней точки зрения сессия представляет собой последователь- ность вычислений (Evaluation). Типичная сессия состоит из нескольких десятков, нескольких сотен или, в исключительных случаях, нескольких тысяч вычислений. Для того, чтобы вычислить какое-то выражение, нуж- 38 но мышкой, либо посредством навигационных клавиш ↑ и ↓ поместить кур- сор в содержащую его ячейку и нажать Shift+Enter. Предостережение. Разумеется, в тот момент, когда мы начинаем всерьез использовать Mathematica как язык программирования в традиционном стиле, многие вычисления в этом смысле будут состоять в изменении установок каких-то функций, постановке ме- ток, передаче управления, удержании или вбрасывании каких-то значений или даже в том, чтобы отложить вычисление какой-то функции. Тем не менее, с точки зрения ядра каждое из этих действий, в том числе удержание и откладывание, является вы- числением некоторого специального вида и как внутренне, так и внешне оформляется по тому же регламенту, что вычисление 1+1. • Любое вычисление можно приостановить либо программно, коман- дой Interrupt[], либо в диалоговом режиме выбором в разделе Kernel главного меню команды InterruptEvaluation, горячий ключ Alt-, — это легко запомнить, если знать, что alt = halt представляет собой основную команду из лексикона итальянских карабинеров. • Любое вычисление можно прервать программно командой Abort[], либо в диалоговом режиме выбором в разделе Kernel главного меню ко- манды AbortEvaluation, горячий ключ Alt-. — ibid. • Первый из этих способов применяется, например, при отладке слож- ных программ, а второй — в случае, когда вычисление занимает неожидан- но много времени и у нас возникло подозрение, постепенно переходящее в уверенность, что либо определения каких-то используемых в нем функций ошибочны, либо значения каких-то параметров слишком велики. § 7. Блокноты и ячейки Начиная с версии 3.0 интерфейс Mathematica организован в форме блок- нотов (Notebook). Блокнотом называется интерактивный документ, со- держащий программу, текст, результаты вычислений, сообщения, графи- ку, таблицы и т.д. Блокнот может являться аналогом рабочей записной книжки, законченной научной статьи или текста учебного характера. Су- ществующий блокнот открывается при помощи команды Open меню File, команда New того же меню создает новый блокнот. Во время сессии Вы можете открывать или создавать несколько блокнотов и, наоборот, один и тот же блокнот может использоваться в большом количестве сессий. В кон- це сессии не забудьте записать (Save) изменения во всех открытых Вами блокнотах. В свою очередь, каждый блокнот организован как иерархическая струк- тура, состоящая из ячеек или клеток (Cell). Каждая ячейка включает одну или несколько строк, соединенных стоящей справа скобкой (Brack- et). Некоторые ячейки создаются пользователем, в то время как другие ячейки, содержащие сообщения об ошибках, результаты вычисления, сиг- налы подтверждения, статус системы и другие виды вывода, создаются самой системой в процессе сессии. Ячейки объединяются в группы (Groups). Входящие в группу ячейки соединяются общей скобкой, включающей скобки нескольких объединяе- мых ячеек. Например, система автоматически объединяет в одну группу 39 ячейку ввода (Input Cell или Evaluatable Cell) и получающиеся при ее исполнении ячейки вывода (Output Cell). При помощи содержащихся в меню Cell подменю Cell Grouping пользователь может вручную про- извольным образом сгрупировать ячейки (Group) или, напротив, разбить имеющиеся группы (Ungoup). Чтобы начать новую ячейку, переместите курсор в такую позицию, где он становится горизонтальным — внутри существующей ячейки курсор всегда вертикален. Щелкнув в этот момент по левой кнопке мыши, Вы создите горизонтальную черту (cell insertion bar). Начав печатать, Вы создадите новую ячейку. По умолчанию эта новая ячейка всегда имеет формат ячейки ввода. Чтобы изменить ее формат, щелкните по скобке, после чего найдите нужный формат в меню Cell, подменю Cell Proper- ties. Другой народный способ начать новую ячейку состоит в том, чтобы нажать Alt+Enter. Для того, чтобы вычислить (evaluate) содержимое ячейки ввода, по- местите курсор в эту ячейку и нажмите Shift+Enter. При этом ячей- ке автоматически будет присвоен промпт ввода (Input Prompt) формата In[n]:=, а результат вычисления через какое-то время появится в ячейке вывода, имеющей заголовок Out[n]= с тем же номером. В дальнейшем Вы можете ссылаться на n-й ввод как In[n], а на результат n-го вывода как Out[n]. Обратите внимание на разницу в формате: In[n] представляет со- бой отложенное значение и на протяжении сессии его вычисление может приводить к различным результатам, в то время как Out[n] представляет собой фактическое значение n-го вывода. Enter начать новую строку в текущей ячейке Shift+Enter вычислить содержание текущей ячейки Alt+Enter начать новую ячейку На начальном этапе работы придерживайтесь правила один промпт — одна функция — одна ячейка Иными словами, это значит, что в большинстве случаев, когда Вам хочет- ся просто нажать Enter, то, что Вам в действительности нужно — это Alt+Enter!!! Предостережение. При интерпретации инпута Mathematica имеет обык- новение игнорировать большую часть пробелов, табулирования и перенос строки!!! Как показывает наш опыт преподавания, именно непонимание этого фундаментального обстоятельства приводит к половине всех возни- кающих у студентов ошибок, некоторые из которых трудно отслеживают- ся. А именно, определив одну функцию, они два раза нажимают на Enter, после чего начинают в той же ячейке определять то, что они считают другой функцией. Но Mathematica продолжает интерпретировать все даль- нейшее содержание той же ячейки, не отделенное точкой с запятой, частью определения первой функции!!! Это значит, что при обращении к этому определению либо (как правило!) обнаружится синтаксическая ошибка, 40 либо начнутся другие увлекательные явления типа бесконечной рекурсии, либо произойдет что-либо еще более драматическое. Довольно часто един- ственный способ выпутаться из получающегося положения состоит в том, чтобы закончить сессию и перезапустить ядро. § 8. Общие советы и типичные ошибки Nessun effetto ` e in natura sanza ragione; intendi la ragione e non ti bisogna sperienza. — В природе ничто не происходит без причины; пойми эту причину и тебе не будут нужны никакие эксперименты. Leonardo da Vinci Mathematica is a complex piece of software, and coming to terms with this complexity can impose a steep learning curve upon a student whose primary interest is in learning some mathematics. In my ex- perience of teaching with Mathematica, it seems to be a product whic can too easily divide students very quickly into lovers and haters — not least I'm sure because of its rich but strict syntax. Philip Kent В настоящем параграфе мы опишем несколько простейших правил син- таксиса системы Mathematica. Все эти правила детально обсуждаются и иллюстрируются в дальнейшем, но по нашему опыту по крайней мере 90– 95% всех ошибок, совершаемых начинающими, связано именно с наруше- нием этих простейших правил. Всякий, кто научился писать Sin[x*y]^2 вместо sin^2(xy), может решить при помощи системы Mathematica любую задачу из вузовского курса математики за первые три курса. • Все имена встроенных функций состоят из полных английских слов или общепринятых сокращений и начинаются с заглавной бук- вы, например, экспонента обозначается Exp, а не exp, логарифм — Log, а не log и т.д. Если имя функции состоит из нескольких слов, они пи- шутся слитно, без знаков препинания, причем каждое из них начинается с заглавной буквы. • Аргументы функций всегда пишутся в квадратных скобках, cos(x) обозначается Cos[x], а не cos(x). Различные аргументы разделя- ются запятой, скажем, f (x, y, z) вводится как f[x,y,z]. Круглые скобки используются только для группировки. • Фигурные скобки используются для обозначения списков, наборов и множеств. Векторы и матрицы в Mathematica интерпрети- руются как списки. Например, вектор с (x, y, z) вводится как {x,y,z}, а матрица a b c d как {{a,b},{c,d}}. • Произведение обозначается через ∗. Выражение xy интерпрети- руется не как произведение x и y, а как новая переменная. Правильное обозначение произведения в операторной форме x*y, а в полной форме Times[x,y]. 41 Предостережение. В действительности иногда — но далеко не всегда!!! — пробел тоже интерпретируется как умножение, так что x y будет истолковано точно так же, как x*y. Единственный способ узнать, как ядро на самом деле понимает Ваш ввод, состоит, конечно, в том, чтобы взглянуть на полную форму того, что Вы печатаете. Так вот, FullForm[x y]===FullForm[x*y]===Times[x,y], но начинающему лучше не знать об этом и всюду ставить ∗. Есть несколько особых случаев, когда отстутствие пробела после цифры, после специального знака или перед ним тоже интерпретируется как умножение. Например, 2x значит то же самое, что 2*x, а x(y+z) — то же самое, что x*(y+z), но начинающему лучше вообще не пользоваться подобными сокращениями, тем более, что x2 значит совсем не то же самое, что x*2. Иными словами, FullForm[x2]===x2, а FullForm[x 2]===FullForm[x*2]===Times[2,x]). • Потенцирование записывается как x^y, или, в полной форме как Power[x,y]. Конечно, Вы можете вызвать потенцирование в традиционной форме x y через любую из палитр Basic Math Assistant, Basic Math In- put или Basic Typesetting, однако через полчаса работы с системой Вы убедитесь, что гораздо быстрее и удобнее набирать его в форме x^y. • Не жалейте скобок. Представления системы Mathematica о прио- ритете выполнения арифметических операций могут не совпадать с Вашим замыслом. Поэтому за исключением тех случаев, когда Вы абсолютно точ- но знаете, что происходит, никогда не применяйте два оператора подряд, не указав, в каком порядке они выполняются. Например, вместо x/y*z пишите (x/y)*z или x/(y*z), as appropriate. • Мало напечатать текст, нужно ввести его в ядро. До тех пор, пока Вы фактически не предложили системе произвести вычисление, т.е. не нажали Shift+Enter на текущей ячейке, содержимое этой ячейки является достоянием интерфейса, но не ядра, блокнота но не сессии! Тем самым, все введенные в этой ячейке функции остаются с точки зрения программы неопределенными, а все переменные, которым в этой ячейке присвоено значение — символами. • По умолчанию одна ячейка должна содержать одно вычисляемое вы- ражение. Все пробелы, табулирования и переносы игнорируются. Для отделения двух выражений они должны находиться не в разных строках, а в разных ячейках. Для создания новой ячейки нажмите Alt+Enter, либо переведите курсор на одну позицию вниз посредством ↓ и начните новый ввод. • Если Вы все же хотите поместить два или несколько вычисляемых выражений в одну ячейку, то они должны разделяться точкой с за- пятой, скажем f[x]; g[x]. Однако в этом случае будет отображен только результат последнего вычисления. Если Вы хотите увидеть оба результа- та, необходимо оформлять вычисление как список, в этом случае все вычисляемые выражения заключаются в фигурные скобки и разделяются запятой {f[x],g[x]}. 42 Несколько общих советов в завершение Experience is that marvelous thing that enables you recognize a mista- ke when you make it again. F. P. Jones Experience is what causes a person to make new mistakes instead of old ones. Oscar Wilde • Пишите простые программы. Экономьте свое время, а не время ком- пьютера. Во всех случаях ясность и правильность программы важ- нее ее эффективности. • Проверяйте, что Вы правильно понимаете использование внутренних функций и тестируйте работу каждой написанной Вами функции на совсем маленьких примерах, когда Вы можете проверить правильность ответа в уме, и на примерах с известным ответом. • Главное правило оптимизации программ: don’t do it!!! Если про- грамма работает, не пытайтесь ее улучшить. • Присваивайте глобальным и редко встречающимся перемен- ным длинные имена, а локальным и часто встречающимся — короткие имена. • Объясняйте системе то, что Вы хотите посчитать, а не то, как она должна это сделать. По возможности используйте встроенные функции. Не пытайтесь предписывать системе конкретные процедуры. Если Вы не являетесь профессиональным вычислителем, то любой встроенный алгоритм лучше любого алгоритма, который Вы можете приду- мать. • Разбивайте любой алгоритм на последовательности опреде- лений. Любая программа, в которой больше, чем две или три строчки, неправильно написана и должна быть разбита на последовательность бо- лее коротких программ. • Применяйте к промежуточным результатам функции упро- щения Simplify, FullSimplify, Refine и т.д. Система, как правило, не производит упрощений автоматически. • Команды решения уравнений такие как Solve как правило дают не все, а лишь какие-то решения уравнений. В особенности это относится к трансцендентным уравнениям. Проверяйте полученные решения. В случае, если Вам нужно настоящее решение, применяйте команды Reduce, Eliminate и т.д. • В рекуррентных процедурах запоминайте промежуточные ре- зультаты при помощи конструкции Remember f[n ]:=f[n]=... • Заменяйте циклы работой со списками или встроенными ите- рационными процедурами такими как Do, Sum, Product и т.д. 43 • Никогда не применяйте приближенные вычисления к зада- чам с точными условиями. Задачи в целых или рациональных числах должны обрабатываться только алгоритмами бесконечной точности. При- ближенные вычисления могут применяться только к задачам с приближен- ными условями. • Не производите никаких округлений в процессе вычисления. Проводите все вычисления с бесконечной точностью и переходите к чис- ленным значениям только на последнем шаге • Никогда не используйте приближенные вычисления в рекур- рентных или итерационных процедурах!! Результат итерационной процедуры, выполненной без контроля сходимости и устойчивости, без изу- чения обусловленности и оценок ошибок, не может быть ничем иным, кроме артефакта. 44 Глава 3. ПРАКТИЧЕСКОЕ ВВЕДЕНИЕ В СИСТЕМУ Mathematica Das sieht schon besser aus! Man sieht doch wo un wie! — А вот это уже лучше! По крайней мере видно, куда и как! Johann Wolfgang von Goethe, Faust I Математика может быть определена как единственная наука, в которой мы • знаем, о чем мы говорим; • знаем, что мы говорим; • знаем, верно ли то, что мы говорим 12 Bertran Russell — Вибрационализм, — сказал Никсим Сколповский, обращаясь к нескольким пожилым женщинам, по виду — работницам фаб- рики “Буревестник”, непонятно как оказавшимся на авангардной выставке, — это направление в искусстве, исходящее из того, что мы живем в колеблющемся мире и сами являемся совокупностью колебаний. Женщины испуганно притихли. Никсим поправил непрозрачные очки с узкими прорезями и продолжил: — Но простое отражение этой концепции в артефакте еще не приведет к появлению про- изведения вибрационалистического искусства. Чистая фиксация идей неминуемо отбросит нас на исхоженный пустырь концепту- ализма. С другой стороны, возможность вибрационалистической интерпретации любого художественного объекта приводит к тому, что границы вибрационализма оказываются размытыми и как бы несуществующими. Поэтому задача художника-вибрационалиста — проскочить между Сциллой концептуализма и Харибдой теоре- тизирования постфактум. Виктор Пелевин. Встроенный напоминатель В связи с экспансией митьковского движения на север, юг, запад и восток давно пора подготовиться к массовому паломничеству иностранных туристов в места скопления митьков. Халатное, поверхностное знакомство с митьковской лексикой при- водит к быстрому искажению и, в конечном счете, вырождению смысла цитат и выражений. Отсюда видна необходимость дополнить список употребляемых выражений и адаптировать его до уровня разумения иностранца. |