Dmitry Popov (thedeemon) wrote,
Dmitry Popov
thedeemon

Category:

Quantum vs. classical

В одной из ветвей волновой функции вселенной вы сегодня проснулись и задумались о том, что будет, если запрограммировать очень простую игрушечную модель квантовой механики и поиграться с ее параметрами. Не знаю, что там получилось у вас, но вот что получилось у меня.
У Ричарда Фейнмана есть чудесная "книжка" (запись публичной лекции) "QED: The Strange Theory of Light and Matter", где он наглядно на пальцах объясняет кое-какие азы, не прибегая к формулам. По сути он там излагает подход "sum over histories", он же "интегралы по траекториям". Если у нас из точки А вылетает частица, и мы хотим найти вероятность обнаружить ее позже в точке В, то мы делаем следующее. При движении частицы по некоторому пути Фейнман предлагает представить стрелку, которая крутится как на часах пока частица по этому пути летит. Дальше он предлагает взять все-все мыслимые пути из А в В, для каждого прокрутить такую стрелку, и все эти стрелки сложить как вектора. Квадрат длины такой стрелки и даст нам искомую вероятность (после нормализации). Понятно, что хотя он формулы не приводит, стрелки это комплексные числа, а их кручение это eiφ(t). На деле там eiS/h, где S это величина действия, интеграл по времени от лагранжиана вдоль траектории. У частицы нет какой-то одной определенной траектории, вместо этого она летит как бы сразу по всем, а суммирование амплитуд позаботится о том, чтобы траектории близкие к стационарному значению действия (минимуму/максимуму) складывались конструктивно и давали вклад большой, а отклонения от таких траекторий в разные стороны складывались деструктивно, с разными знаками, таким образом нейтрализуя друг друга, от них общий вклад будет маленький, отсюда автоматически возникает принцип наименьшего (стационарного на самом деле) действия, на котором вся механика стоит (и оптика). Такая формулировка может показаться очень непохожей на обычную квантовую механику 20-х годов, где есть волновая функция и ее эволюция по уравнению Шрёдингера, но одна из другой несложно выводится, см. например первые несколько страниц здесь.
Вот это и запрограммируем, делов-то. Возьмем двумерную коробку единичного размера. Из середины нижней границы будем запускать частицы. И в разных точках будем их "ловить" - считать суммарную амплитуду. Для интереса перегородим коробку стенкой, в к которой просверлим две дырки - будет у нас двухщелевой эксперимент, второй по знаменитости во всей КМ. Траектории будем прокладывать случайным образом из отрезков, проходящих через случайные точки (частица может прыгать туда-сюда совершенно не заботясь ни о каких законах движения). Если отрезок пролегает через стенку, то такую траекторию выбрасываем, не считаем, стенки у нас будут непроницаемыми для частиц. У нас есть ровно одна траектория из А в В, состоящая из одного отрезка, и сколько угодно траекторий с одной или более промежуточными точками. Осталось решить как вычислять действие - как крутить стрелки. Возьмем самый простой игрушечный вариант: действие при движении вдоль отрезка пропорционально его длине: hc * len, где hc - некоторый коэффициент, связанный с постоянной Планка h, обратно ей пропорциональный (ибо в оригинале там S/h). Вот и все. Код:

alias C = Complex!double;

C propagator(Point p1, Point p2) {
    real len = hypot(p1.x - p2.x, p1.y - p2.y);
    return C(expi(hc * len));
}

C amplitude(double endX, double endY) {
    Point[MaxStops+1] points = void;
    points[0] = Point(0.5, 0.0);
    auto endPoint = Point(endX, endY);

    C totalAmpl = canPass(points[0], endPoint) ? propagator(points[0], endPoint) : complex(0.0);

    paths:
    foreach(n; 0..NPaths) {
        int npoints = 1 + uniform(0, MaxStops);
        foreach(i; 1 .. 1 + npoints)
            points[i] = Point(uniform01(), uniform01());

        C ampl = complex(1.0, 0.0);
        foreach(i; 0..npoints) {
            if (!canPass(points[i], points[i+1])) continue paths;
            ampl *= Q * propagator(points[i], points[i+1]);
        }
        if (!canPass(points[npoints], endPoint)) continue paths;
        ampl *= propagator(points[npoints], endPoint);

        totalAmpl += ampl;
    }
    return totalAmpl;
}


(полный текст, с генерацией картинки тут)

Запускаем, и получаем что-то интересное:

Тут hc=20, в каждую точку пытаемся провести NPaths=70000 путей, в каждом пути до 4 остановок - до 5 отрезков.

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

