Математика. Настоящий учебник посвящен системе Mathematica прикладному пакету компьютерной алгебры, при помощи которого можно решать любые задачи, в которых в той или иной форме встречается математика
Скачать 4.43 Mb.
|
RegionPlot. Обратите внимание, что значение этой опции распространя- ется на RegionPlot, но не на GraphicsGrid. Почему? • Простейшая двумерная графика. Мы не будем пытаться сколь- нибудь систематически описывать здесь технику построения двумерных и, тем более, многомерных картинок – эта тема требует отдельного рассмот- рения. 33 Ограничимся построением двух знаменитых картинок. При этом мы не стремимся здесь дать наиболее короткую или эффектную програм- му, а приводим такое описание, где смысл каждой команды должен быть понятен начинающему. В действительности, мы обычно не вводим ника- ких координат руками, а вычисляем их (как таблицы, решения уравнений или что-нибудь в таком духе), после чего применяем к списку координат 33 В материалах Documentation Center визуазизации данных и построению графиков посвящен специальный раздел Graph Drawing 103 графические примитивы посредством конструкций типа Map[Point,...], Map[Line,...] и т.д. Получающиуся текст не намного короче, но имеет более прозрачную с точки зрения опытного пользователя структуру и при этом резко уменьшается вероятность ошибки. Первый из приведенных ниже текстов порождает изображение плоско- сти Фано — проективной плоскости над полем из двух элементов. Не углубляясь, поясним, что в терминах этой картинки описывается умноже- ние семи мнимых единиц в алгебре октав Кэли: In[103]:=rt=Sqrt[3]/2; nodes= {{0,0},{1,0},{2,0},{1,2*rt}, {1,2*rt/3},{1/2,rt},{3/2,rt}}; Show[Graphics[ { {AbsolutePointSize[5], Map[Point,nodes] }, {AbsoluteThickness[1.5], Line[ {{0,0},{2,0},{1,2*rt},{0,0}}], Line[ {{0,0},{3/2,rt}}], Line[ {{2,0},{1/2,rt}}], Line[ {{1,2*rt},{1,0}}], Circle[ {1,2*rt/3},2*rt/3]}}]] Рис Плоскость Фано Второй текст порождает рисунок из Альмагеста, изображающий постро- ение правильного пятиугольника при помощи циркуля и линейки: 104 In[104]:=Show[Graphics[ { {AbsolutePointSize[4], Point[ {-1/2, 0}], Point[ {-1/2+Sqrt[5]/2,0}], Point[ {Cos[2*Pi/5],Sin[2*Pi/5]}], Point[ {Cos[2*Pi/5],-Sin[2*Pi/5]}]}, {AbsoluteThickness[0.5], Circle[ {0,0}, 1], Circle[ {-1/2,0},Sqrt[5]/2], Circle[ {-1/2+Sqrt[5]/2,0}, 1]}}, Axes->True]] -1.5 -1.0 -0.5 0.5 1.0 1.5 -1.0 -0.5 0.5 1.0 Рис.18: Рисунок из Альмагеста Мы не будем детально комментировать эти тексты, но большая часть того, что происходит, понятна сама по себе: ◦ Команда Graphics соединяет определенные в ее теле графические при- митивы в составной двумерный объект формата Graphics, который после этого обрабатывается как единое целое. ◦ Команда Show отображает этот графический объект на экране. У начи- нающего в этом месте должен возникнуть вопрос, а что еще можно сделать с графическим объектом, кроме как отобразить его на экране? Ну, с ним можно много чего делать: вместо этого мы могли бы, например, сразу запи- сать его в файл, включить его в определение другого графического объекта или мультипликации, преобразовать в другой формат, изменить настройки опций, применить к нему какое-то геометрическое преобразование и т.д. Следующие три типа объектов называются графическими примити- вами, при помощи них строятся различные элементы картинки, в данном случае точки, линии и окружности: 105 ◦ Примитив точка Point[{x,y}] определяет точку (x, y) с координатами x и y. ◦ Примитив линия Line[{{u,v},{x,y}}] определяет отрезок с конца- ми (u, v) и (x, y). Вызванный с более длинным списком координат этот примитив порождает ломаную, состоящую из отрезков, соединяющих по- следовательные точки. Например, Line[ {{u,v},{x,y},{z,w}}] состоит из двух отрезков, а именно, отрезка с концами (u, v) и (x, y) и второго отрезка с концами (x, y) и (z, w). В случае, когда последняя точка списка совпадает с первой, мы получим замкнутую ломаную. Например, Line[ {{u,v},{x,y},{z,w},{u,v}}] изображает треугольник с вершинами (u, v), (x, y) и (z, w). ◦ Примитив окружность Circle[{x,y},r] определяют окружности ра- диуса r с центром в (x, y). Кроме того, в системе имеется много других графических примитивов, на- пример, Rectangle, Disk и Polygon для закрашенных фигур, Raster, Post- Script, Text и т.д. Графические директивы, применненные к соответствующим прими- тивам, задают значения параметров, которые применяются при их постро- ении: ◦ Директива абсолютный размер точки AbsolutePointSize[d] зада- ет (абсолютный) размер точек в типографских пунктах. ◦ Уже встречавшаяся нам при обсжудении графиков директива абсо- лютная толщина AbsoluteThickness[d] задает (абсолютную) толщину линий в типографских пунктах. Обратите внимание на синтаксис!! Графические директивы (в отличие от опций, применяемых к объекту в целом) образуют список вместе с теми гра- фическими примитивами, к которым они относятся. Это сделано для того, чтобы на одном и том же рисунке можно было рисовать точки разных раз- меров и линии разной толщины. Имеется большое количество других гра- фических директив: PointSize, задающая (относительный) размер точек, Dashing и AbsoluteDashing для создания пунктирных линий, GrayLevel, RGBColor, Hue и т.д. ◦ Опция Axes->True предлагает включить в графический объект коор- динатные оси. • Построение графиков функций двух переменных. График функции двух переменных строится при помощи команды Plot3D, кото- рая порождает объект формата SurfaceGraphics. В простейшем варианте эта команда вызывается в формате: Plot3D[f[x,y], {x,a,b},{y,c,d}] Эта команда порождает трехмерный график функции f (x, y) при x при меняющемся от a до b, и y меняющемся от c до d. 106 В одном отношении использование команды Plot3D радикально отли- чается от использования команды Plot. А именно, Plot трактует спи- сок функций как предложение построить графики нескольких функций на одной картинке. При этом Plot может построить графики сколь угодно большого количества функций, это лимитируется только памятью Вашего компьютера и разрешением устройств вывода. В то же время первый ар- гумент команды Plot3D может быть либо одной функцией, либо списком из двух функций. Однако вызванная в формате Plot3D[ {f[x,y],g[x,y]},{x,a,b},{y,c,d}] команда Plot3D будет воспринята отнюдь не как пожелание построить гра- фики функций f и g на одной картинке. Нет, это пожелание построить график функции f , для которого затенение задается функцией g. Приведем совсем простой пример использования команды Plot3D. Вос- произведенный на Рисунке 19 график функции cos(x 2 − y 2 ) построен при помощи следующей команды: In[105]:=Plot3D[Cos[x^2-y^2], {x,-Pi,Pi},{y,-Pi,Pi}, MeshStyle->AbsoluteThickness[1], BoxStyle->AbsoluteThickness[0.8], PlotPoints->60, PlotLabel->"Рис. 19: Cos[x^2-y^2]"] Чтобы понять, что здесь происходит, нужно знать, что графический объект формата SurfaceGraphics состоит из большого количества данных, самы- ми важными из которых являются: ◦ собственно поверхность с координатами (x, y, f(x, y)), ◦ наброшенная на нее сетка или мешок Mesh, 107 ◦ подсветка Lighting, ◦ ящик Box. Кроме того, в полное описание объекта этого типа входят еще точка зре- ния ViewPoint, оси Axes, решетка Grid, текст Text и т.д. ◦ Опция Shading->False убирает нюанс и введена исключительно для получения черно-белой картинки. В обычных ситуациях мы никогда не используем эту опцию — для полу- чения изображения высокого качества на экране компьютера или цветном принтере поступают прямо противоположным образом. А именно, в этом случае мы обычно убираем не нюанс, а сетку Mesh->False. При этом по- лучается изображение, приближающееся по своим художественным досто- инствам к лучшим холстам и доскам Дени, Дали и Дельво. Использование следующих двух опций полностью аналогично использо- ванию уже встречавшизся нам опций PlotStyle и AxesStyle. Они задают графические директивы, которые следует применять к соответствующим частям трехмерного графика: ◦ Опция MeshStyle описывает стиль сеточных линий, в данном случае абсолютную толщину линий. ◦ Опция BoxStyle описывает стиль охватывающего “ящика”, в дан- ном случае снова мы меняем только абсолютную толщину линий. ◦ Опция PlotPoints показывает, в каком минимальном количестве точек следует вычислять значения функции. Вызванная в формате PlotPoints->n эта опция предписывает команде Plot вычислять значение функции как минимум в n точках — после чего продолжать вычислять значения в про- межуточных точках для быстро осциллирующих функций. По умолча- нию PlotPoints->25. Для команды Plot3D опция PlotPoints в формате PlotPoints->n предписывает вычислять значения в n точках по каждой из координат. Чтобы вычислять значения в m точках по x и в n точках по y, эту опцию следует задавать в формате PlotPoints-> {m,n}. Для получения графики высокого качества мы часто задаем PlotPoints- >500 и даже PlotPoints->1000, что изначально требует вычисления мил- лиона значений функции и может занять некоторое. Понятно, что это имеет смысл только, если Вы собираетесь выводить эту картинку на такое устройство, которое допускает соответствующее разрешение, и только если одновременно убрать сетку, положив Mesh->False. Упражнение. Постройте воспроизведенный на рисунке 20 график функ- ции cos(x 2 + y 2 ). 108 Стоит подчеркнуть, что в объекте формата SurfaceGraphics хранится го- раздо больше информации, чем в видимом изображении. Например, этот объект сохраняет и те части поверхности, которые при просмотре с дан- ной точки зрения закрыты от зрителя другими частями. Однако эти части можно увидеть, если повернуть поверхность или изменить точку зрения. Более того, опция HiddenSurface->False делает поверхность прозрачной и, таким образом, все части поверхности, обычно закрытые другими ее частями, становятся видимыми. В завершение параграфа хотелось бы высказать надежду, что нам уда- лось показать некоторые ключевые приемы работы с графикой в системе Mathematica, которые позволят читателю строить подобные изображенным картинки – и получать от этого удовльствие. § 7. Суммы, произведения, пределы Рамануджан говорил, что богиня Намаккал внушала ему форму- лы во сне. Часто встав с кровати он (не) мог записать результаты и быстро проверить их . . . Рамануджан имел устойчивые религи- озные взгляды. Он особенно почитал богиню Намаккал. Сеши Нараяна Айар и Рамачандра Рао, “Жизнь Рамануджана” Я меньше всего хочу, чтобы Вы вскидывали руки вверх и воскли- цали: “Здесь есть что-то необъяснимое, таинственное проявление древней восточной мудрости.” Не верю я в эту древнюю восточ- ную мудрость. Гарольд Годфри Харди 34 Системы компьютерной алгебры полностью обесценивают все традицион- ные навыки, которым обучают в курсах математического анализа, высшей 34 Г.Г.Харди, Двенадцать лекций о Рамануджане. — М., ИКИ, 2002, с.1–335; стр.13. 109 математики, теории дифференциальных уравнений. Mathematica умеет вычислять пределы, ряды, бесконечные произведения, дифференцировать, интегрировать, раскладывать в степенные и тригонометрические ряды, ре- шать дифференциальные уравнения и уравнения в частных производных и т.д. Более того, мы готовы утверждать, что она делает все эти вещи лучше, чем любой неспециалист, и все еще лучше, чем подавляющее большинство профессиональных математиков. • Суммы. Одной из простейших и самых полезных команд системы является команда Sum. А именно, Sum[f[i], {i,m,n}] выражает сумму n P i=m f (i) значений функции f по i от m до n (с шагом 1). Обратите вни- мание на форму итератора {i,m,n}, которая используется в большинстве итеративных команд системы. Эта форма взята из языка C, остальные универсальные системы компьютерной алгебры, такие как Axiom, Maple, MuPAD используют i=m..n взятую из Pascal. По умолчанию шаг суммиро- вания равен 1, однако задание итератора в форме {i,m,n,d} говорит, что i должно меняться от m до n с шагом d. Многие алгебраические выражения, многочлены, дроби и тому подобное часто удобно выражать в виде сумм. Вот, скажем, как проще всего ввести многочлен Тэйлора экспоненты: In[106]:= Sum[x^n/n!, {n,0,6}] Out[106]=1+x+x^2/2+x^3/6+x^4/24+x^5/120+x^6/720 В § 1 мы уже обсуждали применение команды Sum для суммирования конкретных чисел. Однако это умеют делать и калькуляторы вроде Math- cad. Гораздо интереснее, что в Mathematica при помощи команды Sum мож- но производить все символьные манипуляции, которые могут встретиться начинающему, причем не только с конечными суммами, но и с бесконечны- ми рядами! • Символьное вычисление сумм. Совершенно замечательно, что суммы могут вычисляться не только в численном, но и в символьном виде, причем один или оба предела суммирования могут быть бесконечными! Что еще интереснее, пределы суммирования сами могут быть символами!!! Именно этим и отличаются интеллигентные системы Maple и Mathematica от бездушных калькуляторов наподобие Matlab. Следующий совершенно удивительный пример показывает, что Mathe- matica хорошо усвоила 35 , что такое многочлены Бернулли: In[107]:= Do[Print[Sum[i^m, {i,1,n}]],{m,1,8}] Out[107]=1/2*n*(1+n) 1/6*n*(1+n)*(1+2*n) 35 По причинам исторического и психологического плана мы предпочитаем избегать напрашивающегося выражения понимает, которое было бы использовано в случае успеш- ного применения математической индукции в аналогичном контексте человеческим су- ществом. 110 1/4*n^2*(1+n)^2 1/30*n*(1+n)*(1+2*n)*(-1+3*n+3*n^2) 1/12*n^2*(1+n)^2(-1+2*n+2*n^2) 1/42*n*(1+n)*(1+2*n)*(1-3*n+6*n^3+3*n^4) 1/24*n^2*(1+n)^2(2-4*n-n^2+6*n^3+3*n^4) 1/90*n*(1+n)*(1+2*n)*(-3+9*n-n^2-15*n^3+5*n^4+ 15*n^5+5*n^6) A parte: еще бы ей этого не знать, если многочлены Бернулли и Эйлера являются основным инструментом суммирования полиномиальных рядов вообще. Итеративная конструкция с Do и Print нам уже встречалась при об- суждении круговых многочленов. Первая из представленных здесь сумм, традиционно называется суммой арифметической прогрессии и изучается в школе, вторая и третья часто обсуждаются в математических кружках, но вот дальнейшие суммы, открытые в XVII веке Йоганном Фаульхабером и Яковом Бернулли 36 , известны главным образом только профессиональ- ным математикам. Поскольку невозможно представить, что все подобные суммы содержатся в системе в табличной форме (ниже мы приводим еще несколько примеров), это значит, что система в какой-то форме владеет идеей математической индукции. В действительности, следующий пример должен убедить каждого мини- мально знакомого с предметом в том, что Mathematica все же не знает на память большинство сумм, а по-настоящему их вычисляет, причем делает это совершенно иначе, чем это свойственно человеку. Вот сумма, которую каждый будущий профессиональный математик открыл к возрасту пяти лет: In[108]:= Sum[i, {i,1,2*n-1,2}] Out[108]=Floor[n]^2 Еще раз напомним, что вызов итератора в форме {i,m,n,d} означает сум- мирование по i от m до n с шагом d. Таким образом, мы предложили системе просуммировать все нечетные числа от 1 до 2n − 1. Видно, что здесь представлен не заученный ответ, а плод фактического (притом до- статочно сурового) размышления. Поскольку мы изначально подразуме- вали (хотя пока и не сообщили системе), что число n целое, мы видим, что ценой небанального напряжения Mathematica сумела открыть форму- лу 1 + 3 + . . . + (2n − 1) = n 2 . В действительности в языке системы есть средства, которые позволяют декларировать, что n является целым числом (или, с точки зрения внутреннего языка Mathematica, имеет объектный тип Integer): ◦ спецификация доменов, ◦ спецификация паттернов. 36 В.В.Прасолов, Многочлены. — М., МЦНМО, 2000, с.1–335; стр.135–137. 111 Эти средства, относящихся к более высоким сферам программирования, мы здесь лишь упоминаем, но рассматривать не будем. Разумеется, по- сле провозглашения n целым, система сразу вернула бы ответ в форме n 2 Однако в § 5 нам уже встречалась команды Refine и Assuming, которые позволяет упростить ответ при определенных предположениях. Итак, сде- лаем еще одну попытку: In[109]:= Refine[Simplify[Sum[i, {i,1,2*n-1,2}], Element[n,Integers]]] Out[109]=n^2 Понятно, что здесь произошло? Мы наконец-то внятно объяснили системе, что n целое. А именно, предположение Element[n,Integers] как раз и состоит в том, что n является элементом домена целых чисел Integers. разумеется, применив вначале Refine с условием Element[n,Integers], а потом Simplify, мы тоже получили бы результат n 2 Теперь, когда мы знаем, что Mathematica не вытаскивает ответы из каких-то загадочных таблиц, а порождает их силой чистого разума, пред- ложим ей что-нибудь чуть более хитрое: In[110]:= Sum[2^i/i!, {i,1,n}] Out[110]=-1+E^2*(1+n)*Gamma[1+n,2]/Gamma[2+n] Появляющаяся в числителе функция Γ(x, y) — это неполная гамма- функция: Γ(x, y) = Z ∞ y t x −1 e −t dt, в знаменателе стоит обычная гамма функция Эйлера Γ(x) = Γ(x, 0). Вы действительно думаете, что и этот ответ можно извлечь из таблицы? И где то место, где может храниться такая Таблица? • Кратные суммы. Кратная сумма вида n P i=m l P j=k f (i, j) выражается при помощи Sum[f[i,j], {i,m,n},{j,k,l} Здесь мы первый раз встречаемся с явлением, понимание которого чрезвычайно существенно для правильного использования итерационных команд вообще и команд формирования спис- ков и работы с списками в особенности! Аналогичное соглашение действует для кратного интегрирования, построения графиков функций нескольких переменных и т.д. А именно, обратите внимание, что внутренние итерато- ры пишутся последними! Иными словами, Sum[f[i,j], {j,k,l},{i,m,n}] значит совершенно не то же самое, что Sum[f[i,j], {i,m,n},{j,k,l}]. В самом деле, при этой новой записи вначале происходит суммирование по i, а уже потом суммирование по j, в то время как в нашей исходной сумме вначале происходило суммирование по j и только потом суммирование по i. Разумеется, для конечных сумм, в том случае, когда пределы суммиро- вания внутренних сумм сами не зависят от i, порядок итераторов можно изменить, значение суммы при этом не меняется — именно этот прием и 112 называется изменением порядка суммирования. Однако для беско- нечных сумм, а также в том случае, когда k и l сами являются функциями от i, ничего подобного делать нельзя. Проиллюстрируем это явление на простом но важном примере. В ком- пьютерной математике и анализе алгоритмов очень часто встречаются ча- стичные суммы гармонического ряда H n = 1 + 1 2 + 1 3 + . . . + 1 n = n X i=1 1 i , которые называются гармоническими числами. В Mathematica есть специальное обозначение для H n , а именно HarmonicNumber[n], однако в дальнейшем мы иногда будем делать вид, что этого не знаем. Гармони- ческий ряд расходится — иными словами, H n стремятся к бесконечности, хотя и очень медленно, порядка ln(n). Вот несколько первых гармониче- ских чисел: In[111]:= Table[HarmonicNumber[n], {n,1,12}] Out[111]= {1,3/2,11/6,25/12,137/60,49/20,363/140,761/280, 7129/2520,7381/2520,83711/27720,86021/27720 } Так как Mathematica знает определение гармонического числа, то вычисле- ние Sum[1/i, {i,1,n}] дает HarmonicNumber[n]. В прежние годы в качестве упражнения на математическую индукцию мы часто предлагали студентам вычислить сумму первых гармонических чисел, т.е. сумму H 1 + H 2 + . . . + H m . Разумеется, это один из тех случаев, когда формулировка задачи содер- жит подсказку, а именно, предложение вычислить сумму недвусмысленно указывает на то, что это возможно. А теперь сравните следующие два выражения: Sum[1/i, {n,1,m},{i,1,n}] Sum[1/i, {i,1,n},{n,1,m}] Понятно, что эти выражения вычисляют? В первой сумме осуществля- ется суммирование вначале по i от 1 до n, а потом по n от 1 до m и это как раз то, что мы хотели. С другой стороны, во второй сумме сначала осу- ществляется суммирование по n от 1 до m, а потом все эти m одинаковых сумм (ведь 1/i не зависит от n) суммируются по i от 1 до n. Таким образом, если Вы не уверены, что отчетливо понимаете, что здесь происходит, то вот Вам добрый совет: оформляйте кратные суммы обыч- ным в математике образом, с повторением команды Sum. Например, иско- мую сумму гармонических чисел можно еще выразить посредством In[112]:= Sum[Sum[1/i, {i,1,n}],{n,1,m}] Out[112]=-1 - m + HarmonicNumber[1 + m] + m*HarmonicNumber[1 + m] 113 Это чуть длиннее и менее элегантно с программистской точки зрения, за- то не оставляет никакого места сомнению. Ясно, что здесь суммирование происходит вначале по i от 1 до n — это дает нам n-е гармоническое число H n — а потом полученные результаты суммируются по n от 1 до m. Уже весьма простые на вид кратные суммы при символьном вычислении часто приводят к достаточно замысловатым ответам. Попытка вычислить первую двойную сумму, которая приходит в голову, In[113]:= Sum[1/(i+j), {i,1,m},{j,1,n}] Out[113]=-PolyGamma[0,1+n]+PolyGamma[0,1+m+n] сразу приводит нас к функции дигамма ψ(x) = Γ ′ (x)/Γ(x) (логарифмиче- ская производная гамма-функции Эйлера). Ясно, что получение подобно- го ответа вручную в реальном времени лежит за пределами возможностей большинства профессиональных математиков, кроме избранных специали- стов по комбинаторике, теории чисел, классическому анализу и математи- ческой физике. • Бесконечные суммы. Mathematica умеет выражать многие беско- нечные суммы как значения элементарных или специальных функций: In[114]:= Sum[1/(n!x^n), {n,0,Infinity}] Out[114]=E^(1/x) In[115]:= Sum[1/n^3, {n,1,Infinity}] Out[115]=Zeta[3] In[116]:= Sum[1/(n!n^3), {n,1,Infinity}] Out[116]=HypergeometricPFQ[ {1,1,1,1},{2,2,2,2},1] В первом случае мы видим экспоненту, во втором — значение ζ(3) дзета- функции Римана, а фигурирующая в третьем ответе HypergeometricPFQ представляет собой обобщенную гипергеометрическую функцию, которая возникает в самых разных вопросах математики, от комбинаторики и тео- рии чисел до математической физики. • Произведения. Формат команды Product полностью аналогично формату Sum. А именно, Product[f[i], {i,m,n}] выражает произведение n Q i=m f (i) значений функции f по i от m до n (с ша- гом 1). Как видим, здесь применяется обычная форма итератора {i,m,n}. Как и в случае сумм, произведения могут использоваться для численных вычислений, такой пример мы уже приводили, и для короткой записи ал- гебраических выражений. Вот, например, как проще всего ввести гауссов многочлен, выражающий количество базисов в пространстве размерности n над полем из q элементов: In[117]:= Product[q^n-q^i, {i,0,n-1}] /. n->10 Out[117]=(-1+q^10)(-q+q^10)(-q^2+q^10)(-q^3+q^10)(-q^4+q^10) (-q^5+q^10)(-q^6+q^10)(-q^7+q^10)(-q^8+q^10)(-q^9+q^10) 114 Используемая в этом тексте замена /. n->10 состоит из оператора /. или, в полной форме, ReplaceAll и правила подстановки n->10. Примененные вместе они побуждают систему заменить n на 10 всюду, на протяжении од- ного вычисления. Преимущество такой конструкции перед присваиванием n=10 состоит в том, что n не приобретает постоянного значения, так что предшествующий текст может быть без всяких изменений включен в другое вычисление, в котором n имеет любое другое значение — или само явля- ется своим собственным значением, т.е. рассматривается как независимая переменная. Подробнее все нюансы, связанные с переменными и их значе- ниями, а также использованием присваиваний и подстановок, обсуждаются в Модуле 2. Разумеется, Mathematica не будет автоматически раскрывать скобки в символьном выражении, получающемся в результате образования произве- дения, чтобы принудительно раскрыть скобки в конечном произведении, нужно применить Expand или Distribute: In[118]:= Product[1-x^i, {i,1,10}] Out[118]=(1-x)(1-x^2)(1-x^3)(1-x^4)(1-x^5) (1-x^6)(1-x^7)(1-x^8)(1-x^9)(1-x^10) In[119]:= Distribute[Product[1-x^i, {i,1,10}]] Out[119]=1-x-x^2+x^5+x^7+x^11-x^12-x^13-x^14-2*x^15+x^18+x^19+ x^20+x^21+3*x^22-x^25-x^26-2*x^27-2*x^28-x^29-x^30+ 3*x^33+ x^34+x^35+x^36+x^37-2*x^40-x^41-x^42-x^43+ x^44+x^48+x^50-x^53-x^54+x^55 Как и в случае сумм, один или оба предела в задании итератора могут быть бесконечными. Скажем, вычисление эйлеровского произведения In[120]:= Product[(1-1/Prime[n]^2)^(-1), {n,1,Infinity}] где Prime[n] обозначает n-е простое число, дает явное значение π 2 /6. • Проверка на порогах. Вот одно из наших излюбленных произве- дений, как из уважения к классикам XVIII века, так и конкретно с точки зрения сравнения интеллектуальных возможностей систем компьютерной алгебры и примазывающихся к ним: 2n Y i=1 i ( −1) i −1 = 1 · 3 · 5 · . . . · (2n − 1) 2 · 4 · 6 · . . . · 2n Предложите Вашей любимой системе вычислить это произведение. Досто- инство этого теста состоит в простоте формулировки и убийственной убеди- тельности ответа. Тот, кто понимает предмет, но не знаком с его историей, должен в этот момент испытывать чувство культурного шока: ожидаем ли мы, что система может заметить, что в знаменателе стоит порядок окта- эдральной группы 2 n n! — 2 n n! |