Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
25 Мая 2020, 02:23:04
Начало Помощь Поиск Войти Регистрация
Новости: Книгу С.Доронина "Квантовая магия" читать здесь
Материалы старого сайта "Физика Магии" доступны для просмотра здесь
О замеченных глюках просьба писать на почту quantmag@mail.ru

+  Квантовый Портал
|-+  Тематические разделы
| |-+  Физика (Модератор: valeriy)
| | |-+  Численный анализ многокубитных систем
0 Пользователей и 1 Гость смотрят эту тему. « предыдущая тема следующая тема »
Страниц: [1] 2 3 ... 15  Все Печать
Автор Тема: Численный анализ многокубитных систем  (Прочитано 311456 раз)
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« : 24 Марта 2007, 22:45:23 »

Есть такая мысль – попытаться разработать удобную для пользователя программу для численного анализа многокубитных систем. У меня много материала и самих кодов (на С), которые можно взять за основу, но этого недостаточно. Здесь речь идет о том, чтобы все это грамотно скомпоновать и оформить в виде программы под Windows, с понятным интерфейсом, чтобы ей мог пользоваться любой человек, даже далекий от квантовой физики.

Основное предназначение программы и главная мотивация при ее создании – предоставить удобный инструмент для анализа квантовой запутанности в многокубитной системе.

Чем она может быть интересна, скажем так, для нефизиков? Прежде всего, речь идет о нелокальных квантовых корреляциях в многоуровневой системе, и программа может быть полезна для тех, кто интересуется тонким миром и хочет понять, как он влияет на мир плотный. Например, астрологи, пользуясь программой, смогут анализировать многоуровневые квантовые корреляции и влияние, напр. деканов или планетных сфер на плотный мир. Смотреть, как взаимосвязаны все эти «тонкие истечения» звезд и планет в составе единой многоуровневой иерархической системы. Кто интересуется тонкой структурой нашего тела, смогут анализировать его эфирную, астральную, ментальную и др. составляющие, опять в их взаимосвязи и взаимном влиянии, как друг на друга, так и на плотное физическое тело. Все это можно рассматривать в динамике, например, в терминах работы наших чакр, или это может быть модель эволюции Универсума, как замкнутой системы, с учетом динамики тонких уровней реальности.
В принципе, ее можно было бы использовать практически в любых задачах, где предполагается учитывать роль и влияние квантовых уровней, в той же квантовой психологии, например :).

На персональном компьютере сейчас относительно спокойно можно проанализировать 8-кубитную систему, больше уже сложно. Но это и так физическое тело (или плотный мир) плюс семь тонких уровней квантового ореола (семь его слоев). Возможные аналоги – семь тонких Космических Сфер, Семь Управителей (семь Ангелов Творения) со всем их «воинством» на нижних уровнях; семь тонких тел человека (семь чакр) и т.д.
Во многих случаях будет достаточно меньшего числа кубитов, например, для анализа гексаграмм, или рун достаточно трехкубитной системы. Для анализа «загробного мира», как я уже писал в теме http://quantmag.ppole.ru/index.php?option=com_smf&Itemid=34&topic=16.0  достаточно пяти кубитов.

Замах, наверное, слишком сильный :), но задача вполне выполнима (теоретически :)). Естественно, один я ее не осилю. В общем, если удастся собрать команду энтузиастов, можно попробовать. Основное требование к тому, кто пожелает присоединиться – знание языка С, хотя бы на начальном уровне.

Записан
ksv
Новичок
*
Сообщений: 42


Просмотр профиля
« Ответ #1 : 25 Марта 2007, 17:00:01 »

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

Мне например затруднительно разобраться в математическом формализме квантовой физики по существующим учебникам по квантовой механике. Эти учебники слишком привязаны к частным вопросам физики, а также зачастую оперируют математическими понятиями, выходящими за рамки стандартной программы математической подготовки технического вуза. Учебника описывающего предмет в терминах систем (без "жесткой" привязки к частным вопросам физики) я пока не нашел.

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

Поэтому для начала расскажите поподробнее, что у Вас уже есть. А также в общих чертах обрисуйте логику работы программы: что подается на вход, по каким алгоритмам данные преобразуются, что получаем на выходе. И как все это в идеале на Ваш взгляд должно выглядеть.
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #2 : 25 Марта 2007, 23:44:52 »

Расскажу более подробно.

Задача состоит в решении уравнения Лиувилля – фон Неймана для матрицы плотности ρ (ħ=1):

idρ/dt = [H, ρ],       (1)

где [H, ρ] = Hρ – ρH коммутатор, а гамильтониан H зависит от конкретной задачи. Он отвечает за взаимодействия в системе. У меня есть коды для построения некоторых гамильтонианов, которые используются чаще всего.

Решение (1) имеет вид:

ρ(t) = e–iHtρ(0) eiHt,     (2)

где ρ(0) – начальное условие, т.е. это исходная матрица плотности, которая задается в зависимости от решаемой задачи.

Первая сложность в том, что в показателе экспоненты стоит матрица H, т.е. мы имеем матричные экспоненты. Расправляются с ними следующим образом. Поскольку матрица гамильтониана H обычно является симметричной и вещественной, она может быть диагонализована ортогональным преобразованием U (UUТ, здесь Е – единичная матрица). В результате решение (2) можно записать в виде:

