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

Красавин Компютерныы практикум в среде МатЛаб 2015

.pdf
Скачиваний:
218
Добавлен:
12.11.2022
Размер:
9.22 Mб
Скачать

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

Команда pmode позволяет интерактивно делать параллельное задание, выполняемое одновременно на нескольких workers. Команды, набираемые в Parallel Command Window, выполняются всеми workers. Каждый worker выполняет команды в собственном рабочем пространстве и с собственными переменными.

Синхронизация workers заключается в том, что каждый worker после завершения команды простаивает, ожидая, пока все workers, работающие над этим заданием, не завершат ту же команду. Только после того, как все workers завершат выполнение одной команды, они все вместе переходят к следующей pmode команде.

Команда pmode предоставляет дисплей для каждого worker, выполняющего задание, где можно вводить команды, смотреть результаты, обращаться к рабочему пространству каждого wirker лаборатории и т.д. Что pmode не позволяет делать, так это свободно чередовать последовательную и параллельную работу. После выхода из сеанса pmode вся информация и данные на workers стираются. Старт следующего сеанса pmode всегда начинается с пустого состояния. Следующий пример иллюстрирует работу в режиме pmode.

Пример 23.2. Запустим pmode с помощью команды pmode:

pmode start local 2

Эта команда запустит два локальных worker, создаст параллельное задание для работы с ними и откроет Parallel Command Window (рис. 23.2).

Для иллюстрации того, что команды в pmode выполняются всеми workers, в командном окне наберем следующее:

P>> help magic

Введем переменную в pmode (рис. 23.3):

P>> x = pi

261

Рис. 23.2. Запуск Parallel Command Window

Рис. 23.3. Ввод переменной в pmode

262

Переменная необязательно имеет одно и то же значение для каждого worker. Функция labindex возвращает ID каждого worker, работающего над параллельным заданием. Например, переменная x имеет различные значения в рабочем пространстве каждого worker:

x = labindex

Функция numlabs возвращает число workers, работающих над задачей:

all = numlabs

Создадим массивы (рис. 23.4):

segment = [1 2; 3 4; 5 6] segment = segment + 10*labindex

Для завершения работы сpmode воспользуемся командой pmode exit.

Рис. 23.4. Массивы в pmode

В примере 23.3 рассматривается построение множества Мандельброта при помощи параллельного цикла parfor.

263

Пример 23.3. Множество Мандельброта

(рис. 23.5) для полинома

определяется как множество всех

, для которых орбита точки 0

ограничена, т.е.

 

0ограничена .

Равносильное определение можно записать следующим образом:

Функция

здесь задана на

комплексной плоскости . MatLab полностью

0

∞при

∞ .

поддерживает комплексные числа. Мнимая единица задается с использованием букв i или j, в общем виде комплексное число задается командой

z = a + bi

или

z = a + bj

Для построения множества Мандельброта нужно выбрать окно на комплексной плоскости, и для каждой точки внутри этого окна выяснить, расходится ли

последовательность

 

или

нет.

Число

итераций

нужно

брать не

слишком

маленькое; в

зависимости

от

того,

на

какое расстояние

от начала

0

 

 

 

 

 

 

 

координат

уходит точка

 

после

итераций,

ей присваивается определенный

цвет:

 

 

 

 

 

 

 

 

 

function par_mandel(N,max_iter, epsilon)

% N – число точек на комплексной плоскости по каждому из направлений

W = zeros(N,N); % создаем матрицу изображения

tic; % начало отсчета времени

parfor i=1:N % параллельный цикл расчета матрицы изображения по столбцам

Z=zeros(1,N); % создаем вектор-столбец значений итерационого цикла

W_local=zeros(1,N); % создаем вектор-столбец матрицы изображения

C=(2*(1:N)/(N/2)-2.5)+1.5i*(i./(N/2)-1); % задаем окно на комплексной плоскости; обратите внимание, что не происходит конфликта между переменной i, обозначающей номер итерации, и буквой i, обозначающей мнимую часть комплексного числа

for j=1:max_iter % итерационный цикл

Z=Z.*Z+C % итерационное соотношение

264

W_local=W_local+(abs(Z)>epsilon); % если на текущей итерации точка выходит за пределы радиуса, определяемого epsilon, в массив W_local, определяющий

цвет точки на графике,

добавляется

единица; чем

раньше

точки

выйдет за

пределы

круга

радиусом

epsilon,

тем

больше будет

значение

для

нее в

массиве

W_local

 

 

 

 

 

 

end

W(i,:)=W_local;

end

toc; % конец отсчета времени

% настройка построения изображения

imagesc(W); % функция imagesc нормирует значения W для построения изображения и выводит изображение на экран

colormap(jet); % colormap – одна из встроенных палитр MatLab

axis equal axis off

end

Рис. 23.5. Множество Мандельброта

265

Задания

23.1. Реализовать алгоритм построения множества Мандельброта без параллельного цикла. Построить множество Мандельброта, использовав параметры 1000; max_ 23; 10. Сравнить время расчета с временем аналогичного

расчета, использующего параллельный цикл.

23.2. Рассмотреть различные участки комплексной плоскости и построить для них изображения с использованием функции par_mandel.

23.3.Написать параллельный код, реализующий расчет числа π методом Монте-Карло.

23.4.Написать код «Конь Эйлера», основанный на стохастическом методе с применением параллельного цикла parfor для решения задачи о ходе «коня». Задача о ходе «коня» состоит в нахождении маршрута для шахматного коня, проходящего через все поля доски заданного размера по одному разу.

Одним из примеров реализации данного алгоритма может являться алгоритм, состоящий из следующих частей:

1)составление карты ходов «коня» – пронумеровать клетки доски, и для каждой клетки найти соседей, на которые может перескочить «конь»;

2)реализация цикла прохождения конем поля – «конь» проходит поле на основе стохастического метода при помощи карты ходов; при ходе «коня» в определенную клетку эта клетка вычеркивается из карты ходов;

3)реализация случайного перебора способов прохождения

доски.

266

24

Решетки

Численное решение задач физики конденсированного состояния часто основано на использовании решеточных моделей. Такие модели либо формулируются естественным образом, когда узлы решетки определяются кристаллической структурой исследуемого вещества, либо являются дискретной аппроксимацией фазового пространства задачи. Первоочередная задача в этом случае, как правило, – определение геометрии решетки, т.е. вычисление координат узлов, определение координационных сфер и числа узлов, которые они содержат, определение уникальных расстояний между узлами на решетке и т.д. (рис. 24.1).

Рис. 24.1. Квадратная решетка. Показаны первые семь координационных сфер и число узлов, входящих в них

267

При исследовании задач на плокости для моделирования континуума часто вводят периодические граничные условия по обоим направлениям, и система превращается в тор (рис. 24.2).

Рис. 24.2. Квадратная решетка с периодическими граничными условиями по обоим направлениям

Рассмотрим код, решающий указанные задачи для простой квадратной решетки (пример 24.1) и для решетки графена

(пример 24.2).

Пример 24.1.

function [lattice]=SquareLattice(Lx,Ly)

% Lx - количество атомов по оси X, Ly - количество атомов по оси Y

eX = 1;

eY = 1; % eY и eX - базисные векторы решетки

N = Lx*Ly; % N - общее количество атомов

coord = zeros(3,N); % создание матрицы coord для описания структуры решетки

coord(3,:) = (1:1:N); % третья строка матрицы coord отвечает за нумерацию атомов в решетке

coord(1,:) = mod(coord(3,:)-1,Lx)*eX; % Х-координаты атомов coord(2,:) = floor((coord(3,:)-1)/Lx)*eY; % Y-координаты атомов lattice.structure = coord; % создание структуры lattice для полного описания решетки, в поле structure заносится матрица coord

268

xMax = max(coord(1,:))+eX; % xMax - максимальное значение координаты X, yMax - максимальное значение координаты Y

yMax = max(coord(2,:))+eY; % значения макисмальных координат вводятся для учета краевых условий Борна-Кармана

% реализация алгоритма перебора всех уникальных межатомных расстояний

coord(1,:) = coord(1,:)+xMax/2; % "прокручиваем" атомную решетку как "полотно"

coord(2,:) = coord(2,:)+yMax/2; % в центр "полотна" ставится первый атом решетки

coord(1,coord(1,:)>=xMax) = coord(1,coord(1,:)>=xMax)-xMax; % "прокрутка" учитывает краевые условия Борна-Кармана coord(2,coord(2,:)>=yMax) = coord(2,coord(2,:)>=yMax)-yMax;

%создаем поле radiuses у структуры lattice,

%которое представляет собой матрицу N x N

%для записи межатомных расстояний от атома i до атома j в виде lattice.radiuses(i,j) или lattice.radiuses(j,i)

lattice.radiuses=zeros(N,N);

for i=1:1:N % цикл перебора атомов

for j=1:1:N % второй цикл перебора атомов lattice.radiuses(i,j)=round(10^8*sqrt((coord(1,i)- coord(1,j))^2+(coord(2,i)-coord(2,j))^2))/(10^8); % округление до восьми знаком после запятой

end

coord(1,:)=coord(1,:)-eX; % сдвиг «полотна» coord(2,:)=coord(2,:)-eY*(mod(i,Lx)==0); % в центр «полотна»

ставится следующий по нумерации атом coord(1,(coord(1,:)<0))=coord(1,(coord(1,:)<0))+xMax; %

учет краевых условий Борна-Кармана coord(2,(coord(2,:)<0))=coord(2,(coord(2,:)<0))+yMax;

end

uniqueRadiuses=unique(lattice.radiuses); % определение уникальных межатомных расстояний из матрицы radiuses и их запись в вектор uniqueRadiuses

numberOfUniqueRadiuses=size(uniqueRadiuses,1);

%numberOfUniqueRadiuses - число уникальных межатомных расстояний (учитывается 0)

%создание поля neighbors у структуры lattice в виде массива ячеек

%N x numberOfUniqueRadiuses-1

%для описания соседей каждого атома в решетке lattice.neighbors=cell(N,numberOfUniqueRadiuses-1); for i=1:1:N % цикл перебора атомов решетки

269

for j=1:1:N % цикл перебора атомов решетки

for k=2:1:numberOfUniqueRadiuses % перебор по уникальным межатомным расстояниям

if uniqueRadiuses(k)==lattice.radiuses(i,j) % условие поиска соседей k-го порядка lattice.neighbors{i,k-1}=[lattice.neighbors{i,k-

1} j];

% запись соседа

end

 

end

 

end

 

end end

function SquareLatticePlot(lattice) % визуализация квадратной решетки

xMax=max(lattice.structure(1,:)); %xMax и yMax - максимальные значения координат х и у, соответственно yMax=max(lattice.structure(2,:));

figure

plot(lattice.structure(1,:),lattice.structure(2,:),'b.', 'MarkerSize',20) % построение решетки

hold on

for i=1:1:size(lattice.structure,2) % нумерация атомов на рисунке text(lattice.structure(1,i)+0.15,lattice.structure(2,i), num2str(lattice.structure(3,i)))

end

axis([-1 (xMax+1) -1 (yMax+1)]); end

Квадратная решетка 8 8 показана на рис. 24.3.

270

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]