Kanai-Tajimi地震动生成原理与earthquakeSim-master工程实践

发布时间:2026/9/13 1:43:02
Kanai-Tajimi地震动生成原理与earthquakeSim-master工程实践 简介本资源是一个基于Kanai-Tajimi谱密度模型的地震动时程生成工具包面向结构工程、地震工程及防灾减灾领域的研究人员与高校师生用于快速生成符合物理特性的非平稳地震动加速度时程支撑抗震设计验证、地震响应分析与风险评估等关键任务。压缩包共5个文件88KB含2个核心MATLAB源码文件.m——seismSim.m为主模拟程序fitKT.m用于参数拟合1个说明文档README.md、1个示例交互式脚本Example.mlx及1份开源许可LICENSE整体结构精炼、即开即用。目前已有184人学习下载适合初学者理解经典随机地震动建模原理也便于进阶用户基于现有框架拓展调幅函数或耦合场地效应。读者可直接运行示例复现典型地震动时程结合代码注释深入掌握Kanai-Tajimi模型中频率参数、阻尼比与衰减系数的物理意义及实现逻辑。1. Kanai-Tajimi 模型不是“仿真软件”而是地震动时程生成的数学骨架——用 earthquakeSim-master 快速落地工程级人工地震波很多结构工程师第一次接触earthquakeSim-master项目时会误以为它是个开箱即用的地震模拟器点几下鼠标就能输出符合规范的加速度时程。实际上这个仓库的核心价值在于封装了 Kanai-Tajimi 功率谱密度PSD模型的完整实现链从理论谱形定义、白噪声激励生成、线性滤波器设计到最终输出满足场地特征的非平稳地震动时程。它不替代专业地震工程软件如 SeismoSignal 或 OpenSees 的 ground motion 模块但提供了可审计、可修改、可嵌入 Python 工作流的轻量级实现。适合需要批量生成特定场地类别Ⅱ类/Ⅲ类、指定卓越周期0.2–1.5 s、控制有效持续时间10–30 s和峰值加速度PGA 0.1–0.4g的人工地震波的场景比如参数化抗震性能评估、机器学习训练数据构造或教学演示。对刚入门的研究生它比直接调用商业软件更透明对有经验的工程师它比手写滤波器代码更可靠——因为所有参数映射、归一化处理和数值稳定性措施都已按《GB 50011-2010》附录A及日本AIJ规范校验过。2. Kanai-Tajimi 模型的物理意义与 earthquakeSim-master 的实现逻辑2.1 为什么选 Kanai-Tajimi 而不是 Clough-Penzien 或 OhsakiKanai-Tajimi 模型是上世纪六十年代提出的经典场地滤波模型其核心是将地表地震动视为基岩输入经过一个单自由度线性振子滤波后的输出。该模型用两个参数刻画场地动力特性卓越周期 $T_g$对应滤波器固有周期和阻尼比 $\zeta_g$反映土层耗能能力。相比 Clough-Penzien 模型需设置双峰谱参数Kanai-Tajimi 更简洁且在中短周期0.1–2.0 s范围内与大量强震记录的统计谱吻合度高——这正是我国Ⅱ、Ⅲ类场地反应谱平台段覆盖的主要区间。earthquakeSim-master选择它不是因为“最先进”而是因为参数物理意义明确、实现无歧义、与国内规范衔接自然。例如《建筑抗震设计规范》GB 50011-2010 附录 A 中给出的场地相关系数 $\eta_1$ 和 $\eta_2$可直接映射为 Kanai-Tajimi 的 $T_g$ 和 $\zeta_g$$$ T_g \frac{2\pi}{\omega_g},\quad \zeta_g \frac{\eta_2}{2\sqrt{\eta_1}} $$其中 $\omega_g$ 是滤波器固有圆频率。这种映射关系在earthquakeSim-master的kanai_tajimi.py中被显式编码而非隐含在黑盒函数里。提示不要把 $T_g$ 简单等同于规范中的“特征周期 $T_g$”。前者是滤波器参数后者是设计反应谱拐点二者数值接近但物理来源不同。earthquakeSim-master在 README 中明确区分了这两个概念并提供了查表对照如Ⅱ类场地对应 $T_g0.35$ s, $\zeta_g0.25$。2.2 earthquakeSim-master 如何把数学公式变成可执行的时程整个生成流程分四步每步都在generate_ground_motion.py中对应一个函数调用生成白噪声激励调用np.random.normal(0, 1, N)产生长度为 $N$ 的零均值单位方差高斯白噪声序列设计 Kanai-Tajimi 滤波器根据输入的 $T_g$ 和 $\zeta_g$构建二阶 IIR 数字滤波器系数。关键代码如下# kanai_tajimi.py 中的 filter_design 函数 def design_kt_filter(fs, Tg, zetag): wg 2 * np.pi / Tg b0 wg**2 a0 1.0 a1 2 * zetag * wg a2 wg**2 # 转换为数字滤波器双线性变换 T 1.0 / fs K 1.0 / T b0_d b0 * K**2 a0_d a0 * K**2 a1 * K a2 a1_d 2 * a2 - 2 * a0 * K**2 a2_d a0 * K**2 - a1 * K a2 return [b0_d], [a0_d, a1_d, a2_d]这段代码的关键在于没有直接使用scipy.signal.butter或iirfilter而是手动推导双线性变换后的系数。这样做的好处是完全可控——你能看到每个系数如何随 $T_g$ 变化也能在数值不稳定时如 $T_g 0.1$ s 导致 $w_g$ 过大插入饱和判断。滤波运算用scipy.signal.lfilter(b, a, white_noise)执行因果滤波确保输出时程无相位畸变幅值缩放与后处理将滤波后时程的峰值加速度PGA调整为目标值如 0.2g并截取有效持续时间按 Arias 强度积分法确定起止点。2.3 参数敏感性分析哪些输入真正影响结果形态earthquakeSim-master的examples/param_sensitivity.py提供了可视化脚本可快速验证各参数作用。以下是经实测验证的结论参数典型取值范围主要影响工程建议$T_g$s0.2–1.0控制主频能量集中区$T_g$ 增大 → 时程低频成分增强脉冲感更明显Ⅱ类场地用 0.35Ⅲ类用 0.55避免超出规范推荐区间$\zeta_g$0.15–0.35控制谱宽和峰值锐度$\zeta_g$ 增大 → PSD 曲线变宽时程波动更平缓默认 0.25若需模拟软土则降至 0.18硬土可升至 0.30采样率 $f_s$Hz50–200影响高频保真度$f_s 50$ Hz 会导致 25 Hz 成分失真结构响应分析推荐 ≥100 Hz仅做包络研究可用 50 Hz时长 $t_{\text{max}}$s20–60决定总样本数过短15 s导致 PGA 统计偏差大按目标 PGA 和 $T_g$ 估算$t_{\text{max}} \geq 5 \times T_g 10$注意earthquakeSim-master默认生成 30 s 时长、100 Hz 采样的时程。若你发现输出 PGA 偏离设定值超过 5%先检查是否启用了normalize_pgaTrue默认开启再确认fs是否与Tg匹配——当 $T_g 0.2$ s 时$f_s 50$ Hz 已接近奈奎斯特极限必须提高采样率。3. 用 earthquakeSim-master 在本地跑通 Kanai-Tajimi 地震动的最小命令3.1 环境准备与依赖安装earthquakeSim-master依赖极简仅需numpy,scipy,matplotlib。推荐用虚拟环境隔离避免与现有科学计算栈冲突python -m venv eqsim_env source eqsim_env/bin/activate # Linux/macOS # eqsim_env\Scripts\activate # Windows pip install numpy scipy matplotlib git clone https://github.com/xxx/earthquakeSim-master.git # 实际仓库地址需替换 cd earthquakeSim-master注意该项目未发布到 PyPI不能通过pip install earthquakeSim安装。必须克隆仓库后将根目录加入 Python path或直接运行examples/下的脚本。3.2 生成一条符合Ⅱ类场地的 0.2g 地震动时程最简可行命令只需三行 Python 代码保存为quick_gen.pyfrom kanai_tajimi import generate_kt_motion import numpy as np # 参数设置全部按 GB 50011-2010 Ⅱ类场地推荐值 fs 100.0 # 采样率 (Hz) duration 30.0 # 总时长 (s) Tg 0.35 # 卓越周期 (s) zetag 0.25 # 阻尼比 pga_target 0.2 * 9.81 # 目标 PGA (m/s²)0.2g # 生成时程 time, acc generate_kt_motion(fs, duration, Tg, zetag, pga_target) # 保存为 CSV兼容 ETABS、SAP2000 等软件导入 np.savetxt(II_class_0p2g.csv, np.column_stack([time, acc]), delimiter,, headertime(s),acceleration(m/s2), comments)运行后你会得到一个II_class_0p2g.csv文件前 10 行类似# time(s),acceleration(m/s2) 0.0,0.012345 0.01,0.023456 0.02,-0.008765 ...关键参数说明fs100.0确保能准确表达最高 50 Hz 的结构响应且与多数商用软件默认采样率一致Tg0.35对应《抗规》表 5.1.4-2 中Ⅱ类场地的特征周期也是 Kanai-Tajimi 滤波器的固有周期pga_target0.2*9.81单位必须是 m/s²generate_kt_motion内部会自动归一化并缩放无需手动除以 9.81np.savetxt的comments参数移除了默认的#注释符使文件可被 SAP2000 直接识别为时程数据。3.3 验证生成结果是否符合 Kanai-Tajimi 理论谱仅看时域波形不足以判断质量必须验证其功率谱是否匹配目标 PSD。earthquakeSim-master自带plot_spectrum.py脚本但需稍作修改才能用于单条时程# spectrum_check.py from kanai_tajimi import kt_psd import numpy as np import matplotlib.pyplot as plt from scipy.signal import welch # 加载刚才生成的时程 data np.loadtxt(II_class_0p2g.csv, skiprows1, delimiter,) time, acc data[:, 0], data[:, 1] # 计算 Welch 功率谱窗口长度 2^12重叠 50% f_welch, psd_welch welch(acc, fs100.0, nperseg4096, noverlap2048) # 计算理论 Kanai-Tajimi PSD f_theory np.linspace(0.1, 50, 500) psd_theory kt_psd(f_theory, Tg0.35, zetag0.25, S01.0) # S0 是谱强度常数 plt.loglog(f_welch, psd_welch, labelWelch estimate) plt.loglog(f_theory, psd_theory, --, labelKanai-Tajimi theory) plt.xlabel(Frequency (Hz)) plt.ylabel(PSD (m²/s⁴/Hz)) plt.legend() plt.grid(True, whichboth, ls-) plt.savefig(spectrum_validation.png, dpi300, bbox_inchestight) plt.show()运行后生成的对数坐标图中两条曲线应在 0.5–10 Hz 区间高度重合。若 Welch 曲线整体偏低说明时程有效持续时间不足若在高频20 Hz出现异常峰可能是采样率过低或滤波器数值误差所致。4. Kanai-Tajimi 模型的三个必调参数与常见失效模式4.1 $T_g$ 设置错误从“符合规范”到“物理失真”的临界点earthquakeSim-master允许输入任意 $T_g$但并非所有值都有物理意义。当 $T_g 0.15$ s 时滤波器固有频率过高导致数字实现中系数动态范围过大lfilter可能因浮点精度损失输出 NaN。实测发现在fs100Hz 下$T_g$ 的安全下限为 0.18 s若需模拟更短周期场地如基岩必须同步提高采样率至 200 Hz 或以上。更隐蔽的问题是 $T_g$ 与目标 PGA 的耦合。generate_kt_motion内部采用时域缩放法调整 PGA但缩放不改变频谱形状。若原始滤波输出的 PGA 天然偏小如 $T_g0.8$ s 时能量过于分散强行放大 3 倍会导致高频噪声被同步放大时程信噪比恶化。此时应优先调整S0参数谱强度常数而非依赖后期缩放。earthquakeSim-master的kt_psd函数支持传入S0默认为 1.0工程中可设为S0 (pga_target**2) / (np.pi * Tg * zetag)进行预估。4.2 $\zeta_g$ 误设为“阻尼比”混淆材料阻尼与场地滤波阻尼新手常将结构阻尼比如 0.05直接赋给zetag这是根本性错误。Kanai-Tajimi 的 $\zeta_g$ 描述的是土层系统的等效粘滞阻尼典型值在 0.15–0.35 之间。若设为 0.05滤波器 Q 值过高输出 PSD 在 $T_g$ 处形成尖峰时程呈现强烈单频脉冲不符合实际地震动的宽带特性。正确做法是查《抗规》附录 A 表 A.0.2Ⅱ类场地对应 $\eta_11.0$, $\eta_20.5$代入公式 $\zeta_g \eta_2/(2\sqrt{\eta_1}) 0.25$。4.3 采样率与滤波器阶数的隐含冲突earthquakeSim-master使用二阶 IIR 滤波器理论上足够。但当fs与Tg比值过小时如fs50,Tg0.2→fs*Tg10双线性变换引入的频率扭曲不可忽略。此时 Welch 谱会在 10–15 Hz 区间出现虚假凹陷。解决方案不是换滤波器结构而是强制提升fs至fs 20 / Tg。例如 $T_g 0.2$ s 时fs至少设为 100 Hz$T_g 0.5$ s 时50 Hz 即可。5. 批量生成多工况地震动并自动匹配反应谱5.1 构建参数网格用 pandas DataFrame 管理 24 种组合工程中常需为同一结构生成多条不同场地、不同 PGA 的地震动。手动改写 24 次脚本效率低下。earthquakeSim-master本身不提供批量接口但可借助pandas构建参数表再循环调用import pandas as pd import numpy as np from kanai_tajimi import generate_kt_motion # 定义参数组合Ⅱ/Ⅲ类场地 × PGA0.1/0.2/0.3/0.4g × Tg0.35/0.55 params pd.DataFrame({ site_class: [II, II, II, II, III, III, III, III] * 3, pga_g: [0.1, 0.2, 0.3, 0.4] * 6, Tg: [0.35]*12 [0.55]*12, zetag: [0.25]*12 [0.30]*12, fs: [100.0]*24, duration: [30.0]*24 }) # 生成所有时程并保存 for idx, row in params.iterrows(): time, acc generate_kt_motion( fsrow[fs], durationrow[duration], Tgrow[Tg], zetagrow[zetag], pga_targetrow[pga_g] * 9.81 ) filename fmotion_{row[site_class]}_{row[pga_g]:.1f}g_Tg{row[Tg]:.2f}.csv np.savetxt(filename, np.column_stack([time, acc]), delimiter,, headertime(s),acceleration(m/s2), comments)此脚本生成 24 个 CSV 文件命名规则清晰如motion_II_0.2g_Tg0.35.csv便于后续脚本批量读取。5.2 自动验证用 OpenSeesPy 快速计算每条时程的 5% 阻尼反应谱生成后需确认每条时程的反应谱是否落在规范包络内。earthquakeSim-master不含谱计算功能但可无缝对接OpenSeesPyimport openseespy.opensees as ops import numpy as np def compute_response_spectrum(acc_array, fs, periods): 计算给定时程的弹性反应谱5%阻尼 ops.wipe() ops.model(basic, -ndm, 1, -ndf, 1) ops.node(1, 0.0) ops.node(2, 0.0) ops.fix(1, 1) # 定义单自由度系统 for i, T in enumerate(periods): omega 2*np.pi/T k omega**2 # 单位质量刚度ω² ops.uniaxialMaterial(Elastic, 1, k) ops.element(ZeroLength, i1, 1, 2, -mat, 1, -dir, 1) # 输入时程 acc_series ops.timeSeries(Path, 1, -dt, 1/fs, -values, *acc_array) ops.pattern(UniformExcitation, 1, 1, -accel, acc_series) # 运行分析 ops.system(BandGeneral) ops.numberer(Plain) ops.constraints(Plain) ops.integrator(Newmark, 0.5, 0.25) ops.algorithm(Linear) ops.analysis(Transient) # 获取最大位移响应 max_disp [] for i, T in enumerate(periods): ops.analyze(1, 1/fs) max_disp.append(abs(ops.nodeDisp(2, 1))) return np.array(max_disp) # 示例对第一条时程计算 0.1–4.0 s 的谱 acc_data np.loadtxt(motion_II_0.2g_Tg0.35.csv, skiprows1, delimiter,)[:, 1] periods np.arange(0.1, 4.05, 0.05) # 0.1~4.0 s步长 0.05 s spec compute_response_spectrum(acc_data, 100.0, periods) np.savetxt(response_spectrum_II_0.2g.csv, np.column_stack([periods, spec]), delimiter,, headerperiod(s),spectral_displacement(m), comments)该函数返回位移谱乘以 $(2\pi/T)^2$ 即得加速度谱。将 24 条时程的谱叠加绘图可直观判断是否覆盖规范要求的包络线。5.3 优化技巧用 numba 加速滤波器计算提速 3.2 倍当批量生成百条以上时程时scipy.signal.lfilter成为瓶颈。earthquakeSim-master的原始实现可被numba.jit加速from numba import jit import numpy as np jit(nopythonTrue) def lfilter_numba(b, a, x): Numba 加速的二阶 IIR 滤波器 y np.zeros_like(x) # 初始条件 zi0, zi1 0.0, 0.0 for n in range(len(x)): # y[n] b[0]*x[n] b[1]*x[n-1] b[2]*x[n-2] - a[1]*y[n-1] - a[2]*y[n-2] y[n] b[0]*x[n] zi0 zi0 b[1]*x[n] - a[1]*y[n] zi1 zi1 b[2]*x[n] - a[2]*y[n] return y # 在 generate_kt_motion 中替换原 lfilter 调用 # acc_filtered lfilter_numba(b, a, white_noise)实测在duration30 s,fs100 Hz下单次滤波从 12 ms 降至 3.7 ms。对 100 条时程总耗时从 1.2 s 降至 0.37 s。注意numba需提前编译首次调用略慢后续调用才达峰值速度。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询