ρ(t) = Ue–iΛtUТρ(0)UeiΛtUТ,     (3)

где

Λ = UТHU

диагональное представление гамильтониана. Или, попросту, Λ – это полный набор собственных значений матрицы H, а U – матрица, составленная из собственных векторов.

Таким образом, на первом этапе алгоритм решения задачи сводится к следующим операциям.

  • В виде действительной симметричной матрицы 2N*2N, задаем исходный гамильтониан системы, состоящей из N кубитов. В программе будет предусмотрен выбор некоторого стандартного гамильтониана из имеющегося набора, с объяснением для каких задач используется тот или иной гамильтониан. Либо пользователь может сам построить гамильтониан согласно общим указаниям.
  • Диагонализуем матрицу гамильтониана H, в результате получаем матрицу собственных векторов U и вектор собственных значений Λ.
  • Вычисляем произведения матриц S=Ue–iΛtUТ и S+=UeiΛtUТ в виде S=Sre–iSim, S+=Sre+iSim, где Sre= Ucos(Λt)UТ и Sim= Usin(Λt)UТ.
  • Вычисляем матрицу плотности ρ(t). Согласно формуле (3), умножаем матрицу S на начальную матрицу плотности ρ(0), затем полученную матрицу умножаем на S+.

Пункты 1–2 выполняются однократно, вычисления по пунктам 3–4 проводятся в цикле по времени t. Для хороших графиков нужно где-то 300 шагов по времени. Поскольку диагонализация выполняется лишь однократно и по числу операций сопоставима с умножением матриц, основные затраты вычислительного времени приходятся на п. 3 и 4.

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

Но это лишь первый этап. На втором, имея полную матрицу плотности для всей системы, на каждом шаге по времени вычисляются уже сами меры квантовой запутанности между различными подсистемами на всех уровнях. Т.е., например, для многокубитной системы ABCDE… считаются квантовые корреляции А-В, А-ВС, A-BCD, A-BCDE, и т.д. Все это будут различные слои квантового ореола, все более тонкие и удаленные от A (в данном случае). Но это не все, а только влияние квантовых уровней на «плотное тело» (один кубит), помимо этого будут вычисляться корреляции более сложного типа, например AB-CDE, (аналог – взаимосвязь эфирного и астрального планов) и т.д. Т.е. будет полный анализ квантовых корреляций и взаимосвязей всех тонких уровней между собой.

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

Могу только сказать, что там ничего сложного, в плане программирования намного легче первого этапа. Как обычно, нужно от матрицы, полученной на первом этапе, брать частичные (редуцированные) матрицы плотности, как это делается, я писал, например, в статье http://quantmagic.narod.ru/volumes/VOL112004/abs1123.html

И на основе этих редуцированных матриц уже вычисляются сами меры квантовой запутанности.

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


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

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

Наверное, можно придумать еще много чего интересного, но основное я предложил.

Записан
ksv
Новичок
*
Сообщений: 42


Просмотр профиля
« Ответ #3 : 26 Марта 2007, 18:29:23 »

Теперь в общих чертах теоретическая основа понятна. Скажите, а подход к моделированию многокубитных квантовых систем на основе дифференциального уравнения Луивилля - это наиболее общий подход из существующих? Сомнение здесь вот какого плана. Если мы моделируем эволюцию замкнутой системы в целом, то мы не должны в явном виде задавать зависимость переменных от времени, т.к. для системы в целом времени нет. Время должно возникать в результате такого моделирования. А в уравнении Луивилля зависимость от времени задана в явном виде. Поэтому вопрос: на Ваш взгляд это не сужает область применения модели? Не являются ли другие методы более перспективными? Например, в книге Х.Гулд, Я.Тобочник "Компьютерное моделирование в физике" (в 2 частях) квантовые системы анализируются с помощью метода случайных блужданий и вариационного метода Монте-Карло для квантовомеханических систем.

Теперь что касается непосредственно предложенной модели. Вы говорите, что
Решение (1) имеет вид:

ρ(t) = e–iHtρ(0) eiHt,     (2)
Однако в книге К.Блюм "Теория матрицы плотности и ее приложения" на стр. 67 говорится, что указанное решение справедливо для случая, когда Н не зависит от времени. Т.е. предлагается закладывать в модель неизменность взаимодействий в процессе эволюции (за которые и отвечает гамильтониан Н). Не является ли это слишком грубым упрощением реальности?

По алгоритму расчета:
1. Не понял, откуда берется начальная матрица плотности ρ(0)? По идее это тоже задаваемая матрица, как и гамильтониан.
2. Каков алгоритм диагонализации матрицы?

Как я понимаю, ко всему этому теперь нужен грамотный графический интерфейс?
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #4 : 27 Марта 2007, 00:58:33 »

ksv

Цитата:
Теперь в общих чертах теоретическая основа понятна. Скажите, а подход к моделированию многокубитных квантовых систем на основе дифференциального уравнения Луивилля - это наиболее общий подход из существующих? Сомнение здесь вот какого плана. Если мы моделируем эволюцию замкнутой системы в целом, то мы не должны в явном виде задавать зависимость переменных от времени, т.к. для системы в целом времени нет. Время должно возникать в результате такого моделирования. А в уравнении Луивилля зависимость от времени задана в явном виде. Поэтому вопрос: на Ваш взгляд это не сужает область применения модели? Не являются ли другие методы более перспективными? Например, в книге Х.Гулд, Я.Тобочник "Компьютерное моделирование в физике" (в 2 частях) квантовые системы анализируются с помощью метода случайных блужданий и вариационного метода Монте-Карло для квантовомеханических систем.

