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

ЛП_КомпГеом_1

.pdf
Скачиваний:
42
Добавлен:
01.04.2015
Размер:
1.51 Mб
Скачать

cleardevice; mand(0,0,640,480,-1.05,-1,-0.35,-0.3); readkey;

closegraph;

end.

(2)Программа для построения фрактала Джулиа

Program fr_Julia; uses crt,graph; const mi=511; var gd,gm:integer;

function c(index:integer):integer; {** определение цвета точки **} begin

c:=7*(mi-index) end;

{** функция подсчета количества итераций **} function iteration(x,y:double):integer;

const cx=0.36;cy=0.36;

var i:integer; xx,yy,xk,yk:double; begin

xx:=x; yy:=y; i:=0;

while (sqr(xx)+sqr(yy)<=4) do begin

xk:=sqr(xx)-sqr(yy)+cx; yk:=2*xx*yy+cy; xx:=xk; yy:=yk; i:=i+1; if i>=mi then break

end;

iteration:=i;

end;

{** процедура формирования фрактала **}

procedure julia(xx,yy,cx,cy:integer; minx,maxx,miny,maxy:double); var stepx, stepy,x,y:double; i,j,iter:integer;

begin stepx:=(maxx-minx)/cx; stepy:=(maxy-miny)/cy; y:=miny;

for j:=0 to cy do begin

61

x:=minx;

for i:=0 to cx do begin

iter:=iteration(x,y);

putpixel(xx+i,yy+j,c(iter));

x:=x+stepx;

end;

y:=y+stepy

end;

end; begin

gd:=Detect;

initgraph(gd,gm,'C:\BP\BGI');

setBkcolor(1);

{** формирование фрактала с разной степенью детализации **} julia(0,0,640,480,-1,1,-1.2,1.2); {** весь фрактал **} readkey;

cleardevice;

{** увеличенные фрагменты фрактала **} julia(0,0,640,480,-0.1,0.1,-0.1,0.1); readkey;

cleardevice; julia(0,0,640,480,-1,0,-1.2,0); readkey;

cleardevice; julia(0,0,640,480,-1,-0.5,-0.5,0); readkey;

cleardevice; julia(0,0,640,480,-0.75,-0.06,-0.5,-0.35); readkey;

cleardevice; julia(0,0,640,480,-0.68,-0.65,-0.37,-0.36); readkey;

closegraph;

end.

(3)Программа для построения фрактала Коха

Program fr_kox; uses graph,crt;

62

var x0,y0,x,y,gd,gm:integer;x1,y1:real;

{*** рекурсивная процедура построения линии Коха ***}

procedure kox(xn,yn,xk,yk:real); var x2,y2,x3,y3,x4,y4:real; c:char; begin

if abs(xn-xk)<2 then exit; x2:=xn+(xk-xn)/3; y2:=yn+(yk-yn)/3; x3:=xn+(xk-xn)*2/3; y3:=yn+(yk-yn)*2/3;

x4:=x2+(x3-x2)*cos(pi/3)+(y3-y2)*sin(pi/3); y4:=y2-(x3-x2)*sin(pi/3)+(y3-y2)*cos(pi/3); line(round(x2),round(y2),round(x4),round(y4)); line(round(x3),round(y3),round(x4),round(y4)); if keypressed then halt;

kox(xn,yn,x2,y2); {** рекурсивные вызовы **} kox(x2,y2,x4,y4);

kox(x4,y4,x3,y3);

kox(x3,y3,xk,yk);

end; begin

x0:=50; y0:=250; x:=590; y:=250; gd:=Detect;

initgraph(gd,gm,'C:\BP\BGI');

setcolor(10);

line(x0,y0,x,y);

kox(x0,y0,x,y); {** Рисование фрактала: линия Коха **} readkey;

cleardevice;

{** Рисование фрактального треугольника с использованием **} {** процедуры для построения линии Коха **}

x0:=150; y0:=320; x:=490; y:=320;

