嘿,谢谢你抽出时间来看看我的问题。这是我之前在physics.stackexchange.com 上发布的问题的更新版本
我目前正在研究 2D 激子旋量 Bose-Einstein Condensate,并对这个系统的基态感到好奇。到达基态的数学方法称为虚时间法。
该方法非常简单,将量子力学中的时间替换为虚数 这种替换导致我系统中的高能粒子比低能粒子衰减得更快。在计算的每一步重新归一化粒子数量,我们最终得到了一个能量最低的粒子系统,也就是。基态。
所讨论的方程是非线性的,称为非线性薛定谔方程,有时称为Gross-Pitaevskii 方程。为了解决这个问题,我使用了 Matlabs ode45,它使系统及时向前发展并最终达到基态。
- 笔记!非线性薛定谔方程包括空间中的拉普拉斯和其他一些微分项。这些都是使用快速傅里叶变换解决的。最后我们只有一个时间 ODE。*
我的问题和疑问:计算从到。ode45 被放入一个for循环中,因此它不会同时计算一个巨大的向量。第一轮将从 ode45(odefun, ) 开始,然后下一次从开始。这里时间步长是我的问题。时间步长的不同选择给了我不同的基态解决方案,我不知道如何确定哪个时间步长给了我“最”正确的基态!
我的尝试:我意识到在这个方案中,大时间步长会导致大量粒子在重新归一化为原始粒子数之前衰减,而小时间步长会导致更少量的粒子在重新归一化之前衰减。我最初的想法是小时间步长应该提供更准确的解决方案,但似乎恰恰相反。
我不是数字专家,所以选择 ode45 只是随意的。ode113 给了我同样的东西。:(
有没有人对这个问题有任何想法。让我知道是否需要任何额外的细节。
谢谢你。
更新 1: 我一直在研究虚时间方法和 ODE。似乎如果时间步长不够小,整个事情就会变得不稳定。这让我想知道我的非线性方程是否僵硬,这使我理解的事情变得更加困难。我会及时通知你的。
更新 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 中使用皮秒或纳秒作为时间步长的一些差异。
谢谢你们。:)