首页/文章/ 详情

Newmark方法解运动方程

7月前浏览5274

1. 算法分析

如果将位移按照泰勒公式展开,只保留一阶导数项,    时刻的速度    和位移    可由前一步    时刻的速度和位移表示:

 
 

给定初值    和    后,由    时刻的运动方程

 

可求出    时刻加速度    ,然后由    分别求    时刻的速度    和位移    ,这种方法称为欧拉法,它满足    时刻的运动方程,因此是一种显式格式。欧拉法由前一步的已知值可求下一步的值,故为一步法,可以自起步(self-starting)。但是欧拉法在位移表达式中只保留了    的一阶项,位移的截断误差是    ,因此是一阶精度格式,一般只能用于起步或者与其他方法配合使用。欧拉法可通过在    用导数的平均值代替t时刻的导数值来改进,即

 
 

将    带入    得到

 

   可理解为,在位移和速度表达式中,近似取平均加速度    ,因此该方法也叫平均加速度法。Newmark引入如下的速度和位移关系:

 
 

参数    取不同的值可以得到多种方法。如    时即为中心差分法;    时即为平均加速度法。

2.算法流程

Newmark方法的求解过程如下:

(一)初始计算

  1. 形成刚度矩阵        ,质量矩阵        和阻尼矩阵        
  2. 由初值        和        求解        
  3. 由参数        ,时间步长        计算
  4. 形成有效刚度矩阵        
  5. 分解        

(二) 对每一时间步

  1. 计算        时刻的有效载荷
  2. 解        时刻位移        
  3. 计算        时刻的速度和加速度.
 
 

3.算例

用Newmark方法解运动方程,时间步长    

 

其中

 

初始条件

 

   ,常数

有效刚度矩阵

 

在每个时间步中计算有效载荷

 

求解方程组

 

可得到各时刻位移。

4. 编程实现


# Newmark方法
# @表示矩阵乘法

import numpy as np
import matplotlib.pyplot as plt
step = 10  #求解步数
data = np.zeros( (2,step) ) # 存储各时间步长的数据
K = np.mat('6,-2;-2,4')
M = np.mat('2,0;0,1')
Q = np.mat('0;10')
U_0 = np.mat('0; 0')    #初始位移
V_0 = np.mat('0; 0')    #初始速度
A_0 = np.mat('0; 10')   #初始加速度

# 参数
dt = 0.28
alpha = 0.5; beta = 0.25
c0 = 1/(beta * dt**2)
c1 = alpha /(beta * dt)
c2 = 1/(beta * dt)
c3 = 1/(2*beta) - 1
c4 = alpha /beta - 1
c5 = dt * (alpha /(2*beta ) - 1)
c6 = dt * (1- alpha )
c7 = alpha * dt


# 有效刚度矩阵
KK = K + c0 * M 
invKK = np.linalg.inv(KK)

for i in range(step):
    H = c0 * U_0 + c2 * V_0 + c3 * A_0
    Q_1 = Q + M @ H
    U_1 = invKK @ Q_1
    data[0:, [i] ] = U_1

    ## t+dt时刻的速度和加速度
    A_1 = c0 *(U_1 - U_0) - c2*V_0 -c3*A_0
    V_1 = V_0 + c6* A_0 + c7* A_1

    A_0 = A_1
    U_0 = U_1
    V_0 = V_1

#解线性方程组采用求逆的方法,计算规模大的,可以用LDLT分解.
#

time = np.zeros((step))
for i in range(step):
    t = 0.28 * (i+1)
    time[i] = t

labels =['Δt','2Δt','3Δt','4Δt','5Δt','6Δt','7Δt','8Δt','9Δt','10Δt']

fig, (ax1, ax2) = plt.subplots(21, figsize=(5,12) )
ax1.plot(time, data[0, :], 'r-')
ax1.set_xticks(time, labels)
ax1.set_ylabel('$a_1$',fontsize = 14)

ax2.plot(time, data[1, :], 'b-')
ax2.set_xticks(time, labels)
ax2.set_ylabel('$a_2$',fontsize = 14)

fig.savefig('./f429.png', dpi = 400
plt.show()


来源:数值分析与有限元编程
UM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-03
最近编辑:7月前
太白金星
本科 慢慢来
获赞 5粉丝 15文章 326课程 0
点赞
收藏
作者推荐

用力学概念解超静定问题

用力学概念解超静定问题。由于实际工程的复杂性,设计者常常只能通过计算机来完成计算。这个过程涉及很多因素,除了原理、方法、软件、荷载外,还有设计者自己的某些主观因素,难免会导致计算结果的错误。而检验这些错误的工具,只能是工程师自己,运用概念来判断,是一个必要环节。如图1所示,一直径为 的门型折杆,三边长度均为 , 两端固定支撑,在 段中点 作用竖向荷载 ,已知 ,求 点竖向位移。▲图1本题属于超静定范围。将 、 截面断开,受力分析如图2所示,▲图2设 分别为 杆受竖向荷载 作用产生弯曲变形后 截面和 截面的转角, 分别为 和 杆受扭转后 截面和 截面的扭转角,则根据材料力学中的基本公式可得 由变形协调关系 或者 可得 这里 并不是所熟悉的 ,这是因为BC两端的约束并不是刚性的。事实上,随着 的跨度进一步增大, 会越来越小,最终变为0. 点竖向位移由以下几部分组成:a). 在自由端作用 产生的竖向位移 b). 在跨中作用 时产生的竖向位移 b). 在支座处作用 时产生的竖向位移 。这里由互等定理求 如图所示,由互等定理得 其中 所以 有关互等定理点击这里:功的互等定理来源:数值分析与有限元编程

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