x1:=x0+(x-x0)*cos(pi/3)+(y-y0)*sin(pi/3); y1:=y0-(x-x0)*sin(pi/3)+(y-y0)*cos(pi/3); kox(x0,y0,x1,y1);

kox(x1,y1,x,y);

kox(x,y,x0,y0);

readkey; closegraph

63

end.

(4)Программа для построения ветки папоротника

Program fr_paporotnik; uses crt, graph;

const alfa=80;beta=2.1; k=0.3; k1=0.5; lmin=1; var a,b,c,d,e,f,g,h:real; gd,gm:integer;

{*** рекурсивная процедура на основе метода IFS ***}

procedure step(x1,y1,x2,y2:real; nom:integer); var x3,y3,x4,y4,x5,y5,x6,y6,x7,y7:real;

begin

if sqr(x1-x2)+sqr(y1-y2)>lmin then begin

{** координаты точек вычисляются по формулам **} x3:=(x2-x1)*a-(y2-y1)*b+x1; y3:=(x2-x1)*b+(y2-y1)*a+y1; x4:=x1*c+x3*d; y4:=y1*c+y3*d;

x5:=x4*e+x3*f; y5:=y4*e+y3*f; x6:=(x5-x4)*g-(y5-y4)*h+x4; y6:=(x5-x4)*h+(y5-y4)*g+y4; x7:=(x5-x4)*g+(y5-y4)*h+x4; y7:=(x5-x4)*(-h)+(y5-y4)*g+y4;

line(round(x1),round(y1),round(x4),round(y4));

{** рекурсивные вызовы для рисования фрагментов фрактала **} step(x4,y4,x3,y3,nom);

step(x4,y4,x6,y6,nom+1);

step(x4,y4,x7,y7,nom+1);

end;

end; begin

gd:=Detect;

initgraph(gd,gm,'C:\BP\BGI');

setBkcolor(1);

{** вычисление коэффициентов **} a:=cos(pi/alfa); b:=sin(pi/alfa); c:=1-k; d:=k;

e:=1-k1; f:=k1; g:=cos(pi/beta); h:=sin(pi/beta);

step(200,350,225,70,0); {** рисование ветки папоротника **} readkey;

closegraph end.

64

(5)Программа построения треугольника Серпинского program fr_treug_serpinsky;

uses graph,crt;

 

const m=2500;

{** количество точек фрактала **}

type koord=array[1..3] of integer;

var gd,gm: integer;

 

x,y: koord;

{** массивы координат **}

{**** Процедура заполнения заданного треугольника точками ****}

procedure serpinsky(xs,ys:koord); var x0,y0,xk,yk: real; n,k: integer; begin

randomize;

x0:=(xs[1]+xs[2]+xs[3])/3; {** координаты начальной точки **} y0:=(ys[1]+ys[2]+ys[3])/3;

for k:=1 to m do

 

begin

 

 

n:=random(3)+1;

{** случайная вершина **}

xk:=(x0+xs[n])/2;

{** середина отрезка, соединяющего **}

yk:=(y0+ys[n])/2;

{** начальную точку с вершиной **}

putpixel(round(xk), round(yk), 12); {** вывод точки **}

x0:=xk;

{** новые координаты для начальной точки **}

y0:=yk

 

 

end;

end; begin

gd:=Detect;

initgraph(gd,gm,'C:\BP\BGI');

setcolor(10); setviewport(20,20,500,250, true);

x[1]:=320; y[1]:=50;

{** координаты вершин треугольника **}

x[2]:=150; y[2]:=200;

 

x[3]:=450; y[3]:=200;

serpinsky(x,y); {** процедура вывода треугольника Серпинского **} readkey;

closegraph end.

65

Специальные приложения

Приложение A.

Списки

Key words: List, Length, Lists as Sets, Union, Intersection, Complement, Table, Range, TableForm, Flatten.

Возможные пути к ресурсам из окна Documentation Center:

1)Core Language Lists;

2)Data Manipulation Arrays.

