#analysis #beta #seismic #newmark

seismic-response

使用Newmark的β方法对单个粒子系统的地震响应进行分析。

4个版本 (2个破坏性更新)

0.3.0 2024年6月2日
0.2.1 2024年5月25日
0.2.0 2024年5月25日
0.1.0 2024年5月21日

#289 in 数学

Download history 358/week @ 2024-05-21 169/week @ 2024-05-28 29/week @ 2024-06-04 5/week @ 2024-06-11

每月下载量:187次

MIT/Apache

23KB
153

英语 | 日语

地震响应

使用Newmark的β方法,我们将对单自由度(SDOF)系统进行地震响应分析。从地震加速度波形中,我们可以确定响应位移、响应速度、响应加速度和绝对响应加速度。

要进行地震响应分析,您可以使用使用此crate的WASM版本实现的计算网站

用法

use csv::Reader;
use crate::{ResponseAccAnalyzer, ResponseAccAnalyzerParams};

fn example() {
    let mut csv = Reader::from_path("benches/seismic_acc_waveform.csv").unwrap();
    let data = csv.deserialize::<f64>().map(|x| x.unwrap()).collect::<Vec<_>>();

    let params = ResponseAccAnalyzerParams {
        // Natural period [ms]
        natural_period_ms: 500,
        // Time step of the input acceleration waveform [ms]
        dt_ms: 10,
        // Damping ratio
        damping_h: 0.05,
        // Newmark's β method parameter
        beta: 0.25,
        // Initial response displacement [m]
        init_x: 0.0,
        // Initial response velocity [m/s]
        init_v: 0.0,
        // Initial response acceleration [gal]
        init_a: 0.0,
        // Initial input acceleration [gal]
        init_xg: 0.0,
    };

    let analyzer = ResponseAccAnalyzer::from_params(params);

    let result: Result = analyzer.analyze(data);
    // struct Result {
    //     /// Response displacement [m]
    //     pub x: Vec<f64>,

    //     /// Response velocity [m/s]
    //     pub v: Vec<f64>,

    //     /// Response acceleration [gal]
    //     pub a: Vec<f64>,

    //     /// Absolute response acceleration [gal]
    //     pub abs_acc: Vec<f64>,
    // }
}

WebAssembly

该程序作为npm包发布。它可以像Rust crate一样使用。

数学公式

该程序基于以下公式实现

刚度系数

刚度系数(k)根据质量(m)和自然周期(T_{\text{ms}})以毫秒为单位计算

$$ k = \frac{4 \pi^2 m}{\left(\frac{T_{\text{ms}}}{1000}\right)^2} $$

阻尼系数

阻尼系数(c)根据阻尼比(h)、质量(m)和刚度系数(k)计算

$$ c = 2h\sqrt{km} $$

逐步计算

响应加速度

下一步的加速度(a_{n+1})计算如下

$$ a_{n+1} = \frac{p_{n+1} - c\left(v_n + \frac{\Delta t}{2}a_n\right) - k\left(x_n + \Delta t v_n + \left(\frac{1}{2} - \beta\right)\Delta t^2 a_n\right)}{m + \frac{\Delta t}{2}c + \beta \Delta t^2 k} $$

这里,外力(p_{n+1})给出为

$$ p_{n+1} = -xg_{n+1} m $$

响应速度

下一步的速度(v_{n+1})计算如下

$$ v_{n+1} = v_n + \frac{\Delta t}{2}(a_n + a_{n+1}) $$

响应位移

下一步的位移(x_{n+1})计算如下

$$ x_{n+1} = x_n + \Delta t v_n + \left(\frac{1}{2} - \beta\right) \Delta t^2 a_n + \beta \Delta t^2 a_{n+1} $$

绝对响应加速度

最终的绝对响应加速度(a_{\text{abs}})计算如下

$$ a_{\text{abs}} = a + xg $$

这些是程序中实现的主要计算。

注意:虽然这里公式将质量(m)视为变量,但实际上程序计算时假设质量为1。这是因为质量不影响绝对响应加速度。这可以在文档中的测试代码中得到证实。

许可协议

以下任一许可协议下获得许可

(文档注释和 README 文件翻译由 DeepL 和 ChatGPT 提供。)

依赖项

~1.1–2MB
~38K SLoC