首页/文章/ 详情

动力方程的精细积分法

4小时前浏览1


非齐次动力学方程常用的数值积分方法有中心差分法、Wilson类方法、Houbolt法、Newmark类方法等,虽然应用十分广泛,但是在长时间的积分过程中会表现出能量耗散和相位误差。钟万勰院士提出的精细积分法,由于其具有高精度和强稳定性的特点,为非齐次动力方程的时程积分提供了一种新的计算途径。

微分方程的降阶

结构动力学方程的一般形式可表达为

式中,    分别表示系统的质量矩阵、阻尼矩阵和刚度矩阵,  表示施加于系统的外力。当质量矩阵正定时,引入变量  

令新的状态变量为  ,式(1)可以重新写为

式中  为常数矩阵,  为非线性广义外力项.

在一个积分步长  内,记  ,(2)两边同时乘以  ,非齐次动力方程(2)的解为

指数矩阵的计算

(4)中有  需要计算。根据指数的运算

由于  本来是不大的时间区段,则  将是非常小的一个时间区段(通常取  )。采用  级数展开(4项)近似计算矩阵指数

其中,  为单位矩阵。(6)代入(5)

由(6)可知,  是一个小量的矩阵,当它与单位阵  相加时,在计算机舍入操作时将很可能被丢失掉。考虑递推关系

其中

(9)的N次矩阵乘法迭代相当于

  for(k =0; k <N; k++) {
    Ta = 2Ta + TaTa
}

 为常数矩阵,求解过程中只计算一次。当以上循环语句全部计算结束后,然后再计算:

即可求出指数矩阵  的值。参考《计算机科学计算》第七章。

非齐次方程特解的计算

由于  为常数矩阵,对于(1)的齐次方程的通解形式为:

由上述方法精细计算得矩阵  后,时程积分就变为:

而对于非齐次方程(2),若非齐次项  在时间步  内为线性,即方程为:

 时,    可表示为:

凑微分的时候,

算例

如图所示的结构,设横梁为无限刚性,体系的质量全部集中在各横梁上,各层间侧移刚度为1,自振频率分别为  。用精细积分法计算位移时程。

  import matplotlib.pyplot as plt
import numpy as np

defcompute_t(n, H, eta):
    ## 计算矩阵T
    N = 20
    tau = eta/(2**N)
    H_tau1 = H*tau
    H_tau2 = H @ H_tau1 *tau
    H_tau3 = H @ H_tau2 *tau
    H_tau4 = H @ H_tau3 *tau
    T_a = H_tau1 + H_tau2/2.0 + H_tau3/6.0 + H_tau4/24.0
    for i inrange(20):
        T_a = 2.0*T_a + T_a @ T_a

    T = np.eye(n) + T_a  

    return T 


defmain( ):
    plt.style.use("ggplot")
    plt.rcParams['font.sans-serif'] = ['MiSans']    # 这个字体能够支持中英文字符
    plt.rcParams['axes.unicode_minus'] = False      # 正常显示负号

    ug = np.loadtxt("EQ-S-3.txt"# 读取地震波    
    dt = 0.005# 时间间隔
    n = len(ug)
    t0 = np.linspace(0.0, dt*(n-1), n)

    eta = 0.05

    zeta = 0.05         # 固有阻尼比
    omg1 = 0.386
    omg2 = 1.036

    K = np.array([ [2,-1,0],[-1,2,-1],[0,-11] ])
    M = np.array([ [1.500],[010],[001.5] ])

    # 一阶和二阶频率以及瑞利阻尼构造阻尼矩阵
    a0 = 2*zeta*omg1*omg2 / (omg1+omg2 )
    a1 = 2*zeta/ (omg1+omg2 )
    C  = a0*M + a1*K

    F = np.array([0.00.00.01.01.01.0])

    invM = np.linalg.inv(M)

    H0 =  np.dot(C, invM)
    H1 =  np.dot(invM, C)
    H2 = 0.25 * np.dot(C, H1) -K

    H3 =  np.hstack( (-0.5*H1, invM) )
    H4 =  np.hstack( (H2, -0.5*H0) )

    H = np.vstack( (H3, H4) )
    invH = np.linalg.inv(H)

    T = compute_t(6, H, eta)

    x  = np.zeros((n, 6))
    xn = np.zeros(6)

    for i inrange(n-1):
        r0 = F*(-ug[i])
        r1 = F*(-ug[i+1]+ug[i]) / dt

        xn = T.dot(xn+invH.dot(r0+invH.dot(r1))) - invH.dot(r0+invH.dot(r1)+dt*r1)
        x[i,:] = xn

    u = x[:,0]

    fig, (ax0,ax1) = plt.subplots(nrows=2, ncols=1, sharex=True,
                                    figsize=(166) )
    
    ax0.plot(t0, ug)
    ax0.set( title= '地震波加速度时程')
    ax0.grid()

    ax1.plot(t0, u)
    ax1.set( title= '位移时程')
    ax1.grid()

    fig.savefig("1.png",dpi=300)
    plt.show()


if __name__ == "__main__":
    main( )



来源:数值分析与有限元编程
非线性UGUMNVH
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-05-05
最近编辑:4小时前
太白金星
本科 慢慢来
获赞 12粉丝 23文章 340课程 0
点赞
收藏
作者推荐

力学概念| 推导挠度曲线的微分方程

细长梁的纯弯曲变形基于两个假设:(1)位于中性面内的纵轴的长度不变;(2)在变形过程中,梁的所有横截面保持平面并垂直于纵轴(图1)。 ▲图1 根据上述假设,现在考虑弯矩如何使沿梁长度方向一个微段 的变形,如图2所示。变形前距离中性轴为 的位置长度为 (红色位置),变形后为 。根据应变的定义 ▲图2 变形后 两端法线的交点即为曲率中心,由此确定了曲率半径 。由几何关系(2)代入(1)得即由胡克定律这表明,任意纵向纤维的正应力与它到中性层的距离成正比。在横截面上,任意点的正应力与该点到中性轴的距离成正比。亦即沿截面高度,正应力按直线规律变化,且在中性层处等于零,如图3所示。 ▲图3 绕 轴的力矩之和为式中积分式(5)可以写成式中 是梁轴线变形后的曲率。 ▲图4 讨论弯曲变形时,以变形前的梁轴线为 轴,垂直向上的轴为 轴(图4), 平面为梁的纵向对称面。在对称弯曲的情况下,变形后梁的轴线将成为 平面内的一条曲线。挠曲线上横坐标为 的任意点的纵坐标用 来表示,它代表坐标为 的横截面的形心沿 方向的位移,称为挠度。这样,挠曲线的方程式可以写成习惯上,把梁下侧受弯曲时的弯矩为正,挠曲线向下凸出,如图5所示。 ▲图5 在我们选定的坐标系中( 轴向上为正),随着弧长 的增加, 也是增加的(逆时针转动),即正增量 对应的 也是正的。根据平截面假设,弯曲变形前垂直于轴线( 轴)的横截面,变形后仍垂直于挠曲线。所以,截面转角 就是 轴与挠曲线法线的夹角。它应等于挠曲线的倾角,即等于 轴与挠曲线切线的夹角。故有 ▲图6类似的关系还有在工程问题中,梁的挠度一般都远小于跨度,因此小变形情况下,转角 也是一个非常小的角度,因此即代入(7) 有又因此由(7) 和(11)得 来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