Справка. Списки являются центральными конструкциями системы Mathematica, используются для представления коллекций, массивов, множеств и последовательностей всех видов. Более тысячи встроенных функций всей системы Mathematica работают непосредственно на списки, что делает списки мощным средством для взаимодействия.

Всякий список (List) рассматривается как упорядоченный перечень элементов. Список может иметь свое имя2. Один из способов задания списка (с присвоением имени):

= 1, 2, … ,

Здесь число определяет длину списка. Чтобы извлечь элемент , занимающий -ую позицию в данном списке, можно написать:

Длина списка может быть получена с использованием формулировки:

Length[ ]

Система Mathematica позволяет работать со списками как с множествами (Lists as Sets). В этом контексте всякое конечное множество (Set) вводится как неупорядоченный перечень своих элементов. (По умолчанию перечень не содержит совпадающих элементов.) Чтобы преобразовать данный список в множество (с присвоением нового имени), можно использовать формулировку:

= Union[ ]

Длина списка совпадает с мощностью (числом элементов) его множества.

Система Mathematica позволяет выполнять теоретико-множественные операции над списками: объединение, пересечение, взятие разности.

2 В некоторых случаях используют списки без имени.

66

Результат каждой из этих операций над списками совпадает с результатом над их множествами.

Математическая операция

Функциональная форма

Операционная форма

Объединение:

Union[ , ]

 

Пересечение:

Intersection[ , ]

Взятие разности: \

Complement[ , ]

-

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

= Table[ , { , , , }]

Объект { , , , }, так называемый итератор, определяет перебор индекса в указанных пределах с шагом . Если итератор имеет неполную запись { , , }, то по умолчанию принимается шаг = 1. Итератор вида { , } по умолчанию делает перебор индекса от = 1 с шагом

= 1.

В качестве примера определим прямое произведение3 множеств и , как множество всех упорядоченных пар { , }, где и . Для решения этой задачи можно написать:

= Table[ , [ ] , ,Length[ ] , { ,Length[ ]}]= Flatten[ , 1]

Вторая формулировка удаляет заголовки списков на уровне 1.

3 В математической литературе прямое произведение множеств и обозначается через × .

67

Приложение B.

Функции

Key words: Set (=), SetDelyed (:=), Tag SetDelyed (/: :=), Piecewise, Condition, Module, Logical Operators (And, Or, ...), Boole.

Возможные пути к ресурсам из окна Documentation Center:

1)Core Language Defining Variables and Functions;

2)Core Language Procedural Programming Conditionals;

3)Mathematics and Algorithms Mathematical Functions;

4)Mathematics and Algorithms Calculus;

5)Mathematics and Algorithms Logic & Boolean Algebra.

Справка. В математической теории широко известны слова «соответствие», «отображение», «преобразование», «функция», используемые для обозначения базовых понятий. Функция, как и отображение, осуществляет однозначное соответствие , т. е. по некому правилу преобразует один объект в другой объект (однозначно определяемый). Термин «функция» употребляют обычно в тех случаях, когда пробный объект для замещения переменной имеет числовую основу, т. е. представляет собой число или числовой множественный объект определенной категории (арифметический вектор, числовая матрица, тензор, и т. п.).

В системе Mathematica термин «функция» обретает более конкретное толкование, связанное с описанием правил преобразований на языке программирования. Преобразования рассматриваются как вычисления. Всякая функция действует как модуль, преобразующий входные данные в выходные данные. Функция может иметь собственное имя. Различают встроенные функции и пользовательские функции. Каждая встроенная функция имеет свое уникальное имя. Чтобы получить полный перечень имен всех встроенных функций, следует воспользоваться навигатором функций (Function Navigator). Навигатор открывается кнопкой F[...] в окне Documentation Center. По гипер-ссылке на имени выбранной функции можно перейти на страницу этой функции, чтобы узнать выполняемые действия, правила оформления, примеры применения, и прочие подробности. Если имя встроенной функции известно, то для перехода на ее страницу можно воспользоваться строкой поиски SEARCH.

