Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

вторник, 19 января 2010 г.

Аннигиляция протон-антипротон и метод монте-карло

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

Итак, начнём с физики. В природе существует вещество и антивещество. При столкновении вещества и антивещества происходит аннигиляция. Привычной нам частице протону соответствует антипротон с отрицательным зарядом. Сейчас речь пойдёт о их аннигиляции.
Аннигиляция протона с антипротоном может проходить очень по-разному. Обычно её проводят в камерах, где можно фиксировать следы от заряженных частиц. Интерес представляют случаи, когда фиксируются 4 видимых следа после аннигиляции. Эти следы оставляют за собой 4 пиона, два положительных, два отрицательных. С помощью формулы недостающей массы(основанной на релятивистском инварианте) считают массу частиц, которые не видны на снимках, нейтральных частиц.

Пример снимка:


Если масса этих невидимых частиц превышает 135 МэВ, то можно утверждать, что родился один нейтральный пион. Из некоторых теоретических соображений, было предположенно, что в данном процессе рождается ещё одна нейтральная частица. Эта частица распадается на нейтральную тройку: pi+,pi-,pi0. Для простоты:
Задача состоит в нахождении массы этой частицы X(предполагаемый omega0-мезон).
В реальном опыте физики считали инвариантные массы всех четырёх нейтральных троек мезонов, и строили график количества случаев с той или иной инвариантной массой. Если бы частица X не рождалась бы совсем, то график был бы равномерным. Если бы она рождалась всегда, то график вылился бы в одну точку. А вот если бы она рождалась иногда, то график был бы равномерным, но в нём был бы пик, который бы отвечал за инвариантную массу частицы X.

Итак, физики просто отбирали случаи с 4 следами на снимке, проверяли наличие pi0-мезона, считали инвариантные массы нейтральных троек и клали их на график. В итоге они получили вот такую картинку:




Как видно, при массе около 0,8 ГэВ(0,782 ГэВ) наблюдается подскок. Это и есть наш omega0-мезон. Ура-ура!

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

Изначально делалось так: бралась начальная энергия, распиливалась на 4 части, "отдавалась" четырём частицам(объектам), после чего считалась недостающая масса, делалась проверка, чтобы она была больше 135. После чего считалась инвариантная масса, и ставилась на график. Однако, чего ждать, тут же случайные числа, конечно мы можем как-то ограничиться порогами реакции, можем предположить, что у нас есть что-то вроде фазового объёма или резонанса(формула Брейта-Вигнера), и отрезать всё что непохоже на неё. Итак, вот что получилось:
(Фиолетовые скопления - средние арифметические значения энергий в интервале 30 МэВ).

Вполне себе похоже на пик, но что делать дальше? Придётся принять, что всё-же 782 МэВ должно выпадать чаще, и ему уделять больший вес. То есть при попадании такого случая прибавлять не один случай, а несколько. При чём неплохо было бы делать это в окрестностях, в соответствии с формулой Брейта-Вигнера.

Всё, выговорился, жду ваших комментариев

четверг, 2 июля 2009 г.

Что происходит?

Решил рассказать о том, что у меня тут сейчас происходит.

Во-первых, я дописал проект до некоторого логического перерыва. Реализованы базовые функции, сделан MDK(Module Development Kit) для разработки модулей, отловлены некоторые баги, все исключения обрабатываются ну и так далее. Если интересно - смотрите лог ревизий на svn.

Во-вторых, завтра я уезжаю в Болгарию, там я буду отдыхать, смотреть Lost и читать Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide, который уже начал читать тут.

В-третьих, я для себя открыл Google Notebook и Фотополигон, у которого, как мне кажется, очень неудобный интерфейс для просмотра.

А ещё я научился делать нормальные фотки в макро-режиме на моём E71(надо оказывается нажимать клавишу T, для фокусировки), даже сфоткал забавную схему из intel-мануала, которая меня сильно напугала по-началу.

Ну вот, как-то так. Приеду - выложу фотки из Болгаирии

четверг, 11 июня 2009 г.

Формулировка конечной задачи

Требования в виде списка более понятны.

Основная задача

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


Подробнее

  • Пользователь взаимодействует с программой по средствам экспериментов.
  • Эксперимент — это и есть микрозадача, в которой должны задаваться параметры, при чём по разному(мы можем задавать те или иные параметры и получать из них тот или иной результат).
  • Пользователь также может проводить серию экспериментов и видеть статистику для каждого.
  • Пользователь может проводить несколько экспериментов параллельно(различные типы экспериментов) и видеть возможную связь между ними.

