You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何求解对应最大允许停止距离的粒子捕获初始速度

解决方法

要获取符合停止距离要求的最大初始速度,核心是同时跟踪每个初始速度对应的停止距离,而非仅收集符合条件的距离值。你的现有代码存在几个关键问题:

  1. 仅模拟了单个初始速度(v[0]=800),未遍历多个初始速度;
  2. 将循环索引a作为速度传入F(v=a),属于逻辑错误;
  3. 收集了轨迹中所有符合条件的位置值,而非每个初始速度对应的最终停止距离;
  4. 速度更新公式错误地乘以了位置值,导致运动模拟偏差。

以下是修正后的完整代码,包含多初始速度遍历、停止距离计算和对应速度提取:

import numpy as np
from scipy.integrate import odeint

# 常量参数
m_Rb = 1.443e-25  # 铷87质量
hbar = 1.05e-34
L = 38.116e6  # 自发衰变率
epsilon_0 = 8.85418782e-12

# 可变参数
lmbda = 700e-9  # 激光波长
k = (2 * np.pi) / lmbda  # 波矢
length = 5e-2  # MOT长度限制
I_sat = 1  # 饱和光强
n0 = 1  # 介质折射率
# 修正:电场振幅计算需开平方,原代码遗漏此步骤
E_0 = np.sqrt((2 * I_sat) / (3e8 * n0 * epsilon_0))
Rabi = (E_0 / hbar) * (4.2275 * 1.6e-19 * 0.529e-10)

delta_omega = np.array([-20e6, -15e6, -10e6, -5e6])
n = 20

# 计算散射力:输入当前速度v,返回稳态下的力
def F(v):
    R_i = []
    for delta_omega_i in delta_omega:
        delta = delta_omega_i + k * v
        R_scat = L/2 * (Rabi**2/2) / (delta**2 + (Rabi**2/2) + (L**2/4))
        R_i.append(R_scat)
    R = np.sum(R_i)
    R_total = (L * R) / (2 * R + L)
    
    def dXdt(t, X):
        G, E = X
        dGdt = E*(L + R_total) - G*R_total
        dEdt = G*R_total - E*(L + R_total)
        return [dGdt, dEdt]
    
    # 积分到稳态(t=5远大于系统时间常数)
    t = np.linspace(0, 5, n)
    solve = odeint(dXdt, [1, 0], t, tfirst=True)
    G = solve.T[0]
    E = solve.T[1]
    force = hbar * k * (G - E) * R_total
    return force[-1]  # 返回稳态力

# 计算单个初始速度的停止距离:若超过length则返回None
def compute_stopping_distance(v0, max_length, dt=1e-5):
    x = 0.0
    v = v0
    # 模拟直到速度趋近于0或位置超过限制
    while abs(v) > 1e-3 and abs(x) <= max_length:
        force = F(v)
        acceleration = force / m_Rb
        v += acceleration * dt
        x += v * dt
    return abs(x) if abs(x) <= max_length else None

# 遍历初始速度范围(可根据实际情况调整上下限)
initial_velocities = np.linspace(0, 1000, 100)
valid_vd_pairs = []

for v0 in initial_velocities:
    d = compute_stopping_distance(v0, length)
    if d is not None:
        valid_vd_pairs.append( (v0, d) )

# 找到最大停止距离对应的初始速度
if valid_vd_pairs:
    max_pair = max(valid_vd_pairs, key=lambda item: item[1])
    max_v0, max_d = max_pair
    print(f"符合要求的最大初始速度: {max_v0:.2f} m/s")
    print(f"对应的停止距离: {max_d:.6f} m")
else:
    print("没有找到符合长度限制的初始速度")

关键修正说明:

  1. 力函数修正:补全电场振幅计算的平方根步骤,修正Rabi频率错误;返回稳态下的力而非整个时间序列,提升计算效率。
  2. 运动方程修正:移除速度更新中多余的位置乘积项,还原正确的加速度积分逻辑。
  3. 停止距离计算:新增专用函数,针对单个初始速度模拟运动至停止或超出长度,返回最终停止距离。
  4. 多初始速度遍历:生成初始速度范围,逐个计算停止距离并收集符合条件的(初始速度,停止距离)对。
  5. 目标值提取:通过max函数结合自定义排序键,直接定位停止距离最大的条目及其对应的初始速度。

内容的提问来源于stack exchange,提问作者Rainydays123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:40:52