Попробуем изменить h-related constant. hc=42:

Изменилась "длина волны", но все еще видна интерференционная картина, все как во взрослой квантовой механике.
Для сравнения, закроем одну щель, оставив лишь единственное отверстие в перегородке:


Попробуем дальше увеличивать hc, т.е. как бы уменьшать постоянную Планка. hc=220:


hc=500:


Чем меньше постоянная Планка h (и больше наш коэффициент hc), тем меньше заметна интерференция, тем более классически выглядит распределение вероятностей. Как и положено в КМ, при устремлении h к 0 мы должны получать классическое поведение.
Попробуем в другую сторону. hc=5:


hc=1:


Тут уже похоже на волны в океане, если смотреть очень свысока.
Дальшейшее уменьшение hc (увеличение h) ничего не меняет, картинка выглядит так же и при hc=0.01.

Ролик с плавным изменением hc от 500 до 1 и обратно:


В исходнике вы могли заметить еще одну константу - Q, на которую амплитуда умножалась в каждой промежуточной остановке траектории. Это я попробовал перенести в эту игрушечную модель элемент из правил для диаграмм Фейнмана в квантовой теории поля. Там каждая диаграмма описывает класс "траекторий", которые тоже суммируются по всем возможным расположениям промежуточных точек в пространстве и времени (там частицы могут не только прыгать туда-сюда в пространстве, но даже и во времени, движение частицы назад во времени выглядит как античастица). Но там в промежуточных точках обычно встречаются три линии: то фотон встречается с электроном и поглащается им (фотон + электрон на входе, один электрон на выходе), то фотон распадается на пару электрон-позитрон, то наоборот электрон и позитрон встречаются, аннигилируют и порождают фотон, и так далее. Везде или 2 на входе, 1 на выходе, или 1 на входе, 2 на выходе, а на диаграмме это просто узел с тремя сходящимися в точке линиями. Просто в исходных уравнениях много членов в виде произведения троек операторов "уничтожение фермиона" * "рождение фермиона" * "уничтожение/рождение бозона", и при каждой таком члене - константа связи, характеризующая, как сильно данные два поля фермионов и бозонов между собой взаимодействуют. Так же известная как заряд. В квантовой электродинамике это заряд электрона. С другими взаимодействиями - сильным и слабым - другие соответствующие заряды. В итоге при расчете амплитуды каждой "траектории"/диаграммы каждый узел вносит свой вклад в виде умножения на константу-заряд. Потому, кстати, диаграммы с большим числом промежуточных узлов вносят очень малый вклад - там заряд в энной степени, и если он изначально мал, в энной степени выходит совсем мало. Кроме сильного взаимодействия, там он не так мал.

Так вот, на картинках выше везде Q=1, т.е. эффект заряда не учитывался. Если же сделать Q=0.01, например, то при hc=20 получается так:

Во всех моих экспериментах в этой игрушечной модели, при заряде заметно меньше единицы единственное различие - траектории без промежуточных точек (т.е. прямые) получают сильно большую вероятность, а остальная картинка остается такой же, как при Q=1, просто немного проседает общая вероятность попадания в места, куда нет прямого пути.
Очень устойчив получается узор к изменениям модели, и только изменение hc реально меняет тут картинку.
Какие из этой игрушечной модели можно сделать выводы?
В традиционных учебниках по квантовой механике обычно говорят в стиле копенгагенской интерпретации: измерение и коллапс волновой функции происходят при контакте квантовой системы с "классической", а что такое классическая толком непонятно, кроме того, что она достаточно "большая". Популяризатор науки Эмиль Ахмедов как-то говорил, что вся разница между квантовой и классической системами лишь в величине действия. Маленькое действие - квантовая, большое - классическая.
Считая hc = k/h, давайте еще раз сравним выражение для амплитуды вероятности одной траектории длины len в моей модели и в "настоящей" физике:

ei * hc * len = ei * k * len / h ~ ei * S / h

Мы видели, что в модели система ведет себя более классически, когда растет hc. Это эквивалентно либо уменьшению h, постоянной Планка, либо увеличению len, длины траектории, т.е. увеличению масштаба. Но по сути это есть увеличение действия S. Можно представить другие способы его увеличения. Например, можно представить, что в системе много частиц, которые друг с другом взаимодействуют (система "большая") или она находится в активном взаимодействии с каким-то еще полем, эффект которого выражен в добавлении новых членов в лагранжиан, что в итоге увеличивает общее действие. Чем больше там всего происходит, тем больше действие, тем больше аналог нашего hc * len, тем более классически выглядит система. Прав был Ахмедов!
Tags: кванты
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 14 comments