Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Mathematica 5. ╨б╨░╨╝╨╛╤Г╤З╨╕╤В╨╡╨╗╤М

.pdf
Скачиваний:
1
Добавлен:
19.11.2023
Размер:
33.75 Mб
Скачать

ContourPlot::plnr

2 (x^ + « 1» ) V « 1 » — (у +Abs [у]) « 1» « 1»

is not a machine-size real number

at {x, y}

{-9.86622, -10.}. More...

G e n e r a l::s to p

 

Further output of ContourPlot::plnr will

be suppressed during this calculation. More...

C o n to u rG ra p h ic s : : c t p n t

The contour is attempting to traverse a cell in which some of the points have not evaluated to numbers, and it will be dropped. More...

C o n to u rG ra p h ic s :: c t p n t

The contour is attempting to traverse a cell in which some of the points have not evaluated to numbers, and it will be dropped. More...

C o n to u rG ra p h ic s :: c t p n t

The contour is attempting to traverse a cell in which some of the points have not evaluated to numbers, and it will be dropped. More...

G eneral: :s to p

Further output of ContourGraphics::ctpnt will

be suppressed during this calculation. More...

Мультимедиа: геометрия, графика, кино, звук

301

График

I m p l i c i t P l o t [

S q r t [ (х л2 + у А2 ) A5] — 2 * (A b s[ у ] + у ) * (х А2 + у А2 )= = 0 ,

{ х , - 1 0 , 1 0 } , { у , - 1 0 , 1 0 } , P lo t P o in t s - > 3 0 0 ] ; //T im in g

вообще выглядит пустым. График же

I m p l i c i t P l o t [ { x A2 - S i g n [ 6 у - у А2 ] = = 0, х Л2+ ( у - 6 ) л2= = 0,

(у —5 ) л2 + ( x - 2 S ig n [ х ] ) А2 -1 = = 0 ,

( у - б ) л2 + (х - S i g n [ х ] ) A2 - 2 S i g n [у -б ]+ 1 = = 0 , ( х А2 + у А2 ) A2 -1 6 y * A b s [х ]= = 0 ,

M in [ х л4 - 3 у л4 , Эу+18- A b s [5 х л2 - 2 ] ] = = 0 ) ,

{ х , - 3 , 3 } , { у , - 2 , 7 } , P l o t P o i n t s - > 5 0 0 ,P l o t D i v i s i o n - > 2 0 0 ] ; //T im in g

{3.156

Second,Null}

рисуется,

но не без проблем: некоторые параметры (P lotP oin ts->500,

PlotDivision->200) пришлось подбирать, иначе мелкие штрихи пропадают. Еще большие проблемы возникают при вычерчивании следующего графика.

302

Гпава 9

ImplicitPlot[{Min[xA2+yA2-2x,xA2+16yA2-l,y]==0,

8y+x*Sqrt[Abs[x+1](2+x-xA2)]==0,2xA2+2yA2-2x-2y+l==0},

{x,-2,2},{y,-10,10}, PlotPoints->500,PlotDivision->200];

ContourGraphics::ctpnt

The contour is attempting to traverse a cell in which some of the points have not evaluated to numbers, and it will be dropped. More...

General::stop

Further output of ContourGraphics::ctpnt will

be suppressed during this calculation. More...

График же

ImplicitPlot[{27y-xA2(x+2)A2*(2-x)(Sqrt[9-xA2]+ (x+3)/40)==0, Max[у-Sqrt[x+3]* (Exp[-100(x+1)A2]+ Exp[-100(x-2)A2J),

Sign[x-2]+1/2]==0,

9xA2+48x+9yA2+64==0},

{x,-3,3},{y, -7,3}, PlotPoints->1000,PlotDivision->200];//Timing

{9.203 Second,Null}

вычерчивается без проблем.

Так же легко вычерчивается и следующий график.

ImplicitPlot [{Max [2-Abs [х] -2Abs [2у-х+3] ,

Min[хА2+уА2-4х,3xA2-yA2+9-4x*Sqrt[9-уА2], 4yA2+x+l-5y*Sqrt[1+х]]]==0,

1бхА2-32х+16уЛ2-32у+31==0), {х,-1,10},{у,-3,3},PlotPoints->500];//Timing

Мультимедиа: геометрия, графика, кино, звук

303

{2.485 Second,Null}

График же

ImplicitPlot[((x+4)A2+1-Sign[l-yA2])((x+3)A2+yA2+2Sign[x+3]+1) ((2x+3)A2+yA2-l)((хл2-х)A2-Sign[l-yA2]+l)(yA2+Sign[xA2-x]+1) ((x-3)A2+yA2+2Sign[x-3]+1) ((x-2)A2+(y-1) A2+Sign{2-x]+Sign[y-1]+1) ((xA2-9x+20)A2-Sign[1—yA2]+1) ((y+Abs[x-4]+Abs[x-5])A2-Sign[<x-4)(21/4-x))+1)==0, {x,-4,5},{y,-1,1.1},PlotPoints->1000,PlotDivision->2500];//Timing