Если речь идет о точном решательстве, то да, обычно используют уравнение Лиувилля. Помимо этого есть много приближенных методов, в частности, Монте-Карло.

На время t в этой задаче не стоит смотреть как на физическое время в нашем обычном понимании. Экспоненциальный оператор в уравнении описывает «сдвиг» состояния. Гамильтониан конкретизирует характер этого смещения, а t – это всего лишь параметр, который отвечает за частоту сдвигов, насколько быстро они происходят. В нашем случае можно говорить, что для системы и нет времени, а есть параметр смещения состояния.
Если речь идет о конкретной физической задаче, когда мы описываем, например, физический эксперимент и задаем конкретный гамильтониан, то, действительно, мы привязываемся к обычному нашему времени t. Но в нашем случае цель другая – понять основные закономерности и взаимосвязи в системе с учетом нелокальных квантовых корреляций. При этом мы смотрим, что происходит с подсистемами, как они «проявляются» и какие корреляции их «пронизывают», когда изменяется состояние всей системы. При этом можно проследить и обратные связи, т.е. как изменения в подсистемах и на квантовых уровнях сказываются на состоянии всей системы, поскольку все рассматривается в единстве и всеобщей взаимосвязи.

Кстати, уравнение Лиувилля позволяет описывать не только замкнутые системы, но и открытые, в этом его преимущество по сравнению с ур. Шредингера, когда рассматривается динамика вектора состояния. В случае замкнутой системы матрица плотности получается из вектора состояния как проектор ρ=|ψ><ψ|.

Цитата:
Однако в книге К.Блюм "Теория матрицы плотности и ее приложения" на стр. 67 говорится, что указанное решение справедливо для случая, когда Н не зависит от времени. Т.е. предлагается закладывать в модель неизменность взаимодействий в процессе эволюции (за которые и отвечает гамильтониан Н). Не является ли это слишком грубым упрощением реальности?

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

Цитата:
По алгоритму расчета:
1. Не понял, откуда берется начальная матрица плотности ρ(0)? По идее это тоже задаваемая матрица, как и гамильтониан.

Начальная матрица плотности задается «вручную», например, это может быть равновесное состояние. А для циклической эволюции вообще неважно, откуда стартовать, будет лишь смещение начала координат.

Цитата:
2. Каков алгоритм диагонализации матрицы?

Я использую стандартные подпрограммы tred2 и tqli, это метод Хаусхолдера и QL-алгоритм с неявными сдвигами. Посмотреть описание можно здесь:
http://www.cyberguru.ru/programming/programming-theory/matrix-vectors-values-8.html
http://www.cyberguru.ru/programming/programming-theory/matrix-vectors-values-10.html
Или здесь:
http://www.netcode.ru/cpp/?click=Eigenvalue.html

Цитата:
Как я понимаю, ко всему этому теперь нужен грамотный графический интерфейс?

Похоже, это основной вопрос, в который все упирается. У меня опыт здесь небольшой, на Borland C++ Builder 6 для себя я делал несколько небольших программок под Windows. Но в данном случае этого недостаточно, например, с графиками и построением изображений я не умею работать, всегда пользовался для этих целей отдельными программами.
Основной компилятор, которым я пользуюсь, это Cygwin http://ru.wikipedia.org/wiki/Cygwin , поскольку мне нужна привязка к юниксовым g++ и gcc.

Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #5 : 27 Марта 2007, 12:06:07 »

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

Записан
ksv
Новичок
*
Сообщений: 42


Просмотр профиля
« Ответ #6 : 27 Марта 2007, 23:54:06 »

Если речь идет о точном решательстве, то да, обычно используют уравнение Лиувилля. Помимо этого есть много приближенных методов, в частности, Монте-Карло.

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

На время t в этой задаче не стоит смотреть как на физическое время в нашем обычном понимании.
Не совсем понял, речь же идет о диффернециальном уравнении Лиувилля, где в левой части стоит производная (!) матрицы плотности. Как по другому на это можно посмотреть? Да и  экспонента в решении возникла не просто так, а скорее всего как результат интегрирования по времени правой части.

Экспоненциальный оператор в уравнении описывает «сдвиг» состояния. Гамильтониан конкретизирует характер этого смещения, а t – это всего лишь параметр, который отвечает за частоту сдвигов, насколько быстро они происходят. В нашем случае можно говорить, что для системы и нет времени, а есть параметр смещения состояния
А вот про физический смысл данного уравнения если можно, пожалуйста, поподробнее: что это за «сдвиг» состояния? Каков в общих чертах характер эволюции квантовой системы из некоторого количества взаимодействующих кубитов? В каком направление она развивается? Какую картину показывают графики? Это интересно!

