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

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

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

Рис. 6.10. Различные контурные графики

В примере 6.10 рассматриваются различные способы визуализации векторных полей (рис. 6.11, 6.12).

Пример 6.10.

figure

subplot(1,2,1) [x,y,z] = peaks;

[dx,dy] = gradient(z,.5,.5); % вычисление градиента функции z с

шагом 0.5 по оси x и по оси y

contour(x,y,z,10) % контурный график с 10 линиями уровня hold on

quiver(x,y,dx,dy) % нанесение на график стрелок, обозначающих векторное поле, длина и направление стрелок определяются массивами dx и dy; в данном случае – это градиенты функции z

hold off

set(gca, 'LineWidth',1)

set(gca, 'FontName', 'Trebuchet MS') set(gca, 'FontSize', 8)

71

set(gca, 'FontWeight', 'bold') title('Векторное поле на контурном графике')

subplot(1,2,2)

[nx,ny,nz] = surfnorm(x,y,z); % вычисление нормалей к поверхности surf(x,y,z)

hold on

quiver3(x,y,z,nx,ny,nz) % нанесение на поверхность стрелок, обозначающих векторное поле, длина и направление стрелок определяются массивами nx, ny и nz; в данном случае – это нормали к поверхности z

hold off

set(gca, 'LineWidth',1)

set(gca, 'FontName', 'Trebuchet MS') set(gca, 'FontSize', 8)

set(gca, 'FontWeight', 'bold')

title('Нормали к поверхности')

Рис. 6.11. Поле градиентов

72

Рис. 6.12. Отображение нормалей к поверхности

В примере 6.11 рассмотрено отображение матрицы Адамара на сферическую геометрию (рис. 6.13).

Пример 6.11.

k=5;

n = 2^k - 1;

theta = pi*(-n:2:n)/n; задание зенитного угла сферической системы координат

phi = (pi/2)*(-n:2:n)'/n; % задание азимутального угла;

транспонирование вектора phi (') использовано для того, чтобы было возможно матричное умножение для вычисления x,y,z; если не использовать транспонирование, то для вычисления x,y,z нужно использовать поэлементные операции

x = cos(phi)*cos(theta); % вычисление координат сферы y = cos(phi)*sin(theta);

z = sin(phi)*ones(size(theta));

73

colormap ([0 0 0; 1 1 1]) % задание цветовой

палитры

только

из

двух цветов – белого и черного

вычисляет

матрицу

c = hadamard(2^k); % оператор hadamard(n)

Адамара порядка n; матрица Адамара состоит из

чисел 1

и

-1,

при

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

surf(x,y,z,c) % построение сферы единичного радиуса, каждый сегмент которой окрашен в цвет, соответствующий элементу матрицы Адамара

axis square % оси одинаковой длины axis off % не показывать оси

Рис. 6.13. Матрица Адамара на сфере

74

7

Сортировка и поиск

7.1. Базисные состояния и матрицы

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

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

Рассмотрим систему из трех ящиков и двух одинаковых шаров, помещенных в эти ящики. Очевидно, что всего в системе будет шесть возможных состояний (рис. 7.1). Назовем эти состояния

базисом системы.

Рис. 7.1. Базис для системы из трех ящиков и двух шаров

75

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

Рис. 7.2. Различимые (слева) и неразличимые (справа) шары

Пусть теперь есть некоторое устройство , которое работает следующим образом: оно перекладывает один шар из третьего ящика во второй. Посмотрим, как будет выглядеть матрица, отражающая работу этого устройства, в базисе, изображенном на рис. 7.1.

Матрица

будет состоять из матричных элементов

, при

этом индекс столбца соответствует номеру исходного состояния,

а индекс строки – состоянию, которое получится из состояния

после того, как на него подействует .

Например, если взять в

качестве исходного состояния состояние

1 (т.е. индекс

будет

равен 1), в котором оба шара находятся в третьем ящике, то после перекладывания одного из шаров во второй ящик получится состояние, показанное рис. 7.3.

Рис. 7.3. Под действием устройства первое состояние переходит вовторое

Видно, что получилось какое-то другое состояние, отличное от состояния 1. Для того чтобы определить значение индекса , необходимо найти, на каком месте в базисе находится это состояние. В этот момент и возникает проблема поиска полученного состояния в исходном базисе. Посмотрев на рис. 7.1

76

видим, что состояние, которое получилось из состояния 1, – это состояние 2. Значит,

 

 

1,

если

 

2;

так как под воздействием

0,

если

 

2,

 

 

состояние 1 переходит в состояние 2 и

ни в какое другое, и первый столбец матрицы будет таким:

 

0

 

1

 

0

 

0

.

 

0

… … … … …

Столбцы 3, 5 и 6 в

матрице

будут нулевыми, так как в этих

0

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

Аналогично, состояние 2 под действием

 

переходит в состояние 3,

а состояние 4 – в состояние 5,

и окончательный вид матрицы

следующий:

0

0

0

0

0

0

 

 

1

0

0

0

0

0

 

0

1

0

0

0

0

 

0

0

0

0

0

0 .

 

0

0

0

1

0

0

После того как

получена матрица, отражающая действие

0

0

0

0

0

0

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

77

 

0

0

0

0

0

0

 

 

0

0

0

0

0

0

 

 

1

0

0

0

0

0

,

 

0

0

0

0

0

0

 

0

0

0

0

0

0

 

это означает, что

двукратное

действие

0

приводит к переходу

0

0

0

0

0

 

состояния 1 в состояние 3, а все остальные матричные элементы равны нулю, так как только в состоянии 1 имеются два шара в третьем ящике.

Таким образом, введен некоторый оператор в базисе, показанном на рис. 7.1, и построена в этом базисе матрица, соответствующая этому оператору, посредством действия этим оператором на базисные функции.

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

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

78

Рис. 7.4. Соответствие базисных состояний и чисел, упорядоченных по возрастанию

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

7.2. Сортировка вставками

При этом способе сортировки элементы неупорядоченного массива просматриваются по одному, и каждый следующий элемент вставляется в подходящее место среди ранее упорядоченных (рис. 7.5).

Рис. 7.5. Сортировка вставками. Серым фоном показаны упорядоченные элементы

79

Временные затраты при сортировке вставками составляют порядка операций, где – число элементов в неупорядоченном массиве. Этот способ сортировки является неэкономным. В примере 7.1 приведен код на языке MatLab, осуществляющий сортировку массива случайных чисел методом вставки.

Пример 7.1.

function [key, t] = vstavka(i)

% i – число сортируемых элементов

key = rand(i,1); % создание вектора, содержащего i случайных чисел tic % запуск счетчика времени

N = length(key); % определение длины вектора key for k = 2 : N % цикл по всем элементам массива

for l = 1 : k-1 % на каждом шаге цикла k текущий элемент key(k) сравнивается с уже упорядоченными

if key(l) > key(k)

a = key(k); % вспомогательная переменная for m = k : -1 : l+1

key(m) = key(m-1); % все ранее упорядоченные элементы, которые больше чем key(k), сдвигаются на одну позицию вправо

end

key(l) = a; % текущий элемент key(k) вставляется на место с номером l

end end

end

t = toc; % остановка счетчика времени и запись времени работы программы в переменную t

7.3. Сортировка выбором

При этом способе сортировки сначала из неупорядоченного массива выбирается наименьший (или наибольший) элемент и каким-либо образом отделяется от остальных, затем выбирается наименьший (наибольший) элемент из оставшихся и т.д. (рис. 7.6). Этот способ сортировки, как и метод вставок, требует порядка операций.

80

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