Cистема Mathematica предоставляет широкий выбор возможностей и средств для создания пользовательских функций. Ниже рассматривается только небольшая часть из них. Функция пользователя может иметь свое имя. Кроме того, функция пользователя может оперировать с именами введенных переменных. Переменная с именем остается вакантной (или свободной), пока не состоится замещение этой переменной каким-либо значением (числовым или символьным выражением).

68

Выражения как функции по умолчанию. Всякое выражение (с именем или без имени) может рассматриваться пользователем как функция от тех или иных вакантных переменных.

Целые именованные функции. Нередко возникает необходимость описать входное устройство той или иной пользовательской функции с именем. С этой целью используют паттерны. (Pattern - это шаблон, схема, образец.) Фактически паттерны позволяют выделить независимые переменные определяемой функции. Пусть функция вводится единым выражением. Примеры задания функции данным способом:

1 − 12 − = 2

3[ , ] 3

4 −, = 4

Примеры обращения к функции:

1[ ]4[ , ]

Кусочные именованные функции. Сборка пользовательской функции может быть выполнена по кускам с использованием нескольких различных выражений. При этом имеется разбиение области определения функции на непересекающиеся компоненты. Для каждой из этих компонент функция определяется отдельным выражением. Например, пусть требуется ввести функцию:

 

sin ,

≤ 0,

=

2, 0 < ≤ 1,

 

exp − ,

> 1.

Один из многих способов задания таких функций связан с конструкцией на основе Piecewise. Комбинируя с предыдущими примерами, можно в итоге написать:

Piecewise[{ sin , ≤ 0 , 2, 0 < ≤ 1 , exp − , > 1 }]

Процедуры как функции. Во многих случаях вычисления значений функции реализуются в виде алгоритма (т. е. телом функции служит некий алгоритм). В таких случаях целесообразно использовать конструкцию на основе Module. Например, пусть требуется ввести сложную функцию вида( ( )), где = ( ) - это неявная функция, определяемая как наибольшее решение уравнения , = 0. С этой целью можно предложить вариант программного модуля:

Module[ = , ,

= Solve , == 0, ; = Max /. ; [ ]]

69

Приложение C.

Уравнения и системы уравнений

Key words: Equal (==), Solve, Resolve, LinearSolve.

Возможные пути к ресурсам из окна Documentation Center:

1)Mathematics and Algorithms Equation Solving.

2)) Mathematics and Algorithms Matrices and Linear Algebra Linear Systems.

Пусть имеется выражение , содержащее незамещенную переменную . Запись вида = , где - известное значение, называют уравнением, причемстановится неизвестной переменной. Значение называют частным решением уравнения, если при замещении = выполняется равенство= . Общее решение - это множество всех частных решений.

Если же имеется некий список выражений { 1, 2, … , }, содержащих незамещенные переменные из списка { 1, 2, … , }, то возникает система уравнений как запись вида

1 = 1,

= ,

где - известные значения, а - неизвестные переменные. Список значений { 1, 2, … , } называют частным решением системы уравнений, если при одновременном замещении всех переменных ( = ) выполняются все равенства = . Общее решение - это множество всех частных решений.

Если есть отдельное уравнение или система уравнений, то возникает задача о нахождении общего решения. В системе Mathematica имеются т. н. решатели, предназначенные для поиска общих решений уравнений и систем уравнений. Во многих случаях4 применяют решатель Solve. Чтобы решить уравнение и систему уравнений ( = ), можно написать:

Solve[ == , ]

Solve[ 1 == 1, … , 1 == , { 1, … , }]

Всякая запись вида == распознается программой WM7 как предикат (неопределенное логическое выражение) и, тем самым, может иметь имя.

= == ;

1 = 1 == 1; … ; = == ;

то обращения к решателям могут быть представлены следующим образом:

Solve[ , ]

Solve[ 1, … , , { 1, … , }]

4 Когда выражения уравнений алгебраические и/или трансцендентные.

70