Кстати, уравнение Лиувилля позволяет описывать не только замкнутые системы, но и открытые, в этом его преимущество по сравнению с ур. Шредингера, когда рассматривается динамика вектора состояния. В случае замкнутой системы матрица плотности получается из вектора состояния как проектор ρ=|ψ><ψ|.
А за счет чего уравнение Лиувилля позволяет учесть квантовые взаимодействия открытой системы с окружением, да еще и динамику их изменений?
Что касается уравнения Шрёдингера, то помимо времени, в нем присутствуют еще и координаты в трехмерном прострастве. Тут я полностью разделяю Вашу точку зрения, что это скорее классическое приближение к квантовой физике, чем сама квантовая физика, которая открыла состояние материи более фундаментальное, чем ее существование в пространстве-времени, рассматриваемом классической физикой.

Вы правы, предполагается, что гамильтониан не зависит от времени. Не думаю, что это грубое упрощение, чаще всего в реальных физических задачах динамическая часть гамильтониана является малой добавкой. Учитывать ее имеет смысл для более точного описания каких-то конкретных экспериментов, но в нашем случае, когда речь идет лишь об общем понимании закономерностей, она ни к чему, по-моему.
Когда писал об этом, подумал о возможности моделирования расширяющейся Вселенной :), в которой сила одного из фундаментальных взаимодействий (гравитационного) между частями Вселенной меняются по мере изменения масштаба.
А если серьезно, то разве не интересно рассмотреть модель развития системы путем самоусложнения, когда целое направляет процесс взаимодействия частей в сторону усложнения и само усложняется в результате.
Ну например, такая модель квантовой социологии :). Предположим все люди своим существованием создают коллективное бессознательное (Р), которое определяет динамику каждого субъекта (О), т.е. задает границы свободы, в рамках которой субъект движется. Совокупная динамика субъектов изменяет состояние поля. И динамику каждого субъекта задает уже поле с новым состоянием. В результате такого циклического процесса система эволюционирует, что можно представить в виде системы уравнений:
P=F(O1,...,On) - уравнение эволюции коллективного бессознатльного;
Oi=G(P) - уравнение динамики i-го субъекта.
Видно что взаимодействие частей определяется целым, сотояние которого меняется в результате динамики частей.
Позволит уравнение Лиувилля это учесть или нет? :)

У меня опыт здесь небольшой, на Borland C++ Builder 6 для себя я делал несколько небольших программок под Windows. Но в данном случае этого недостаточно, например, с графиками и построением изображений я не умею работать, всегда пользовался для этих целей отдельными программами.
Основной компилятор, которым я пользуюсь, это Cygwin http://ru.wikipedia.org/wiki/Cygwin , поскольку мне нужна привязка к юниксовым g++ и gcc.
К сожалению у меня тоже почти нет опыта создания графичесих интерфейсов на С++. Но вроде же есть в Borland визуальный редактор для построения с помощью операции dgrad&drop :) окон любой сложности. Если Вы использовали только стандартные библиотеки С++ (а если нет у программы графического интерфейса, то это скорее всего так), то проблем с переносом проекта в Borland возникнуть не должно.
А зачем сохранять привязку к gcc ? Cygwin из небольшого опыта общения с ним могу сказать, что это жутко неудобная вещь, за уши притянута в Винду.
Открытая Java более предпочтительна на мой взгляд, хотя переписывать уже имеющееся на java - тоже не лучшая идея.
Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3536


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #7 : 28 Марта 2007, 02:12:23 »

С.И. Доронину

    Насколько я поняла, программа вами уже написана. А это меняет дело. Одно дело проект в смысле проектирование, а другое – доводить чужую программу до ума. Да и к тому же еще остались самые невкусные куски :).
    Делать графическую оболочку, или как я ее презрительно называю – "гую" (GUI = Graphic User Intertface), на мой взгляд, достаточно противно :). Не будучи профессиональным программистом, я обычно не довожу свои программы в этом отношении до блеска, поскольку сама же являюсь их конечным пользователем. А у создателя с его собственной программой, как правило, бывают более доверительные отношения.
    Что же касается самой проблемы, то тут мне кажется целесообразным использовать стандартные вызовы какой-нибудь из графических библиотек – OpenGL или DirectX. Тех самых, которые во всю используют игровые программы. В этом отношении DirectX даже предпочтительнее, поскольку входит в поставку Windows XP и инсталлируется вместе с ней автоматически.
    Насколько я себе представляю, в ней есть куча мала разных трехмерных объектов. А сферы там такие аппетитные :), как живые, – с тенями и блеском, варьируемой степенью прозрачности и т.д.
    Есть и более старая библиотека, описанная в хидере gl.h. (может это и есть OpenGL?) Вроде бы Silicon Graphics 15 лет назад написал, а может и того больше. Однако работает. Я на ней 4-х мерный гиперкуб вертела.
     В этом отношении интересен пакет MatLab, просто замечательно подходящий для матричных операций. Рисовать всякую трехмерную фигню :) он тоже отлично умеет. Однако, к сожалению, написанные на нем программы не могут работать автономно. Так что для данной цели его придется отбросить.
     Из того, чем люблю заниматься – это ускорять работу программ. Делаю это за счет ассемблерных функций (компилируются ассемблером до объектного модуля, а затем подлинковывается к программе).
    Матрицы – мои любимые объекты :), и в теоретико-математическом смысле, и в качестве объектов для программирования алгоритмов с их участием. Многие алгоритмы пишу сама, а, значит, им нет доверия :). Нынче повсеместно принято использовать функции из авторитетных библиотек.
    Переводила некоторые алгоритмы с Фортрана на Си - в тех случаях, когда по описанию не могла понять, как они работают. На нынешний момент у меня целая библиотека матричных функций, инкапсулированных в классы С++. На полноту не претендует, т.к. содержит только то, что мне когда-либо было нужно.
    Значительное ускорение матричных операций в основном достигается использованием ассемблерной процедуры для вычисления скалярного произведения двух векторов (линейных массивов). Эта операция очень широко используется внутри матричных алгоритмов. И не только при умножении матриц (где она основная), но и в упомянутых вами тридиагонализации по Хаусхолдеру, и QL-итерациях.
    Эффект ускорения достигается за счет накопления суммы в регистре FPU (Float Point Unit). При этом исчезает необходимость на каждом шаге выбирать частную сумму из памяти и вновь туда ее записывать после прибавления к ней произведения. Сумма – число длинное (8 байт), да еще и округляется до разрядной сетки типа double, - все это напрасно тянет время. Компилятор этого сделать не может, т.к. FPU имеет стековую архитектуру, и из-за этого его регистры не могут быть жестко привязаны к переменным.
    Очень важно еще и то, что накапливаемая таким образом сумма имеет внутри FPU более длинную мантиссу, чем в типе double. А это позволяет получать сумму, верную даже в самом младшем разряде. При обычном же сложении сплошь и рядом встречаются потери малых слагаемых из-за недостатка разрядности мантиссы. Последнее очень важно для того, чтобы след матрицы оставался постоянным.
    Еще один ресурс ускорения – это процедура вращения по Гивенсу в QL-алгоритме (у вас это "tqli"). Как показывает практика, основное время тянет не сама итерация, а перестроения матрицы собственных векторов:
