Выбор размера шага с использованием ODE в Matlab


12

Привет и спасибо, что нашли время взглянуть на мой вопрос. Это обновленная версия моего вопроса, который я ранее разместил на сайте физика.stackexchange.com.

В настоящее время я изучаю двумерный экситонный спинор Бозе-Эйнштейна, и мне интересно узнать основное состояние этой системы. Математический метод перехода в основное состояние называется методом мнимого времени .

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

t=iτ

Рассматриваемое уравнение (я) является нелинейным, называемым нелинейным уравнением Шредингера , иногда уравнением Гросса-Питаевского . Для решения проблемы я использую Matlabs ode45, который развивает систему вперед во времени и в конечном итоге достигает основного состояния.

  • Заметка! Нелинейное уравнение Шредингера включает в себя лапласиан и некоторые другие дифференциальные члены в пространстве. Все это решается с помощью быстрого преобразования Фурье. В итоге у нас есть только время ODE. *

Моя проблема и вопрос: расчеты идут от до . Ode45 помещается в цикл for, поэтому он не вычисляет гигантский вектор одновременно. Первый раунд начинается с ode45 (odefun, ), а затем продолжается в следующий раз с . Здесь шаг по времени - моя проблема. Различный выбор временных шагов дает мне разные решения основного состояния, и я не знаю, как определить, какой временной шаг дает мне «наиболее» правильное основное состояние!t f [ t 0 , , t f ] [ t 0 , t 0 + Δ / 2 , t 0 + Δ ] , y , t 0 + Δ Δt0tf[t0,,tf][t0,t0+Δ/2,t0+Δ],y,t0+ΔΔ

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

Я не специалист по количественным показателям, поэтому выбор 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.

Спасибо вам всем. :)


3
Фундаментальная проблема заключается в том, что вы принудительно используете адаптивный метод, например, ode45()совершаете одинаковые шаги. Почему именно вы избегаете генерации «гигантского вектора»? Если вам абсолютно необходимы одинаковые точки, ode45()выполните обычную процедуру, а затем используйте интерполяцию.
JM

Хм ... это может быть проблемой. Источником этих фиксированных шагов было то, что где-то мне нужно было повторно нормализовать количество частиц, прежде чем они все распадутся. Но, может быть, я могу сделать это, поместив нормализацию в odefun и используя «гигантский вектор времени». Кроме того, вход в ode45 составляет 4 * 129 * 129 чисел. Я боялся, что если не буду использовать временные шаги, мне не хватит памяти. y

Если память служит, должна быть опция ode45(), которая позволит вам сохранить шаги больше определенного порога; Вы могли бы хотеть изучить это.
JM

1
Ответ просто использовать локальную оценку ошибки. Существует один встроенный в ODE45, так что проще всего это использовать, но вы можете альтернативно кодировать свой собственный.
Дэвид Кетчон

1
В ответе на следующий вопрос выясняется, что - это размерная величина с размерами . Может быть, более согласованные результаты получаются с где - шаг по времени? 1 / время α0.11/timeΔtαΔt(NtN0)Δt
Стефано М

Ответы:


4

Поскольку вы не опубликовали свой код MATLAB, я не уверен, как вы звоните ode45. Я предполагаю, что вы меняете вектор tspan (второй аргумент) при каждом вызове на ode45. Первое, что нужно понять, это то, что вектор tspan (почти) не влияет на временной шаг, используемый ode45. Вектор tspan просто позволяет передать в ode45 временной интервал интегрирования и время, в которое вы хотите получить результат. Шаг по времени, используемый алгоритмом Рунга-Кутты в ode45, регулируется внутри для достижения заданной точности. Двумя параметрами, которые контролируют эту точность, являются RelTol и AbsTol в структуре опций, передаваемой в ode45. Они имеют разумные значения по умолчанию, и, поскольку вы не упомянули их, я предполагаю, что вы их не меняли.

Я сказал «почти», не влияя на нормальный шаг времени ode45. Если вы запрашиваете вывод с интервалами времени, очень маленькими по отношению к временному шагу, который ode45 в противном случае предпримет, то ему придется сократить временной шаг, чтобы удовлетворить ваш запрос на вывод. Я полагаю, что это то, что предполагает JM. Зачем вам нужно решение при столь большом количестве выходных данных? Обычно достаточно просто запросить вывод в достаточное время, чтобы сгенерировать плавный график.

Что касается изменения в решении, которое вы видите, возможно, значения по умолчанию RelTol и AbsTol не подходят для вашей проблемы. Я предлагаю заменить ваш цикл на ode45 одним вызовом, запросить вывод несколько раз и поэкспериментировать с меньшими значениями RelTol и AbsTol, пока не получите конвергентное решение.


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

2

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

Если в итоге вы получите состояние , то легко проверить, действительно ли это стационарное состояние: если эволюция времени задается как затем Если вы действительно получите разные стационарные состояния, вы можете сравнить их энергии Гиббса где - плотность энергии. Когда , часто выглядит довольно просто, например, для уравнений Гинзбурга-Ландау, .d ψψ0F(ψ0)=0.G(ψ)=ΩE(ψ)E()F(ψ)=0E(ψ)E(ψ)=-| ψ| 4

dψdt=F(ψ),
F(ψ0)=0.
G(ψ)=ΩE(ψ)
E()F(ψ)=0E(ψ)E(ψ)=|ψ|4

Да. Я строю профиль плотности моего выходного решения, и когда он не меняется в течение длительного времени, в основном перестает развиваться, я предполагаю, что достиг стационарного состояния. Но я не уверен, что анализ плотности энергии может помочь, поскольку волновая функция представляет собой спинор с (+2, +1, -1, -2) спиновыми компонентами. Я не думаю, что объединение каждого компонента скажет мне энергию конденсата, но когда я доберусь до основного состояния, плотность энергии должна быть стационарной и, следовательно, постоянной во времени, это ключ к правильному решению.

1

Проблема решена:

Нормализация должна быть частью функции, оцениваемой в ODE. Разбиение ODE на многие этапы и нормализация между ними вызывает, казалось бы, числовую нестабильность и дает разные результаты в зависимости от временных интервалов, на которые разбит ODE. (См. Редактирование 2 в вопросе для более подробной информации.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.