今天整理电脑里的资料,翻到了二十多年前写的一个 C++ 程序(我二十多年前居然还能写这个),是用 Nigam-Jennings 方法求解精确的地震波反应谱。这个算法我最初是在李宏男的《结构多维抗震理论与设计方法》[1] 中看到的。当时在写这个程序的时候还专门作了个帮助文件来记录这个算法,可惜这个帮助文件是 hlp
格式,Windows 10 以上已经不支持了,也就没法打开查看内容,于是我重新搜集了一下资料,复习了一下这个算法的相关知识,并把它记录下来。
基本理论
Nigam 和 Jennings 提出的数值积分算法直接从单自由度体系运动微分方程出发:
y¨(t)+2ξωy˙(t)+ω2y(t)=−X¨(t)
这里,X¨(t) 是以数字形式给出的,而且数字化密度一般很高,有理由假定相邻两个数字加速度间加速度是按线性变化,于是在 ti⩽t⩽ti+1 区间内,X¨(t) 可写成:
X¨(t)=X¨(ti)+ti+1−tiX¨(ti+1)−X¨(ti)(t−ti)=X¨(ti)+ΔtiΔX¨(ti)(t−ti)
单自由度体系的运动微分方程可以写成为:
y¨(t)+2ξωy˙(t)+ω2y(t)=−X¨(ti)−ΔtiΔX¨(ti)(t−ti)
在 [ti,ti+1] 区间内,上式的解为:
y(t)=e−ξω(t−ti)[c1cosω′(t−ti)+c2sinω′(t−ti)]−ω2X¨(ti)+ω32ξ⋅ΔtiΔX¨(ti)−ω21ΔtiΔX¨(ti)(t−ti)
式中:
⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧ω′c1c2=1−ξ2ω=y(ti)−ω32ξ⋅ΔtiΔX¨(ti)+ω2X¨(ti)=ω′1(ξωy(ti)+y˙(ti)−ω22ξ2−1⋅ΔtiΔX¨(ti)+ωξX¨(ti))
根据微分方程的解可以得到体系在 tn 和 tn+1 时刻的运动状态之间的递推公式为:
{y(ti+1)y˙(ti+1)=a11y(ti)+a12y˙(ti)+b11X¨(ti)+b12X¨(ti+1)=a21y(ti)+a22y˙(ti)+b21X¨(ti)+b22X¨(ti+1)
当数字记录 X¨(ti) 的时间间隔一定时,式中参数为:
a11=a12=a21=a22=b11=b12=b21=b22=e−ξωΔt(1−ξ2ξsinω′Δt+cosω′Δt)e−ξωΔt⋅ω′sinω′Δt−1−ξ2ω⋅e−ξωΔt⋅sinω′Δte−ξωΔt(cosω′Δt−1−ξ2ξsinω′Δt)e−ξωΔt[(ω2Δt2ξ2−1+ωξ)ω′sinω′Δt+(ω3Δt2ξ+ω21)cosω′Δt]−ω3Δt2ξ−e−ξωΔt(ω2Δt2ξ2−1⋅ω′sinω′Δt+ω3Δt2ξcosω′Δt)−ω21+ω3Δt2ξe−ξωΔt[(ω2Δt2ξ2−1+ωξ)(cosω′Δt−1−ξ2ξsinω′Δt)−(ω3Δt2ξ+ω21)(ω′sinω′Δt+ξωcosω′Δt)]+ω2Δt1e−ξωΔt[ω2Δt1cosω′Δt+ω21−ξ2Δtξsinω′Δt]−ω2Δt1
而体系在 t=ti+1 时刻的绝对加速度可直接由运动微分方程得到:
X¨(ti+1)+y¨(ti+1)=−2ξωy(ti+1)−ω2y(ti+1)
根据递推公式就可以得到整个时间历程的位移、速度、和加速度时程反应,对不同周期的体系分别进行计算并取最大值即为地震波的位移、速度和加速度反应谱。
本方法以运动方程的精确解为基础,为单自由度体系在时间步长的起终点时刻的运动状态建立矩阵形式的递推关系。如果没有舍入误差,该方法给出的是精确解,且不会因为截断误差而发散。
代码实现
二十多年前我是用 C++ 实现的这个算法,现在来看,那个代码写得就是一堆 shit mountain,不堪入目,于是我用现在更熟悉一些的 AutoLisp/VisualLisp 来实现,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| (defun CAL:SdofTh (AccLst Dt Period xi / a11 a12 a21 a22 b11 b12 b21 b22 w wd wdt w2 w3 ee xi2 xi3 xi4 tha thv thd aa vv dd) (setq xi2 (* xi xi) xi3 (sqrt (- 1.0 xi2)) xi4 (/ xi xi3) w (/ pi 0.5 Period) wd (* xi3 w) wdt (* wd Dt) w2 (* w w) w3 (* w w w) ee (exp (* -1.0 xi w dt)) thd (list 0.0) thv (list 0.0) tha (list 0.0) Lst Acclst) (setq a11 (* ee (+ (* xi4 (sin wdt)) (cos wdt))) a12 (* ee (/ (sin wdt) wd)) a21 (* ee -1.0 (/ w xi3) (sin wdt)) a22 (* ee (- (cos wdt) (* xi4 (sin wdt)))) b11 (- (* ee (+ (* (+ (/ (- (* 2.0 xi2) 1.0) w2 dt) (/ xi w)) (/ (sin wdt) wd)) (* (+ (/ xi 0.5 w3 Dt) (/ 1.0 w2)) (cos wdt)) )) (/ xi 0.5 w3 Dt)) b12 (- (/ xi 0.5 w3 Dt) (* ee (+ (/ (* (- (* 2.0 xi2) 1.0) (sin wdt)) w2 wd Dt) (* (/ xi 0.5 w3 Dt) (cos wdt)))) (/ 1.0 w2)) b21 (+ (* ee (- (* (+ (/ (- (* 2.0 xi2) 1.0) w2 Dt) (/ xi w)) (- (cos wdt) (* xi4 (sin wdt)))) (* (+ (/ xi 0.5 w3 Dt) (/ 1.0 w2)) (+ (* wd (sin wdt)) (* xi w (cos wdt)))))) (/ 1.0 w2 Dt)) b22 (- (* ee (+ (/ (cos wdt) w2 Dt) (* (/ xi4 w2 Dt) (sin wdt)))) (/ 1.0 w2 Dt))) (while (> (length Lst) 1) (setq dd (+ (* (car thd) a11) (* (car thv) a12) (* (car lst) b11) (* (cadr lst) b12)) vv (+ (* (car thd) a21) (* (car thv) a22) (* (car lst) b21) (* (cadr lst) b22)) aa (+ (* -2.0 xi w vv) (* -1.0 w2 dd)) tha (cons aa tha) thv (cons vv thv) thd (cons dd thd) Lst (cdr Lst))) (mapcar 'reverse (list tha thv thd)))
(defun CAL:Spectra (Acclst Dt Tlst xi / RLst) (foreach Period Tlst (setq Rlst (cons (cons Period (mapcar '(lambda(x) (apply 'max x)) (CAL:SdofTh Acclst Dt Period xi))) RLst))) (reverse RLst))
|
参考文献
- [1] 李宏男. 结构多维抗震理论与设计方法 [M]. 科学出版社, 北京, 1998.