a[] = a[]*cos - b[]*sin
b[] = a[]*sin + b[]*cos
Т.е. это плоское вращение. Учитывая, что множители для всех элементов строки одинаковы (будь то синус или косинус), оказывается эффектным лишь однажды загрузить в FPU эти два множителя (sin и cos), а затем использовать их для умножения (умножать можно так, что множитель при этом не портится). Кроме того, элементы векторов a[] и b[] можно заружать из памяти всего единожды, а не дважды. Как ни смешно, но такой способ ускоряет "ротацию" более чем вдвое.
    Аналогично этому реализуется процедура прибавления к вектору другого вектора, умноженного на константу. Это тоже часто используется в матричных алгоритмах.
    При многократных вычислениях синуса и косинуса от одного угла (это используется у вас при вычислениях экспоненты от комплексного аргумента), становится выгодным использовать ассемблерную инструкцию FSINCOS, которая за то же самое время вычисляет сразу и синус, и косинус. Тригонометрические функции очень долгие и выполняются за большое число тактов, и тут такая возможность оказывает сильное ускоряющее действие. Компилятор тут тоже не умеет использовать такую возможность, т.к. это никак невозможно запрограммировать на языке высокого уровня.
     Есть еще много других "секретов", но даже все вместе они дают выигрыш в скорости гораздо более скромный, чем то, что я только что перечислила.

Возникшие у меня вопросы:
    1. Насколько важно сохранять привязку к юниксовой среде (g++ и gcc)? Чем вызвана такая необходимость. Можно ли "безвозвратно" мигрировать на среду Windows?
    2. (самый наглый вопрос) Можно ли получить исходник вашей программы, в его нынешнем виде?
Записан
ksv
Новичок
*
Сообщений: 42


Просмотр профиля
« Ответ #8 : 28 Марта 2007, 14:20:50 »

Кстати по поводу построения графиков. В linux есть мощная утилита для этих целей с открытым кодом - gnuplot. Последняя версия от 2 марта 2007. Причем есть откомпилированная версия и под win32. Она строит 2D и 3D графики.
http://www.gnuplot.info/
Скачать можно отсюда (в том числе исходный код):
http://sourceforge.net/project/showfiles.php?group_id=2055&package_id=1996
Как вариант - использовать ее код в нашей программе.
Нам же будет достаточно, если она может строить график по таблице данных?
Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3536


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #9 : 28 Марта 2007, 17:18:04 »

    Для построения графиков никаких библиотек не нужно. Функций Windows API вполне достаточно для построения практически любых плоских изображений. Лично мне вполне хватает "пера" и "кисти", чтобы нарисовать любой график или гистограмму.
    Проблема возникает при необходимости рисования объемных изображений, или как их иначе называют – 3D-графики. Этого точками и отрезками не сделаешь, потому как надо наносить на объект градиент тени, чтобы он выглядел объемным. Для этого и нужна спец. библиотека.
     Библиотеки Linux, скорее всего, не годятся. Это не матричные алгоритмы, которые можно компилировать под любой ОС, а вещь напрямую связанная с аппаратным выводом, который жестко завязан либо на драйвер видеокарты, либо на специфические функции операционки. В любом случае эти вещи у разных операционных систем разные, так что компиляцией тут не отделаешься. Компиляция оборвется на вызове функций, которые у Linux и Windows не совпадают.
     DirectX (как и OpenGL) – не просто библиотеки, но и набор инсталлированных драйверов, которые почти что напрямую взаимодействуют с графическим процессором видеокарты. Графические примитивы Windows они, естественно, не используют. Иначе это было бы непроизводительно долго.
      Кстати, очень может быть, что данная программа может вообще обойтись без трехмерной графики. Например, для сферы Блоха можно  использовать готовую картинку, используемую в качестве фона, а проводить поверх нее только линию вектора.
      Думаю, что прежде чем обсуждать конкретные графические средства, необходимо выяснить, что именно надо рисовать.
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #10 : 29 Марта 2007, 03:32:05 »