{6.781 Second,Null}

построению почти не поддается: при изменении параметров PlotPoints->lOOO, PlotDivision->2500 в нем часто исчезают те или иные детали. Не удается его по­ строить ни вот так

ImplicitPlot[((x+4)A2+1-Sign[1-уЛ2])((x+3)A2+yA2+2Sign[х+3]+1) ((2х+3)л2+ул2-1)((хА2-х)A2-Sign[l-yA2]+l)(yA2+Sign[хА2-х]+1) ((x-3)A2+yA2+2Sign[х-3]+1) ((х-2)л2+(y-1)A2+Sign[2-х}+Sign[у-1]+1) ((хА2-9х+20)A2-Sign[1-уА2]+1) ((y+Abs[x-4]+Abs[x-5])A2-Sign[(x-4)(21/4-x)]+l)==0, {x,-4,5},PlotPoints->1000,PlotDivision->250];

ни вот так

ImplicitPlot[{(x+4)A2+1-Sign[1—yA2]==0, (x+3)A2+yA2+2Sign[x+3]+1==0, (2x+3)A2+yA2-l==0, (xA2-x)A2-Sign[l-yA2]+l==0, yA2+Sign[xA2-x]+1==0, (x-3)A2+yA2+2Sign[x-3]+1==0, (x-2)A2+(y-1)A2+Sign[2-x]+Sign[y-1]+1==0, (xA2-9x+20)A2-Sign[l-yA2]+1==0,

(y+Abs[x-4]+Abs[x-5])A2-Sign[(x-4)(21/4-x)]+l==0), {x,-4,5),PlotPoints->1000,PlotDivision->250];

304

Глава 9

В лучшем случае получаем кучу предупреждений и вот что.

Мораль: графики многих неявных функций легко строятся с помощью функции implicitPlot, однако существуют невинно выглядящие мехматовские “приколы”, при построении которых либо теряются дуги, отдельные точки, отрезки, либо же гра­ фики не строятся совсем. Иногда проблем удается избежать, если изменить метод по­ строения графика (от решения уравнения перейти к построению линии уровня или наоборот). Однако это помогает далеко не всегда. Тогда приходится брать мехматов­ ские учебники. Они не покажутся такими недоступными, если вы будете читать их, а система Mathematica будет делать то, что там написано! Очень часто всего лишь не­ скольких подстановок (их может выполнить система Mathematica) достаточно, чтобы перейти к параметрическому заданию графика.

Несколько графиков на одном чертеже — функция GraphicsArray

Как вы уже знаете, функция GraphicsArray позволяет на одном листе (чертеже) нарисовать несколько графиков, расположив их в одну строку или в виде двухмерного массива. Однако если вы все графики вычерчиваете с помощью одной функции, на­ пример ParametricPlot, удобно предварительно установить те значения ее опций, которые совпадают у большинства графиков. Пусть, например, мы хотим установить опции AspectRatio->Automatic и Axes->False. Вот как это делается.

SetOptions[ParametricPlot,AspectRatio->Automatic,Axes->False];

Теперь можем определить нужные нам графики и при необходимости задать зна­ чения тех опций, которые отличаются от установленных ранее. Пусть, например, на первом и третьем графиках вычерчиваются оси координат. Тогда для этих графиков устанавливаем Axes->True.

Block[{$DisplayFunction=Identity}, pl=ParametricPlot[{Cos[t],Sin[t] }, {t, 0,2Pi},Axes->True]; p2=ParametricPlot[{2Cos[t],Sin[t]}, {t, 0,2Pi}]; p3=ParametricPlot[{(2Cos[t]-1)Cos[t], (2Cos[t]-1)Sin[t]},

{t,0,2Pi},Axes->True]; p4=ParametricPlot[{t Cos[t],t Sin[t]},{t,0,12Pi}]; p5=ParametricPlot[{t Cos[t]Sin[t],t Sin[t]Л2},{t,0,8Pi}]; p6=ParametricPlot[{Sin[21]+Sin[5 t],Cos[2 t]+Cos[5 t]},{t,0,2Pi}]; p7=ParametricPlot[{Sin[2t]Sin[5 t],Cos[2 t]Sin[5 t]},{t,0,2Pi}]; p8=ParametricPlot[{Cos[t]+1/2 Cos[7 t]+l/3 Cos[-17 t+Pi/2],

Sin[ t]+1/2 Sin[7 t]+l/3 Sin[-17 t+Pi/2]},{t,0,2Pi}];]

