% 设置参数(有些参数是看资料直接取的,老师有要求的话,可以直接改)
num_particles = 1000; % 粒子数量
num_steps_particles = 1000; % 粒子的时间步数
time_step_particles = 0.01; % 粒子的时间步长
diffusion_coefficient = 1.0; % 扩散系数()
damping_coefficient = 0.1; % 阻尼系数
collision_mean_free_path = 0.1; % 碰撞平均自由程
% 初始化粒子位置
x = zeros(num_particles, 1);
y = zeros(num_particles, 1);
% 创建绘图窗口
figure;
xlim([-50, 50]);
ylim([-50, 50]);
xlabel('X');
ylabel('Y');
title('Brownian Motion Simulation');
% 模拟粒子运动(循环更新粒子过程,相当于可视化)
for step = 1:num_steps_particles
% 计算位移(根据维纳过程的性质生成的随机位移,将其缩放到合适的大小,以模拟扩散过程,我用的是正态分布过程来模拟随机)
displacement_x = sqrt(2 * diffusion_coefficient * time_step_particles) * randn(num_particles, 1) ...
- damping_coefficient * x * time_step_particles ...
+ collision_mean_free_path * randn(num_particles, 1);
displacement_y = sqrt(2 * diffusion_coefficient * time_step_particles) * randn(num_particles, 1) ...
- damping_coefficient * y * time_step_particles ...
+ collision_mean_free_path * randn(num_particles, 1);
% 更新位置
x = x + displacement_x;
y = y + displacement_y;
% 绘制粒子位置
scatter(x, y, 5, 'b', 'filled');
xlim([-50, 50]);
ylim([-50, 50]);
title(['Brownian Motion Simulation (Step ', num2str(step), ' / ', num2str(num_steps_particles), ')']);
xlabel('X');
ylabel('Y');
drawnow;
end
% 记录开始时间
tic;
% 生成布朗运动轨迹(然后这里就是验证部分,用随机运动的曲线和爱因斯坦方程拟合)
num_trajs = 100; % 轨迹数
num_steps = 1000; % 时间步数
trajs = zeros(num_trajs, num_steps+1);
for i = 1:num_trajs
steps = sqrt(2 * diffusion_coefficient * time_step_particles) * randn(1, num_steps);
trajs(i, :) = [0 cumsum(steps)];
end
% 计算总运行时间
total_time = toc;
% 输出总运行时间(记录程序运行时间,上面的可视化没有包含在内)
disp(['Total simulation time: ', num2str(total_time), ' seconds']);
% 计算平均位移的平方
mean_square_displacement = mean(trajs.^2, 1);
% 拟合直线
t = time_step_particles * (0:num_steps);
p = polyfit(t, mean_square_displacement, 1);
% 绘图
plot(t, mean_square_displacement, 'o', t, p(1)*t + p(2), '-');
xlabel('时间');
ylabel('平均位移的平方');
legend('布朗运动', '拟合直线');
运行可视化截图(动态)