超越梦想分享 http://blog.sciencenet.cn/u/pcabaqus 结构减隔震控制 非线性抗震分析 Python简单编程

博文

「Python与地震工程」单自由度体系求解1

已有 6492 次阅读 2016-12-27 15:53 |个人分类:地震分析|系统分类:科研笔记| Python, 地震工程, 结构动力学

单自由度体系分析是结构动力学和地震工程学习的启蒙知识,也是复杂结构动力分析的基石,具有重要的作用和研究价值。本文将探讨如何用Python的科学计算模块来实现单自由度体系的动力响应分析。

经典的弹性有阻尼单自由度体系在任意激励P(t)作用下的运动方程可写为

m.ddot{x}.left( t .right) + c.dot{x}.left( t .right) + kx.left( t .right) = P.left( t .right)

.ddot{x}.left( t .right) + 2 .zeta .omega .dot{x}.left( t .right) + .omega^2 x.left( t .right) = p.left( t .right)

求解此运动方程的经典方法有杜哈梅积分法、Newmark-β法、中心差分法等。借助Python求解此方程最快捷的方法就是将方程降阶为状态空间形式调用scipy.integrate.odeint()函数。

上述方程的状态空间形式为

.[.frac{{.rm{d}}}{{{.rm{d}}t}}.left( {.begin{array}{*{20}{c}}
{{y_1}}..
{{y_2}}
.end{array}} .right) = .left( {.begin{array}{*{20}{c}}
{{y_2}}..
{p.left( t .right) - 2.zeta .omega {y_2} - {.omega ^2}{y_1}}
.end{array}} .right).]

采用odeint()进行单自由度体系共振简谐激励和地震激励作用下响应求解的完整代码为

import scipy as sp
from scipy.integrate import odeint
import matplotlib.pyplot as plt


def pd(tn,*p_args):
   """ 等时间间隔离散信号a对应的连续化函数(线性插值方法实现) """
   dt = p_args[0] # 离散信号时间间隔
   a  = p_args[1] # 离散信号数据

   ind = int(sp.floor(tn/dt))
   if (ind+1)>=len(a):
       return 0.0
   else:
       al = a[ind]; ar = a[ind + 1];
       k = (ar - al) / dt
       return al+k*(tn-ind*dt)

def solve_sdof_resonance(omg = 1.0*2.0*sp.pi, zeta = 0.02):

   y0 = sp.asarray([0.0,0.0]) # 初始条件
   p = lambda t: sp.sin(omg*t) # 共振简谐激励

   f_sdof = lambda y,t: sp.asarray([ y[1], -p(t)-2.0*zeta*omg*y[1]-omg*omg*y[0] ])

   t = sp.linspace(0, 30, 1001)
   y = odeint(f_sdof, y0, t)

   # 绘图:
   plt.figure("Resonance Response",(12,4))
   plt.plot(t,y[:,0])
   plt.grid(True)
   plt.show()


def solve_sdof_eqwave(omg = 1.0*2.0*sp.pi, zeta = 0.02):

   y0 = sp.asarray([0.0,0.0]) # 初始条件

   a = sp.loadtxt("EQ-S-3.txt") # 读取地震波
   dt = 0.005 # 时间间隔
   n = len(a)
   p = lambda t: pd(t,dt,a) # 共振简谐激励

   f_sdof = lambda y,t: sp.asarray([ y[1], -p(t)-2.0*zeta*omg*y[1]-omg*omg*y[0] ])

   t = sp.linspace(0.0,dt*(n-1),n)
   y = odeint(f_sdof, y0, t)

   # 绘图:
   plt.figure("Seismic Response",(12,8))
   plt.subplot(2,1,1)
   plt.plot(t,a,label=r"输入地震波加速度时程")
   plt.grid(True)
   plt.legend()
   plt.subplot(2,1,2)
   plt.plot(t,y[:,0],label=r"SDOF体系位移响应时程")
   plt.grid(True)
   plt.legend()
   plt.show()

if __name__ == '__main__':
   solve_sdof_resonance()
   solve_sdof_eqwave()


共振响应曲线

地震激励及响应曲线





https://blog.sciencenet.cn/blog-339218-1023661.html

上一篇:地震波处理软件 EQSignal
下一篇:研究论文——单自由度混联II型惯容减震体系的随机地震响应与参数设计
收藏 IP: 111.187.82.*| 热度|

1 yangb919

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-29 01:50

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部