После этого формируем массив графиков и отображаем его.

Show[GraphicsArray [{{pi, р2, рЗ, р4 }, {р5, рб, р7, р8}} ]];

[

i

Мультимедиа: геометрия, графика, кино, звук

305

Функция GraphicsArray может быть полезна при подборе параметров.

Пример 9.18. Подбор параметров с помощью функции GraphicsArray. Предполо­ жим, вам нужно среди двухпараметрического множества кривых (напоминающих цве­ ты) вида (R cos(az), R sin(bz)), где R = sin 5z, выбрать ту, которая ближе всего к ок­ ружности при условии, что параметры а и b принимают целые значения, причем 1<д<9 и \<Ь<6. М о ж н о ,конечно, пересмотреть все 54 кривые по одной. Но если вы не уверены, что среди них есть окружность, лучше расположить все графики на одном чертеже. Однако в отличие от предыдущих примеров, где количество графиков было небольшим, в данном случае формирование массива лучше всего поручить системе Mathematica. Для этого как нельзя лучше приспособлена функция Table. Именно с ее помощью удобнее всего сначала сформировать двухмерный массив шириной 6 и высотой 9 графиков. Затем эти графики лучше всего отобразить на одном чертеже и выбрать (на глаз) те, которые, как вам кажется, наиболее подходят для вашей цели. Отобранные графики затем можно будет рассмотреть в деталях и выбрать наиболее подходящий из них. Вот как это делается в нашем случае.

Block[{k = 5 } ,Block[{a,b,r = S i n [ k * z ] }, Block[{XY={r*Cos[a*z],r*Sin[b*z]}},

Show[GraphicsArray[

Table[Table[ParametricPlot[XY, {z,0,2 Pi}],{b,6}],{a,9}]]]]]]

Когда будете выполнять эту программу, перед вами промелькнет 54 графика, кото­ рые рассмотреть вы, конечно, не успеете. Зато в конце вы увидите следующую кар­ тинку.

306

Гпава 9

Я думаю, вы без труда найдете здесь окружность.

Конечно, в рассмотренном примере нам немного повезло. Ведь параметры были последовательными натуральными числами. Благодаря этому было так легко орга­ низовать перебор их значений с помощью параметра функции Table. Но что делать, если нужно вычертить, скажем, четыре десятка кривых, параметры которых просто заданы таблицей?

Пример 9.19. Циклоиды. Пусть семейство циклоид задается параметрическим урав­

нением r(t) =r{+r2Rt(e) +aRtol(e) , где е — фиксированный единичный вектор, a R* —

поворот вокруг начала координат на угол <р. Пусть параметры г,, г2 и а заданы табли­

цей (всего 40 наборов параметров в таблице).

Мультимедиа: геометрия, графика, кино, звук

307

№ п/п

'i

 

а

1

2

-1

1

2

3

-1

1

3

3

-2

2

4

4

-1

1

...

Как начертить все нужные нам кривые, не задавая в их уравнениях параметры вручную? Для этого придется превратить таблицу в список наборов параметров.

parTable={

-1,

1),

< 2,

3,

-1,

1},

( з ,

3,

-2,

2),

( 4,

4,

-1,

1),

{ 1,

2,

{ 5,

4,

-1,

3),

{ 6,

4,

-2,

1),

( 7,

4,

-2,

3),

( 8,

8,

- з ,

3},

{ 9,

8,

-5,

5),

(Ю,

8,

-7,

7),

(11,

3,

-1,

2),

(12,

3,

-1,

6),

(13,

4,

- з ,

2),

(14,

4,

- з ,

4),

(15,

8,

- з ,

2},

(16,

8,

- з ,

6),

(17,

8,

-5,

6),

(18,

1,

-2,

2),

(19,

1,

- з ,

3),

(20,

1,

-3,

2),

(21,

2,

1,

1),

(22,

3,

1,

1),

(23,

3,

2,

2),

(24,

4,

1,

1),

(25,

4,

3,

3},

(26,

2,

1,

3},

(24,

4,

2,

3),

(28,

8,

3,

9),

(29,

8,

5,

5),

(30,

8,

7,

7),

(31,

3,

1,

2),

(32,

3,

1,

8},

(33,

4,

3,

2),

(34,

4,

3,

6},

(35,

8,

3,

2),

(36,

8,

5,

4),

(37,

8,

5,

6),

(38,

1,

2,

2),

(39,

1,

3,

3),

(40,

3,

4,

5}}

Заметьте, что порядковый номер включен в набор параметров первым элементом. Это значительно облегчает поиск нужного набора параметров в таблице. Теперь мы хотим написать программу, которая печатает на одном чертеже графики с порядковы­ ми номерами в заданном диапазоне, располагая их по т штук в ряду.

Сначала определим вращающийся единичны й вектор.

R p h i[p h i_] : = { C o s [ p h i] , S i n [ p h i ] }

П осле этого мож но дать определение функции PolarXYAB для наших циклоид.

PolarXYAB [ t _ , r l _ , r 2 _ , а _ , omega_J = r l+ r 2 * R p h i[t]+ a * R p h i[o m e g a * t]

Теперь определим функцию , рисующ ую отдельный график.

gg[n_]:=Block[ { p lo t,rl= parT able[ [п]] [ [ 2 ] ] , r2=parTable[ [п]] [ [ 3 ] ] , а = р а гТ а Ы е [ [п] ] [ [4] ] },

p lo t = P a r a m e t r ic P lo t [PolarXYAB [ t , r l , r 2 , a , o m e g a ], { t , 0 , 2 D en o m in ator[om ega] P i } ,

A x e s - > F a ls e ,P lo t L a b e l- > " n = " < > T o S tr in g [n ] ]]

Теперь можем нарисовать, например, первые 15 циклоид, параметры которых со­ ответствуют порядковым номерам с 1 по 15 в наш ей таблице. (О ни все будут круго­ выми циклоидами.) Вот как это делается.

B lo c k [ {n ,m = 5, o m e g a = l/7 },

S h o w [G r a p h ic sA r r a y [

Table[Table[gg[n=(a-l)*m+b], {b,m}] , {a,3}]]]]

П еред вами промелькнут 15 графиков, а в конце вы увидите вот что.

308

Гпава 9

n=l

n=2

n=3

n=4

n=5

n=6

n=7

n=8

n=9

n=10

n=11

n=12

n=13

n=14

n=15

Чтобы начертить графики 16 и 17, в программе изменяется лишь т и начальный порядковый номер.

Block [ {n , m =2, о т ед а = 1 / 7 } ,

Show[GraphicsArray[ Table[Table[gg[n=15+(a-1)*m+b],{b,m}],{a,l}]]]]

В конце вы увидите следующее.

п=16

п=17

Это развернутые циклоиды. Нарисуем, наконец, развернутые циклоиды, которые образуются, когда подвижная окружность содержит внутри себя неподвижную. (Это графики с 18 по 20.)

Block [ {n,m=3, о т ед а = 1 /7 },

Show[GraphicsArray[ Table[Table[gg[n=17+(a-1)*m+b],{b,m}],{a,1}]]]]

В результате вы увидите вот что.

п=18

п=19

п=20

Теперь нарисуем 2 ряда развернутых циклоид. (Это графики с 20 по 30.)

Block[{n,m=5, omega=l/7 }, Show[GraphicsArray[

Table[Table[gg[n=20+(a 1)*m+b]/{brm}]f{a/2}]]]]

Вы увидите следующее.

n=21

n=22

n=23

n=24

n=25

Мультимедиа: геометрия, графика, кино, звук

309

Вспоминаем, наконец, об оставшихся 10 графиках. В программе достаточно изме­ нить лишь начальный порядковый номер.

Block [{n,m=5, omega=l/7}, Show[GraphicsArray[

Table[Table[gg[n=30+(a-1)*m+b],{b,m}],{a,2}]]]]

А вот и сами графики.

n=31

n=32

n=33

n=34

n=35

n=36 n=37 n=38

Аналитическая геометрия в пространстве, или ЗО-графика

Графические примитивы и опции трехмерной графики

Если вместо заголовка Graphics воспользоваться заголовком Graphics3D, то можно получать трехмерные рисунки. При этом примитивы Point, Line, Text и Polygon с учетом третьей координаты переносятся на трехмерный случай.

Рисуем параллелепипед — графический примитив Cuboid

Единственным новым трехмерным примитивом является

Cuboid [ {xmin,

ymin,

zjnin},

{xmax, ymax,

m a x }], с помощью которого рисуется параллелепипед, проти­

воположные вершины

которого имеют координаты (xmin,

ymin, min) и

(xmax,

ymax,

max).

 

 

 

Show [Graphics3D[ {GrayLevel [0.9], Cuboid [{0 ,0,0}, [1ДД}]}, Lighting ->False,Boxed->False]];

Как и в двухмерном случае, рисунок создается с помощью примитивов.

Show[Graphics3D[{GrayLevel[0.9],Cuboid[{0,0,0},{1,1,1}]}],

Graphics3D[{Hue[0],Thickness[0.01],Line[{{-1,0,0},{2,1.1}}]}]/

Graphics3D[{Hue[0.6],PointSize[0.04], Point[{-1.0,0}]}],

Graphics3D[{Hue[0.6]„PointSize[0.04],Point[{2,1,1}]}],

Boxed->False,Lighting ->False];

]

310

Гпава 9 j