ksv

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

Цитата:
А вот про физический смысл данного уравнения если можно, пожалуйста, поподробнее: что это за «сдвиг» состояния? Каков в общих чертах характер эволюции квантовой системы из некоторого количества взаимодействующих кубитов? В каком направление она развивается? Какую картину показывают графики? Это интересно!

Про сдвиг состояния, кратко и по существу, можно посмотреть здесь http://www.rec.vsu.ru/rus/ecourse/quantcomp/ см. Семинар 2 (в конце). Можно еще в книгу Дирака «Принципы квантовой механики» заглянуть, это гл.IV, п.25-26. Она есть у меня на старом сайте в djvu-формате.

Характер эволюции будет зависеть от гамильтониана и начальной матрицы плотности, и там может быть очень много чего интересного :). Пока в качестве простейшего примера я могу привести график динамики квантовой запутанности в трехкубитной системе из своей статьи S.I. Doronin, Multiple quantum spin dynamics of entanglement, Phys. Rev. A 68, 052306 (2003). Здесь работает так называемый многоквантовый (МК) гамильтониан (он отличается от обычного дипольного гамильтониана), которым описывают диполь-дипольные взаимодействия спинов в МК ЯМР. Если попытаться сказать проще, то дипольный гамильтониан описывает взаимодействие между вращающимися «сгустками энергий»; или пример из школы – взаимодействие замкнутых контуров с током; если ближе к эзотерической практике, это, например, может быть взаимодействие замкнутых энергетических потоков у нескольких людей, то, что бывает на занятиях в группе. 


 
В данном случае характер эволюции периодический, спины из начального локального сепарабельного состояния  периодически «растворяются» в нелокальном состоянии (синие кружочки) и снова «проявляются» (красные кружочки), при этом образуются и исчезают квантовые оболочки вокруг «плотного тела». Интересно, как ведет себя двухкубитная запутанность EBC – это аналог эфирного уровня (первая квантовая оболочка), запутанность не такая большая, примерно 0.2, т.е. довольно близко к «плотному миру», но в отдельные моменты повышается до 0.55. При этом в максимально запутанном состоянии эфирная оболочка полностью «растворяется» (синие кружочки), она хоть частично, но тварная, а в этом случае остаются только нетварные энергии (чистая квантовая информация). Здесь видна еще одна очень интересная особенность – эволюция между двумя первыми синими точками, это полный период между двумя максимально запутанными состояниями (проявление/растворение тварных энергий), но он отличается от следующего такого периода, который проходит уже через красную точку (сепарабельное состояние).
В общем, численные решения могут дать очень богатую пищу для размышлений :).

Для пользователей можно подавать результаты и как-то иначе, более интересно, например, когда моделируется эволюция Универсума, можно на картинках показывать, как из нелокального состояния «проявляются» локальные объекты, как они становятся все плотнее, и при этом «укутываются» несколькими слоями квантовых оболочек (стадия погружения в материю), а затем обратный процесс, когда всё тварное «растворяется» и снова возвращается в нелокальный источник реальности. Это можно сопровождать ссылками на тексты из религиозных и мистических учений, где описываются аналогичные процессы, например Манвантара - Пралайя и т.п.

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

Цитата:
А за счет чего уравнение Лиувилля позволяет учесть квантовые взаимодействия открытой системы с окружением, да еще и динамику их изменений?

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

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

Конечно, интересно! :) И я сам частенько над этим задумываюсь, например, о том, как грамотно можно учесть действие сознания в системе, описывать не просто «бессознательные» кубиты, а обладающие сознанием, и соответственно сознание будет присутствовать на всех квантовых уровнях, вплоть до единого сознания «наверху». Что-то близкое к тому, о чем Вы говорите про «квантовую социологию». Дополнительные уравнения здесь на первых порах даже не нужны, на мой взгляд, это можно делать в рамках приведенного уравнения. Надо только подумать, как это лучше сделать, например, самый простой вариант, на отдельных шагах по времени изменять состояние отдельных кубитов, т.е. кубит (один или несколько) как бы «проявляет самостоятельность», он не слепо эволюционирует согласно уравнению, а проявляет «свободу воли», т.е. это простейшая имитация деятельности сознания. И можно будет смотреть, как это сказывается на квантовых уровнях и на всей системе.

Цитата:
А зачем сохранять привязку к gcc ?

Привязку к g++ или gcc сохранять не надо, просто это то, что у меня есть на данный момент, то, что мне нужно было по работе.

Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #11 : 29 Марта 2007, 03:38:30 »

Pipa

Цитата:
Насколько я поняла, программа вами уже написана. А это меняет дело. Одно дело проект в смысле проектирование, а другое – доводить чужую программу до ума.

