如何使用python模拟一个考虑阻尼系数的弹簧振动系统的运动/数值模拟(含代码)

一:基础知识

  1. 胡克定理:F = -(K(X_{1}-X_{0}))=-k\Delta x
  2. 牛顿第二定律:F_{2}-F_{1} = Ma
  3. 阻尼公式:F = B*V,其中B为阻力系数,是与速度有关的公式

二:内容简介

        通过python代码创建弹簧震动系统的运动模型。 分析一个简单的数学建模模型,可以为复杂的建模提供思路

三:分析

        模型可视化:时间和Δx的关系曲线图

                要呈现整个弹簧的运动过程,相对位移Δx最能体现弹簧能力衰竭的过程。

        任意i时刻公式分析:

                -k\Delta x-B*V_{i}=ma

四:代码思路

        1、输入初始条件:

                弹簧末端物体的重量mass,弹簧初始位移initial_displacemnt,弹簧初始速度nitial_velocity,时间的间隔(时间步长)time_step,总步数num_steps,弹簧弹性系数spring_constant,弹簧阻尼系数damping_coefficient。

         2、在任意时刻:

               根据-k\Delta x_{i-1}-B*V_{i-1}=ma_{i} 得加速度a_{i}

                根据v_{i} = v_{i-1}+a*d_{t} 得速度v_{i}

                根据\Delta x_{i} = \Delta x_{i-1} + v * d_{t} 得位移量(带方向)\Delta x_{i}

                时间可由时间间隔和时间步长求得

       3、将任意时刻的时间和\Delta x_{i}添加到x轴和y轴,用matplotlib绘图

五:具体代码如下(关注即可复制下载)

        如果代码不能复制粘贴,可关注抖音:yibinfuzi,私信免费获取。

def spring_simulation(mass, spring_constant, damping_coefficient, initial_displacement, initial_velocity, num_steps, time_step):
    displacements = np.zeros(num_steps)
    velocities = np.zeros(num_steps)
    accelerations = np.zeros(num_steps)
    #初始化
    displacements[0] = initial_displacement
    velocities[0] = initial_velocity

    for i in range(1, num_steps):
        # 计算加速度
        accelerations[i] = (-spring_constant * displacements[i-1] - damping_coefficient * velocities[i-1]) / mass

        # 更新速度和位移
        velocities[i] = velocities[i-1] + accelerations[i] * time_step
        displacements[i] = displacements[i-1] + velocities[i] * time_step

    return displacements

# 模拟参数
mass = 1.0  # 质量(kg)
spring_constant = 10.0  # 弹簧常数(N/m)
damping_coefficient = 0.5  # 阻尼系数(Ns/m)
initial_displacement = 1.0  # 初始位移(m)
initial_velocity = 0.0  # 初始速度(m/s)
num_steps = 1000  # 模拟步数
time_step = 0.01  # 时间步长(s)

# 进行弹簧振动系统模拟
displacements = spring_simulation(mass, spring_constant, damping_coefficient, initial_displacement, initial_velocity, num_steps, time_step)

# 绘制位移随时间变化的图像
time = np.arange(0, num_steps * time_step, time_step)
plt.plot(time, displacements)
plt.xlabel('Time (s)')
plt.ylabel('Displacement (m)')
plt.title('Spring Oscillation Simulation')
plt.grid(True)
plt.show()
        结果展示:
time_step越低,则曲线越光滑,精度也越高。纵坐标是相对未受力弹簧的形变量

六:总结

  1. 可以自定义迭代多少步,数据点使用list = np.zeros(num_steps)收集
  2. 建模的重点是对已知方程的解析。分析出一个对任意时刻都通用的公式。类似数学统计法,经由一个表达式(已知方程)S_{n},推导出一个公式在i=0,i=1处都适用,则该公式就是适用任意时刻(位移)处的通式。
  3. 建模首先需要确定模型展示方式。即确定图形横纵坐标的意义。

作者是石油工程专业研究生,方向为.油气工程信息化与智能化技术。正在自学数值模拟和神经网络,欢迎一起交流学习python数值模拟和神经网络相关内容。如代码未能复制粘贴,可关注抖音:yibinfuzi,私信获取代码。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值