С точки зрения интерфейса


  • Окно будет реализовано в обычном Windows-стиле, без особых эффектов.
  • Эксперименты будут в различных вкладках(TabView).
  • Для создания эксперимента будет сделан собственных диалог(wizard).
  • Редактирование параметров эксперимента будет выделено в отдельный диалог, который будет принимать объект списка параметров(см. "С точки зрения программирования").

Скриншот интерфейса стадии альфа:




С точки зрения программирования

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

Иерархия классов:

Подробно снизу-вверх:
  • ParameterList - класс, реализующий список элементов ParameterListUnit, в нём хранятся все параметры для данного эксперимента.
  • SomeVisualization - несуществующий класс, приведенный в роли примера класса, наследованного от GraphicsPrimitive
  • Expirement - класс, реализующий связь между параметрами эксперимента и его визуализацией, именно объекты этого класса будут сохранятся в файлы и передаваться куда-либо.
  • ExpirementControl - класс, реазуализующий "User Control", для прорисовки в табах.
  • Ну и верхняя связь подрузумевает что класс главной формы должен хранить в себе все объекты ExpirementControl


В разработке

  • Разработка иерархии
  • Внедрение готовых микрозадач в программу
  • Воможно: внедрение MVC(разделение GraphicsPrimitive на вычисление и рисование).
  • Возможно: вынос типов проектов в dll-файлы(плагины).

суббота, 25 апреля 2009 г.

Рассеяние Резерфорда

Одна из задач, которые я сейчас выполняю - это визуализация рассеяния Резерфорда. Решил вот написать о этом.

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

Немного подробнее
Изначально у нас есть несколько параметров:
  • b - "прицельное расстояние" - расстояние от траектории частицы в бесконечности до параллельной ей прямой, проходящей через ядро.
  • m,v - масса и скорость частицы(в бесконечности). Эти 2 параметра было решено заменить на 1 - энергию.
  • Z - заряд ядра(я думаю не нужно пояснять что это не его заряд, а количество протонов).
Всё происходящее пожно поделить на 3 части:
  1. Частица летит в бесконечности.
  2. На частицу начинает действовать сила отталкивания, она начинает лететь по гиперболической траектории.
  3. Сила отталкивания перестаёт действовать и она летит по своей ассимптоте.
Для пункта 1 всё ясно, тут движение можно задать прямой y = b.
Проблемы начинаются во втором пункте, когда начинаются откланения. В материалах, по которым изучается весь этот процесс, можно найти только формулу для силы, которая действует на альфа-частицу. Конечно можно выразить ускорение через второй закон Ньютона, но, как сказал наш научный руководитель - это затратно по вычислениям и вообще так никто не делает.
В третьем пункте всё более-менее ясно, формула для угла Θ дана, если всё правильновысчитать то можно легко выразить всё что нужно. Подсчёт Θ имеет некоторые проблемы, которые я опишу далее.

Задача
На данном этапе нужно визуализировать движение частицы.

Проблемы
Итак, по пунктам:
  1. Не ясен алгоритм, сейчас в коде идёт перебор всех углов от пи, до теты, что мне кажется неверным. Для каждого угла находятся координаты точек.
  2. При вычислении теты и прочего неясна ситуация со степенями. Примером служит тета, при расчёте которой фигурируют числа порядка 10^32, что не очень приемлемо.
Выше приведены основные проблемы, из них вытекают последствия неправильной визуализации.

Мысли о решении проблем
Пока я дошёл до того, что нужно разбивать всё это дело на 3 функции и рисовать, а не перебирать углы.
Также нужно решить что-то с коэфициентами чтобы получались адекватные результаты.

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

пятница, 17 апреля 2009 г.

Подкастер

Вчера взялся за разработку программы для прослушивания подкастов, на основе .NET Framework 2.0
Основные функции, по задумке:
  • Подписывание по RSS на различные подкасты
  • Вывод всех подкастов и их выпусков в дереве(TreeView)
  • Возможность скачивания и прослушивания подкастов без открытия дополнительных программ(браузер, плеер)
  • Пометка прослушанных подкастов цветом.
  • Максимальное быстродействие(писать начал из-за перегруженности iTunes)
В общем часть этого я додумал вчера, изначально хотелось написать просто программку для прослушивания подкастов.

Разработал уже некую структуру классов, пока что всё выглядит несвязанно, но далее хочу выявить более явную иерархию:




Ну и скриншот(интерфес ещё не готов, буду рад слышать ваши пожелания):

В ходе разработки понял что стандартный TreeView - гавно, из-за невозможности связывания программных объектов и узлов дерева. Так что по совету одного человека с лепры решил заюзать Advanced TreeView for .NET