Да нет, это совершенно новый проект, где все придется проектировать заново от самого начала до конца с учетом GUI :). Из моих программ, самое большее, что можно взять – это отдельные функции, которые придется «вырезать» и вставлять, например, в С++Builder. А второй части у меня нет совсем, там нужно будет писать ряд функций.

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

У меня та же ситуация :).

Цитата:
Что же касается самой проблемы, то тут мне кажется целесообразным использовать стандартные вызовы какой-нибудь из графических библиотек – OpenGL или DirectX. Тех самых, которые во всю используют игровые программы. В этом отношении DirectX даже предпочтительнее, поскольку входит в поставку Windows XP и инсталлируется вместе с ней автоматически.

Думаю, Вы правы, но это на интуитивном уровне понимания :), тут я мало что знаю.

Насчет «ускорения» – вопрос очень существенный, все Ваши предложения я могу только приветствовать. И хорошо бы здесь выжать по-максимуму, сейчас я посмотрел, 8-кубитная система считалась у меня 16 минут, это вычислялись матрицы плотности на 300 шагах по времени. Правда, там считаются интенсивности многоквантовых когерентностей, но это самая последняя операция, которая времени занимает совсем мало.
16 минут это много, а у нас еще придется считать запутанность на всех уровнях, причем, на каждом шаге по времени, там тоже перемножаются матрицы и ищутся собственные значения. Время в несколько раз увеличится. Т.е. 8 кубитов уже под угрозой, нужно либо оптимизировать, либо по максимуму придется брать 7 кубитов.

Цитата:
Возникшие у меня вопросы:
    1. Насколько важно сохранять привязку к юниксовой среде (g++ и gcc)? Чем вызвана такая необходимость. Можно ли "безвозвратно" мигрировать на среду Windows?
    2. (самый наглый вопрос) Можно ли получить исходник вашей программы, в его нынешнем виде?

На Ваш первый вопрос ответ был выше, конечно нам нужен только Windows.

Исходники я высылаю вам обоим. Это задача по спиновой динамике для расчета интенсивностей многоквантовых когерентностей. Сами интенсивности нам не нужны, но там считается матрица плотности по тому алгоритму, о котором я говорил, т.е. это первый этап нашей программы. У меня они компилируются g++ под Cygwin. В качестве параметра при запуске на счет задается число кубитов, т.е. командой
a.exe 5
будет посчитана 5-кубитная система. В результате счета в текущей папке создаются файлы с массивами данных по динамике интенсивностей МК когерентностей (в первом столбце время, во втором сами когерентности). Матрица плотности rm[][], которая нам нужна, считается в функции Multi().
В данной программе за эволюцию отвечает МК гамильтониан, о котором я упоминал выше.
Да, еще один момент, здесь в качестве начальной матрицы плотности используется ρ(0)=Iz, которая диагональна, и в программе она задана в виде вектора, т.е. функцию перемножения матриц Multi()нужно будет немного поправить, вектор заменить матрицей. А так, вроде, больше ничего исправлять не надо, в смысле, остальные функции можно брать так, как есть.

Записан
freeneutron
Новичок
*
Сообщений: 22



Просмотр профиля
« Ответ #12 : 29 Марта 2007, 11:31:43 »

С графикой все просто. Не надо забывать, что OpenGL и Direct-X созданы для пользователя и подробно разобраны на многих порталах. Уверен, что для своего случая вы найдете подходящий шаблон, который без труда переправите под свою программу.
Вот только мне не совсем понятно, какая польза может быть от этой программы. Какую пользу можно получить от наблюдения за 8-ми кубитной системой?
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #13 : 29 Марта 2007, 18:09:11 »

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

Разве Вам не интересно узнать, как связаны между собой квантовые уровни реальности, и как они влияют на плотный мир? Например, более внимательно посмотреть, как происходит «проявление» плотного физического мира при эволюции Универсума и последующее «растворение» тварных энергий и возвращение их в нелокальный источник реальности.
Записан
ksv
Новичок
*
Сообщений: 42


Просмотр профиля
« Ответ #14 : 01 Апреля 2007, 23:11:45 »

В этом отношении интересен пакет MatLab, просто замечательно подходящий для матричных операций. Рисовать всякую трехмерную фигню :) он тоже отлично умеет. Однако, к сожалению, написанные на нем программы не могут работать автономно. Так что для данной цели его придется отбросить.
Да, Matlab - очень мощный математический пакет, изначально предназначенный для операций над матрицами (MatLab - Matrix Laboratory).
Причем в современных версиях пакета есть очень интересные модули, позволяющие написанные в Matlab программы автоматом экспортировать в Си.
С сайта http://matlab.exponenta.ru/matlabcompiler/default.php
Цитата:
С помощью MATLAB Compiler Вы можете автоматически генерировать оптимизированный C и C++ код для M-файлов. Транслируя код MATLAB на C и C++, компилятор существенно ускоряет работу приложения.
Ускорение вычислений. Ориентированный на работу с матрицами язык MATLAB оптимизирован для выполнения операций с массивами. Однако выполнение других типов операций, таких как операции со скалярами, может быть существенно ускорено при преобразовании на язык C или C++. Compiler производит это преобразование легко и быстро.
Уменьшение времени разработки. Компилятор сбережет Вам время, обеспечив автоматический переход от интерактивной среды MATLAB к эффективным математическим приложениям. 
Исполняемые модули. Компилятор генерирует C код для двух типов исполняемых модулей: MEX-файлы и автономные исполняемые модули. MEX-файлы - это исполняемые модули MATLAB, которые вызываются из MATLAB и динамически линкуются во время выполнения. Автономные модули, генерируемые компилятором, могут быть встроены в приложения, написанные на C и C++ , которые выполняются вне среды MATLAB.
Так что сходу отбрасывать эту идею пока не стоит. Если у кого есть опыт работы с данным пакетом, могут попробовать реализовать алгоритм в нем, а затем экспортировать в автономную прорамму?

    Для построения графиков никаких библиотек не нужно. Функций Windows API вполне достаточно для построения практически любых плоских изображений. Лично мне вполне хватает "пера" и "кисти", чтобы нарисовать любой график или гистограмму.
