首页/文章/ 详情

中心差分法的蛙跳(Leapfrog)格式

8月前浏览1168

差分是用离散形式来近似函数变化率的方法,是数值计算中的一种重要工具。它将函数的连续变化用离散点上的差值表示。中心差分(Central Difference)使用两侧的离散点来近似计算导数。

 

这就像扁担一样,一前一后,两头都有。当步长为    

 

若要求    ,则

 

式(3)是本文的灵魂所在。

如图1所示,使用蛙跳格式时,速度和加速度、位移不是同一个节拍。根据式(3),每一个时间步长的中点的速度为

▲图1

 

式(4)的速度来表示位移

 

需要指出的是,蛙跳格式以加速度为基本变量,没有直接给出整数时刻的速度。在求解时,先根据运动方程来求解    时刻的加速度

 

▲图2

以上一篇的小车的自由振动为例,用蛙跳格式模拟。

直观感受动力学数值解法的误差

根据图3,初始条件在    时刻,此时的加速度    可由式(6)求得。    时刻的速度可由向前差分公式(仅用于起步)

 

在    时刻的位移    可由式(5)求得

 

接下来便可根据式(6)求    时刻的加速度    ,进一步根据式(4)求    时刻的速度    。求解流程为

▲图3

import numpy as np
import matplotlib.pyplot as plt

# 自由振动蛙跳格式

def main(steps, dt):
    k = 0.5    # 弹簧刚度
    x = 0.5   # 初始位移
    m = 1     #质量
    v1 = 0   # 初始速度
    x1 = x

    xxx = np.zeros(steps)
    time = np.zeros(steps)

    for i in range(steps):
        # 注意蛙跳格式的区别
        a  = -k *x1 /m   # 加速度
        if i == 0 :
            v2 = v1 + a* 0.5* dt   # 起步时用向前差分公式
        else:
            v2 = v1 + a * dt  # 中心差分公式
            
        x2 = x1 + v2*dt # 下一时刻的位移
        
        v1 = v2
        x1 = x2

        # 以下的数据用于绘图
        xxx[i] = x2
        t = dt * i
        time[i] = t

    fig, ax = plt.subplots(11, figsize=(10,6) )
    ax.plot(time, xxx, 'r-')
    ax.set_xlabel('$t/s$',fontsize = 14)
    ax.set_ylabel('$x2/m$',fontsize = 14)

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



if __name__ == "__main__":
    main(8000.1)

▲图4

经过数千次迭代后,小车的振幅仍然接近    。对于该案例而言,蛙跳法提供了良好的模拟效果,但在上万次迭代后误差会变得显著。

蛙跳式中心差分法是显式有限元软件LS-DYNA的最常用的积分方法。

来源:大狗子说数值模拟
LS-DYNASTEPS振动UM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-12-05
最近编辑:8月前
大狗子说数值模拟
博士 传播国际一流的数值模拟算法
获赞 13粉丝 33文章 91课程 0
点赞
收藏
作者推荐

数值模拟基础知识:啥是状态方程

大家做显式模拟的时候经常会听到一个词“状态方程”(Equation of State, EOS), 那么啥是状态方程呢?大家再次不要被名字吓到,我再用一句话说明:它就是用一个简单的数学公式表示物体的性质。这句话看起来说了等于没说,但是关键词在“简单”。举个例子,正常来说求解流体,需要求解NS方程,弱一点呢也需要求解Stokes方程,大概形式如下: 看到这样的式子大家会解吗,当然做CFD的朋友们肯定会求解,具体的做法就是将这个偏微分方程组转为离散形式,用FVM,SPH等方法求解他,Hard 模式。这个时候“简单”的状态方程就来了,给大家看一下状态方程怎么描述水:将应力(特别是静水压)与密度(或体积变化)联系起来给体积模量搞个大点的因子,以防止水可压缩具体的公式就变成了: 其中 为压强, 为体积模量, 变形梯度 的行列式,表示相对体积的变化,大家看这个公式简不简单!这个东西的求解呢,现在大家就可以近似的用FEM,MPM这类方法求解,如果你以往有一个求解固体力学的代码就很好求解上述问题(这不就是个线性关系吗),有限元中单元的 你肯定是能求,给个大的 , 相应的 也就求出来了,尤其是在显式动力学中,不需要做那些线性化等推导,直接了当的推下一步的状态就OK了。所以大家在Abaqus,LS-Dyna中对于液体、气体的模拟,经常会看到其采用状态方程的方法,easy and works.当然Abaqus这类软件中包含的种类非常多,我也并不是完全了解,也有很多细节,后续可以持续展开: 对于气体的模拟,最简单的就是理想气体了,他的状态方程就是大家高中时候学的 (是不是一切都回来了!)下图为狗子哥,用MPM+状态方程+刚体做的一个简单流固耦合,是不是还挺像那么一回事(在邪修的路上又进了一步)来源:大狗子说数值模拟

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