Привет и спасибо, что нашли время взглянуть на мой вопрос. Это обновленная версия моего вопроса, который я ранее разместил на сайте физика.stackexchange.com.
В настоящее время я изучаю двумерный экситонный спинор Бозе-Эйнштейна, и мне интересно узнать основное состояние этой системы. Математический метод перехода в основное состояние называется методом мнимого времени .
Метод очень прост, когда время в квантовой механике заменяется мнимым Это замещение приводит к тому, что частицы высокой энергии в моей системе распадаются быстрее, чем частицы низкой энергии. Повторно нормализуя число частиц на каждом этапе расчета, мы получаем систему частиц с наименьшей энергией, иначе говоря. основное состояние.
Рассматриваемое уравнение (я) является нелинейным, называемым нелинейным уравнением Шредингера , иногда уравнением Гросса-Питаевского . Для решения проблемы я использую Matlabs ode45, который развивает систему вперед во времени и в конечном итоге достигает основного состояния.
- Заметка! Нелинейное уравнение Шредингера включает в себя лапласиан и некоторые другие дифференциальные члены в пространстве. Все это решается с помощью быстрого преобразования Фурье. В итоге у нас есть только время ODE. *
Моя проблема и вопрос: расчеты идут от до . Ode45 помещается в цикл for, поэтому он не вычисляет гигантский вектор одновременно. Первый раунд начинается с ode45 (odefun, ), а затем продолжается в следующий раз с . Здесь шаг по времени - моя проблема. Различный выбор временных шагов дает мне разные решения основного состояния, и я не знаю, как определить, какой временной шаг дает мне «наиболее» правильное основное состояние!t f [ t 0 , … , t f ] [ t 0 , t 0 + Δ / 2 , t 0 + Δ ] , y , … t 0 + Δ Δ
Моя попытка: я понимаю, что в этой схеме большие временные шаги приведут к распаду большого количества частиц, прежде чем они будут нормализованы до исходного числа частиц, в то время как небольшие временные шаги приведут к распаду меньшего количества частиц, прежде чем они будут повторно нормализованы. Сначала я думал, что маленькие временные шаги должны дать более точное решение, но, похоже, все наоборот.
Я не специалист по количественным показателям, поэтому выбор ode45 был просто произвольным. ode113 дает мне то же самое. :(
У кого-нибудь есть мысли по этому поводу. Дайте мне знать, если понадобятся какие-либо дополнительные детали.
Спасибо.
Обновление 1: я исследовал метод воображаемого времени и ОДУ. Казалось бы, если временной шаг не достаточно мал, все становится нестабильным. Это заставляет меня задаться вопросом, являются ли мои нелинейные уравнения жесткими, что усложняет ситуацию из того, что я понимаю. Я буду держать вас в курсе.
Обновление 2: ИСПРАВЛЕНО: Проблема действительно заключалась в нормализации за пределами ODE. Если нормализация сохраняется внутри odefun, то ODE возвращает один и тот же результат для разных вариантов «внешних» временных шагов. Мой коллега показал мне более старые коды, и я просто добавил одну строку в моем odefun.
function y_out = odefun(t,y_in,...variables...)
...
[ Nonlinear equations evaluated ]
...
y_out = y_out + 0.1*y_in*(N0-Ntemp) ;
end
Последняя строка вычисляет разницу в текущем количестве частиц (Ntemp) и количестве частиц, которое должна удерживать система (N0). Он добавляет часть частиц обратно к выходу и, таким образом, создает общую стабильность числа частиц в системе вместо того, чтобы все они распадались.
Я также поставлю новый вопрос, касающийся размерности проблемы и некоторых различий в работе с пикосекундами или наносекундами как временными шагами в ODE.
Спасибо вам всем. :)
ode45()
совершаете одинаковые шаги. Почему именно вы избегаете генерации «гигантского вектора»? Если вам абсолютно необходимы одинаковые точки,ode45()
выполните обычную процедуру, а затем используйте интерполяцию.ode45()
, которая позволит вам сохранить шаги больше определенного порога; Вы могли бы хотеть изучить это.Ответы:
Поскольку вы не опубликовали свой код MATLAB, я не уверен, как вы звоните ode45. Я предполагаю, что вы меняете вектор tspan (второй аргумент) при каждом вызове на ode45. Первое, что нужно понять, это то, что вектор tspan (почти) не влияет на временной шаг, используемый ode45. Вектор tspan просто позволяет передать в ode45 временной интервал интегрирования и время, в которое вы хотите получить результат. Шаг по времени, используемый алгоритмом Рунга-Кутты в ode45, регулируется внутри для достижения заданной точности. Двумя параметрами, которые контролируют эту точность, являются RelTol и AbsTol в структуре опций, передаваемой в ode45. Они имеют разумные значения по умолчанию, и, поскольку вы не упомянули их, я предполагаю, что вы их не меняли.
Я сказал «почти», не влияя на нормальный шаг времени ode45. Если вы запрашиваете вывод с интервалами времени, очень маленькими по отношению к временному шагу, который ode45 в противном случае предпримет, то ему придется сократить временной шаг, чтобы удовлетворить ваш запрос на вывод. Я полагаю, что это то, что предполагает JM. Зачем вам нужно решение при столь большом количестве выходных данных? Обычно достаточно просто запросить вывод в достаточное время, чтобы сгенерировать плавный график.
Что касается изменения в решении, которое вы видите, возможно, значения по умолчанию RelTol и AbsTol не подходят для вашей проблемы. Я предлагаю заменить ваш цикл на ode45 одним вызовом, запросить вывод несколько раз и поэкспериментировать с меньшими значениями RelTol и AbsTol, пока не получите конвергентное решение.
источник
Поскольку нелинейное уравнение Шредингера, ну, в общем, нелинейное, оно может иметь большое количество стационарных состояний, некоторые из которых могут быть устойчивыми. В физической реальности, начиная с одного конкретного состояния, система детерминистически эволюционирует в одно конечное состояние. Если численная схема дает вам разные результаты для разных дискретизаций (временных шагов), то это фундаментальный недостаток вашей дискретизации. Проверьте свой код.
Если в итоге вы получите состояние , то легко проверить, действительно ли это стационарное состояние: если эволюция времени задается как затем Если вы действительно получите разные стационарные состояния, вы можете сравнить их энергии Гиббса где - плотность энергии. Когда , часто выглядит довольно просто, например, для уравнений Гинзбурга-Ландау, .d ψψ0 F(ψ0)=0.G(ψ)=∫ΩE(ψ)E(⋅)F(ψ)=0E(ψ)E(ψ)=-| ψ| 4
источник
Проблема решена:
Нормализация должна быть частью функции, оцениваемой в ODE. Разбиение ODE на многие этапы и нормализация между ними вызывает, казалось бы, числовую нестабильность и дает разные результаты в зависимости от временных интервалов, на которые разбит ODE. (См. Редактирование 2 в вопросе для более подробной информации.)
источник