- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用高斯包通过 Trotter-Suzuki 公式和快速傅里叶变换 (FFT) 研究遇到方形障碍时的传输概率,就像所做的一样 in this Quantum Python article .但我需要用C来实现它。原则上,波函数在与方形障碍物碰撞之前将保持其形状。但我发现波函数在与方形屏障碰撞之前随时间急剧变平。有人在以下代码中发现问题吗?
在这里,创建了两个文件 - result 和 psi.txt 来存储初始波函数和演化波函数。每个数据的前两个数据是 x
坐标,即 x
处波函数的概率。文件 result 中每行的第三个数据是方形障碍分布。我使用的 FFT 显示为 in this C program .
#include <stdio.h>
#include <math.h>
#define h_bar 1.0
#define pi 3.1415926535897932385E0
#define m0 1.0
typedef double real;
typedef struct { real Re; real Im; } complex;
extern void fft(complex x[], int N, int flag);
complex complex_product(complex x, real y_power, real y_scale)
{//x*exp(i*y_power)*y_scale
real Re, Im;
Re = (x.Re*cos(y_power)-x.Im*sin(y_power))*y_scale;
Im = (x.Re*sin(y_power)+x.Im*cos(y_power))*y_scale;
x.Re = Re; x.Im = Im;
return x;
}
real potential(real x, real a)
{
return (x<0 || x>=a) ? 0 : 1;
}
void main()
{
int t_steps=20, i, N=pow(2,10), m, n;
complex psi[N];
real x0=-2, p0=1, k0=p0/h_bar, x[N], k[N], V[N];
real sigma=0.5, a=0.1, x_lower=-5, x_upper=5;
real dt=1, dx=(x_upper-x_lower)/N, dk=2*pi/(dx*N);
FILE *file;
file = fopen("result", "w");
//initialize
for (n=0; n<N; n++)
{
x[n] = x_lower+n*dx;
k[n] = k0+(n-N*0.5)*dk;
V[n] = potential(x[n], a);
psi[n].Re = exp(-pow((x[n]-x0)/sigma, 2)/2)*cos(p0*(x[n]-x0)/h_bar);
psi[n].Im = exp(-pow((x[n]-x0)/sigma, 2)/2)*sin(p0*(x[n]-x0)/h_bar);
}
for (m=0; m<N; m++)
fprintf(file, "%g %g %g\n", x[m], psi[m].Re*psi[m].Re+psi[m].Im*psi[m].Im, V[m]);
fclose(file);
for (i=0; i<t_steps; i++)
{
printf("t_steps=%d\n", i);
for (n=0; n<N; n++)
{
psi[n]=complex_product(psi[n], -V[n]*dt/h_bar, 1);
psi[n]=complex_product(psi[n], -k[0]*x[n], dx/sqrt(2*pi));//x--->x_mod
}
fft(psi, N, 1);//psi: x_mod--->k_mod
for (m=0; m<N; m++)
{
psi[m]=complex_product(psi[m], -m*dk*x[0], 1);//k_mod--->k
psi[m]=complex_product(psi[m], -h_bar*k[m]*k[m]*dt/(2*m0), 1./N);
psi[m]=complex_product(psi[m], m*dk*x[0], 1);//k--->k_mod
}
fft(psi, N, -1);
for (n=0; n<N; n++)
psi[n] = complex_product(psi[n], k[0]*x[n], sqrt(2*pi)/dx);//x_mod--->x
}
file = fopen("psi.txt", "w");
for (m=0; m<N; m++)
fprintf(file, "%g %g 0\n", x[m], pow((psi[m]).Re, 2)+pow((psi[m]).Im, 2));
fclose(file);
}
我使用以下 Python 代码绘制初始和最终演化波函数:
call: `>>> python plot.py result psi.txt`
import matplotlib.pyplot as plt
from sys import argv
for filename in argv[1:]:
print filename
f = open(filename, 'r')
lines = [line.strip(" \n").split(" ") for line in f]
x = [float(line[0]) for line in lines]
y = [float(line[2]) for line in lines]
psi = [float(line[1]) for line in lines]
print "x=%g, max=%g" % (x[psi.index(max(psi))], max(psi))
plt.plot(x, y, x, psi)
#plt.xlim([-1.0e-10, 1.0e-10])
plt.ylim([0, 3])
plt.show()
最佳答案
你的代码几乎是正确的,除了你缺少真实域中的初始/最后半步和一些不必要的操作(kmod -> k and back),但是主要问题是您的初始条件确实选择不当。高斯波包的时间演化导致不确定性随时间呈二次方分布:
根据您选择的粒子质量和初始波包宽度,大括号中的项等于 1 + 4 t2。在一个时间步之后,波包已经比最初宽得多,而在另一个时间步之后变得比整个模拟盒更宽。使用 FFT 所隐含的周期性会导致空间和频率混叠,再加上过大的时间步长,这就是最终波函数看起来那么奇怪的原因。
我建议您尝试准确复制 Python 程序的条件,包括整个系统处于深势阱中的事实 (Vborder -> +oo)。
关于c - C语言方形障碍数值模拟中如何使高斯包移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33450123/
我正在尝试从标准输入中获取一行。据我所知,我们永远不应该使用gets的手册页中所说的gets: Never use gets(). Because it is impossible to tell w
很多问题SO和文章/书籍,例如https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.201
我认为 Coffeescript 是一门很棒的语言!我正在寻找一些将静态分析添加到 Coffeescript 的项目/问题/功能。然而,经过一番搜索后,我发现 Coffeescript faq和 th
以下查询返回过去 12 个月(针对特定客户)每周的订单总量: SELECT DATEPART(year, orderDate) AS [year], DATEPART(month, or
我觉得这可能是一个错误,任何人都可以重现或看到我做事方式的一些错误。 我正在尝试将 GKPolygonObstacle 添加到 iOS 或 macOS Playground 中的 GKMeshGrap
我的 SKSpriteKit 应用程序中有一个单独的“Floor”类。当我第一次创建这个类时,我使用 在整个框架周围设置了一个屏障 self.physicsBody = SKPhysicsBody(e
我有我正在尝试建模的半连续数据(许多精确的零和连续的正结果)。我从 Zuur 和 Ieno 的 R 中零膨胀模型初学者指南中学到了大量关于零质量的建模数据,它区分了零膨胀 Gamma 模型和他们所描述
以下代码实现了一些无锁(且无原子!)的线程间通信,这些通信需要使用存储和加载内存屏障,但是C++ 11 release-acquire语义不适当,也不保证正确性。实际上,该算法暴露了对发布获取语义的某
我指的是在 https://developer.android.com/training/constraint-layout/index.html#constrain-to-a-barrier 上使用
我正在一个非常好的 IBM x 服务器(4 个 8 核 CPU)上运行一些模拟应用程序的 x64 版本。操作系统是 Linux - redhat 5.6 x64 内核。因此,此应用恰好在需要超过 2
我是一名优秀的程序员,十分优秀!