Newmark方法和中心差分法求解单自由度时程曲线

该博客首先展示如何利用地震波数据绘制反应谱,接着针对周期为1s的结构,依据加速度反应谱值调整地震加速度。之后,运用Newmark方法和中心差分法计算得出结构的位移、速度时程曲线以及加速度反应谱。
摘要由CSDN通过智能技术生成

 首先通过地震波绘制反应谱,随后根据周期为1s时的加速度反应谱值对地震加速度进行调幅,随后进行计算得到结构的位移时程曲线,速度时程曲线以及加速度反应谱

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
# ---------------------中心差分法----------------------- #
def Central_difference_method_displacenment( acceleration_g: list,time:list,step):
    length_t = len(time)
    displacement = [0.000] * length_t # 定义一个位移向量
    speed = [0] * length_t # 定义一个速度向量
    acceleration = [0] * length_t # 定义一个加速度向量
    for i in range(2, length_t): # 求解位移,单位为mm
        displacement[i] = (-acceleration_g[i] + (2 / step ** 2 - 4 * (math.pi) ** 2) * displacement[i - 1] + (
                    0.2 * math.pi / 2 / step - 1 / step ** 2) * displacement[i - 2]) / (
                                      1 / step ** 2 + 0.2 * math.pi / 2 / step)
    for i in range(length_t):
        displacement[i]=displacement[i] *1000
    displacement1 = displacement[:]
    for i in range(length_t):
        displacement1[i]=displacement1[i] /1000
    for i in range(1,len(displacement)-1): # 求解速度,单位为m/s^2
        speed[i]=(displacement1[i+1]-displacement1[i-1])/step/2
    for i in range(1, len(displacement) - 1): # 求解加速度,单位为g
        acceleration[i] = (displacement1[i + 1] -2*displacement1[i]+ displacement1[i - 1]) / step**2
        acceleration[i]=acceleration[i]/9.8
    return displacement,speed,acceleration
# ---------------------Newmark方法----------------------- #
def Newmark(acceleration_g:list,time:list,step):  # Newmark方法,β取1/6
    Newmark_length=len(time)*10
    Newmark_displacement = [0]*Newmark_length # 定义一个位移向量
    Nemark_speed = [0] * Newmark_length # 定义一个速度向量
    Nemark_acceleration = [0]*Newmark_length # 求解位移,单位为mm
    p1_m=[0]*(Newmark_length+1)
    acceleration_g_linear=[0]*Newmark_length
    for i in range(len(acceleration_g)-1):
        deta=acceleration_g[i+1]-acceleration_g[i]
        for j in range(i*10,i*10+10):
            if j ==i:
                acceleration_g_linear[j]=acceleration_g[i]
            else:
                acceleration_g_linear[j] = acceleration_g_linear[j-1]+0.1*deta
    a1_m = 6 / (step **2) + 3 / step * 0.2 * math.pi #系数a1与质量m的比值
    a2_m = 6 / step + 2 * 0.2 * math.pi #系数a2与质量m的比值
    a3_m = 2 + step / 2 * 0.2 * math.pi #系数a3与质量m的比值
    k1_m = 4 * math.pi ** 2 + a1_m
    for i in range(1,Newmark_length-1):
        p1_m[i]=-acceleration_g_linear[i]+a1_m*Newmark_displacement[i-1]+a2_m*Nemark_speed[i-1]+a3_m*Nemark_acceleration[i-1]
        Newmark_displacement[i]=p1_m[i]/k1_m # 求解位移
        Nemark_speed[i]=3/step*(Newmark_displacement[i]-Newmark_displacement[i-1])-2*Nemark_speed[i-1]-step/2\
                        *Nemark_acceleration[i-1] # 求解速度
        Nemark_acceleration[i]=6/step**2*(Newmark_displacement[i]-Newmark_displacement[i-1])-6/step*Nemark_speed[i-1]\
        
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Newmark β 方法求解自由度结构动力学响应的一种常用方法。在 MATLAB 中实现 Newmark β 方法的步骤如下: 1. 定义时间步长 Δt、总计算时间 T、初始位移和速度以及结构的质量和刚度矩阵。 2. 计算时间步数 N = T/Δt。 3. 定义 Newmark β 方法中的参数 β 和 γ。 4. 初始化加速度、位移和速度向量。 5. 利用初始位移和速度向量求解初始加速度向量。 6. 循环计算每个时间步长的加速度、速度和位移向量。 7. 可以输出每个时间步长的加速度、速度和位移向量,以及动力学响应结果。 下面是一个简的 MATLAB 代码实现 Newmark β 方法的示例: ```matlab % 定义参数 Delta_t = 0.01; % 时间步长 T = 10; % 总计算时间 N = T/Delta_t; % 计算时间步数 beta = 0.25; % Newmark β 方法参数 gamma = 0.5; % Newmark β 方法参数 % 定义自由度结构的质量和刚度矩阵 m = 1; % 质量 k = 10; % 刚度 % 初始化加速度、位移和速度向量 a = zeros(N, 1); % 加速度向量 v = zeros(N, 1); % 速度向量 u = zeros(N, 1); % 位移向量 % 初始位移和速度 u(1) = 0.1; % 初始位移 v(1) = 0; % 初始速度 % 计算初始加速度 a(1) = (1/m)*(-k*u(1)); % 循环计算每个时间步长的加速度、速度和位移向量 for i = 2:N t = i*Delta_t; u(i) = u(i-1) + Delta_t*v(i-1) + ((1-2*beta)/2)*Delta_t^2*a(i-1); v(i) = v(i-1) + ((1-gamma)*Delta_t*a(i-1) + gamma*Delta_t*a(i)); a(i) = (1/(beta*Delta_t^2))*(u(i) - u(i-1) - Delta_t*v(i-1)) + ((1/(2*beta))-1)*a(i-1); end % 输出动力学响应结果 plot(0:Delta_t:T-Delta_t, u); xlabel('Time (s)'); ylabel('Displacement (m)'); title('Newmark β Method'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值