Согласен, но эти функции надо знать! А насколько я понял среди нас пока нет к сожалению такого знатока.
     Библиотеки Linux, скорее всего, не годятся. Это не матричные алгоритмы, которые можно компилировать под любой ОС, а вещь напрямую связанная с аппаратным выводом, который жестко завязан либо на драйвер видеокарты, либо на специфические функции операционки. В любом случае эти вещи у разных операционных систем разные, так что компиляцией тут не отделаешься. Компиляция оборвется на вызове функций, которые у Linux и Windows не совпадают.
В упомянутой мной программе gnuplot есть части для отрисовки графиков для множества разных операционных систем.
Однако попробовал разобраться в исходном коде, пока очень туго. Думаю перспективней искать другой путь.
      Думаю, что прежде чем обсуждать конкретные графические средства, необходимо выяснить, что именно надо рисовать.
Полностью поддерживаю. Прежде чем искать готовые шаблоны в коде, надо более четко определиться с типом графиков. Это позволит сузить поиск. Насколько понимаю на первом этапе достаточно ограничиться графиками простой зависимости вида y=f(x), где f - задана массивом чисел.

Насчет времени. Я пытаюсь сказать, что время, которое входит в уравнение, в нашем случае будет не то время, которое мы измеряем по своим часам.
Это понятно. Но я говорил о другом. Сама форма уравнения, которае задает динамику системы. По моему мнению уравнение Лиувилля в этоим плане принципиально отличается от приводившейся мной системы уравнени, когда результат вычисления первого уравнения используется для расчета во втором уравнении, результат которого в свою очередь используется в первом уравнении на следующем шаге и т.д. В последнем случае время "возникает" в результате взаимодействия подсистем и их совместной эволюции, а не задается изначально в виде параметра. Другими словами, в уравнении Лиувилля мы можем рассчитать матрицу плотности системы на произвольном шаге t=a (где а - сколь угодно далеко отстоит от t=0), минуя все промежуточные расчеты матриц плотности на шагах от t=1 до t=a-1 путем применения оператора сдвига во времени. А в моем примере этого сделать принципиально не получится: нельзя рассчитать характеристики системы на шаге t=a без расчета всех предыдущих циклов взаимодействия в моменты 0<t<a, от которых зависит состояние системы в момент t.

Дополнительные уравнения здесь на первых порах даже не нужны, на мой взгляд, это можно делать в рамках приведенного уравнения. Надо только подумать, как это лучше сделать, например, самый простой вариант, на отдельных шагах по времени изменять состояние отдельных кубитов, т.е. кубит (один или несколько) как бы «проявляет самостоятельность», он не слепо эволюционирует согласно уравнению, а проявляет «свободу воли», т.е. это простейшая имитация деятельности сознания. И можно будет смотреть, как это сказывается на квантовых уровнях и на всей системе.
Очень интересная идея! Например с помошью генератора псевдослучайных чисел вносить некоторую недетерминированность в состояние отдельного кубита. Вот только не понимаю как в матрице плотности можно выделить отдельный кубит? Матрица ведь представляет общее (интерференционное) состояние всех кубитов системы.

Но это лишь первый этап. На втором, имея полную матрицу плотности для всей системы, на каждом шаге по времени вычисляются уже сами меры квантовой запутанности между различными подсистемами на всех уровнях.
...
Этого у меня нет в кодах, да пока никто и не знает, как решить такую
задачу и сделать полный анализ квантовой запутанности для
многокубитной системы на всех ее уровнях
А что вообще дает полный анализ квантовой запутанности? Т.е. насколько понимаю мера квантовой запутанности - это вещественный коэффициент от 0 до 1, показывающий степень взаимосвязи частей системы: от 0 (полностью сепарабельная система) до 1 (чистое состояние). Какие выводы можно сделать по динамике этих мер запутанности? Почему им придают такое большое значение?

Исходники я высылаю вам обоим.
Сергей Иванович, спасибо. Однако очень не просто оказалось для меня разобраться в Ваших исходниках: слишком много переменных, которые непонятно для чего введены. Как я понимаю смотреть надо только на алгоритм в функции Multi() ?
Записан
Страниц: [1] 2 3 ... 15  Все Печать 
« предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by SMF 1.1.10 | SMF © 2006-2009, Simple Machines LLC