Красавин Компютерныы практикум в среде МатЛаб 2015
.pdfчаще всего используется как средство отладки параллельных программ.
Команда 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
