基于Python的2D FDTD算法高斯脉冲生成时间步长匹配问题
问题分析与解决方案
你遇到的核心问题有三个:
- 空间与时间变量混淆:
beam_center是空间坐标(单位:米),但t是时间变量(单位:秒),直接将两者相减会得到一个极大的差值,导致指数部分趋近于0,最终exp(0)=1,所以输出是水平直线。 - 高斯函数公式错误:你写的
-((t-beam_center)**2)/2*beam_waist**2等价于-((t-beam_center)**2 * beam_waist**2)/2,这和标准高斯脉冲的时间域公式exp(-((t-t0)**2)/(2*tau**2))不符,括号位置错误导致缩放完全偏离。 - 时间尺度与脉冲宽度不匹配:当前时间序列的总时长
total_time=5000*delta_t=5e-14秒,而用beam_waist=200e-9米直接作为时间尺度的话,对应的时间宽度远小于当前时间序列的范围,即使公式正确,也可能看不到脉冲变化。
修正后的代码
import numpy as np import matplotlib.pyplot as plt import math delta_x = 6e-9 Nx = 500 s=2 epsilon_0 = 8.85e-12 mu_0 = 4*math.pi*1e-7 c = 1/math.sqrt(epsilon_0*mu_0) eta_0 = math.sqrt(mu_0/epsilon_0) # 计算时间步长与总时长 delta_z = delta_x delta_t = delta_z/(s*c) total_time = 5000 * delta_t # 生成时间序列(保留原代码的时间序列,不修改) t = np.arange(0, total_time, delta_t) # 1. 设置时间中心(取时间序列的中间位置,对应FDTD中的脉冲发射时机) t0 = total_time / 2 # 2. 设置脉冲的时间宽度:可以用若干个时间步长,或者从空间束腰转换为时间宽度 # 这里用空间束腰转换:tau = beam_waist / c,同时乘以一个系数调整脉冲宽度 beam_waist = 200e-9 tau = beam_waist / c * 10 # 乘以10让脉冲在当前时间序列中更明显 # 3. 修正高斯脉冲公式:注意括号位置,确保分母是2*tau² gaussian_pulse = np.exp(-((t - t0)**2) / (2 * tau**2)) # 绘图 plt.plot(t, gaussian_pulse) plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Corrected Gaussian Pulse for FDTD') plt.show()
关键修改说明
- 替换
beam_center为时间中心t0:用时间序列的中间值作为脉冲峰值的时间点,符合FDTD中脉冲发射的常规设置。 - 修正高斯函数的括号:将
/2*beam_waist**2改为/(2 * tau**2),符合标准高斯分布的形式。 - 匹配时间尺度:将空间束腰转换为时间宽度
tau=beam_waist/c,并乘以系数调整,确保脉冲在当前的时间序列范围内有明显的幅值变化。
这样修改后,不需要改动原有的时间序列t,就能生成正常的高斯脉冲,完美适配你的FDTD代码框架。
内容的提问来源于stack exchange,提问作者Anusha Rehman
相关产品推荐
相关产品推荐

