阻尼振动的可视化 包括源码和推导

news2024/10/2 18:19:18

阻尼振动的可视化 包括源码和推导

flyfish

牛顿第二定律(加速度定律)
胡克定律(Hooke‘s Law)

阻尼振动是指在振动系统中,由于阻力或能量损耗导致振动幅度随时间减小的现象。

左边为无阻尼,右边为有阻尼,有阻尼的摆动会逐渐停止。
在这里插入图片描述
对于简单的阻尼振动系统,其运动方程为:
m d 2 x d t 2 + c d x d t + k x = 0 m\frac{d^2x}{dt^2} + c\frac{dx}{dt} + kx = 0 mdt2d2x+cdtdx+kx=0
在摆动系统中,上述方程的对应形式为:
d ω d t = − b l ω − g l sin ⁡ ( θ ) \frac{d\omega}{dt} = -\frac{b}{l} \omega - \frac{g}{l} \sin(\theta) dtdω=lbωlgsin(θ)

  1. 简单摆动方程(无阻尼) d θ d t = ω \frac{d\theta}{dt} = \omega dtdθ=ω

d ω d t = − g l sin ⁡ ( θ ) \frac{d\omega}{dt} = -\frac{g}{l} \sin(\theta) dtdω=lgsin(θ)

其中:

g g g(重力加速度)对应代码中的 GRAVITY = 9.8

l l l(摆长)对应代码中的 LENGTH = 1.0

  1. 阻尼摆动方程 d θ d t = ω \frac{d\theta}{dt} = \omega dtdθ=ω

d ω d t = − b l ω − g l sin ⁡ ( θ ) \frac{d\omega}{dt} = -\frac{b}{l} \omega - \frac{g}{l} \sin(\theta) dtdω=lbωlgsin(θ)

其中:

g g g(重力加速度)对应代码中的 GRAVITY = 9.8
l l l(摆长)对应代码中的 LENGTH = 1.0
b b b(阻尼系数)对应代码中的 DAMPING_COEFFICIENT = 0.2

阻尼振动系统的推导

1. 牛顿第二定律

对于一个质量 m m m 的物体,其受力情况可以用牛顿第二定律来描述:
F = m d 2 x d t 2 F = m \frac{d^2 x}{dt^2} F=mdt2d2x
其中 x ( t ) x(t) x(t) 是物体的位置函数, d 2 x d t 2 \frac{d^2 x}{dt^2} dt2d2x 是加速度。

2. 力的组成

在一个简单的阻尼振动系统中,力由以下几部分组成:

弹力 :遵循胡克定律,弹力与位移成正比,并且方向与位移相反。
F spring = − k x F_{\text{spring}} = -kx Fspring=kx
其中 k k k 是弹簧常数, x x x 是位移。

阻尼力 :阻尼力与速度成正比,并且方向与速度相反。
F damping = − b d x d t F_{\text{damping}} = -b \frac{dx}{dt} Fdamping=bdtdx
其中 b b b 是阻尼系数, d x d t \frac{dx}{dt} dtdx 是速度。

重力和其他外力 :对于水平振动的简单系统,通常可以忽略重力和其他外力。如果考虑垂直振动,重力可以被包含在弹力的静态部分中。

3. 总受力

总受力为上述各力的叠加:
F = F spring + F damping = − k x − b d x d t F = F_{\text{spring}} + F_{\text{damping}} = -kx - b \frac{dx}{dt} F=Fspring+Fdamping=kxbdtdx

4. 代入牛顿第二定律

根据牛顿第二定律:
m d 2 x d t 2 = − k x − b d x d t m \frac{d^2 x}{dt^2} = -kx - b \frac{dx}{dt} mdt2d2x=kxbdtdx

5. 标准形式

将上述方程整理为标准形式:
m d 2 x d t 2 + b d x d t + k x = 0 m \frac{d^2 x}{dt^2} + b \frac{dx}{dt} + kx = 0 mdt2d2x+bdtdx+kx=0这个方程描述了一个质量 m m m 的物体在弹簧常数 k k k 和阻尼系数 b b b 下的阻尼振动。可以将其简化为无量纲形式,定义以下参数:
固有角频率(不含阻尼): ω 0 = k m \omega_0 = \sqrt{\frac{k}{m}} ω0=mk

阻尼比: γ = b 2 m \gamma = \frac{b}{2m} γ=2mb
于是方程可以写成:
d 2 x d t 2 + 2 γ d x d t + ω 0 2 x = 0 \frac{d^2 x}{dt^2} + 2\gamma \frac{dx}{dt} + \omega_0^2 x = 0 dt2d2x+2γdtdx+ω02x=0

运动方程

对于阻尼振动系统,方程描述的是阻尼摆动:
d 2 x d t 2 + 2 γ d x d t + ω 0 2 x = 0 \frac{d^2 x}{dt^2} + 2\gamma \frac{dx}{dt} + \omega_0^2 x = 0 dt2d2x+2γdtdx+ω02x=0

动画代码中的公式

之前在动画代码中使用的阻尼摆动方程是:
d θ d t = ω \frac{d\theta}{dt} = \omega dtdθ=ω
d ω d t = − b ω − g l sin ⁡ ( θ ) \frac{d\omega}{dt} = -b \omega - \frac{g}{l} \sin(\theta) dtdω=lgsin(θ)这里, θ \theta θ 是摆角, ω \omega ω 是角速度:
b b b 是阻尼系数,对应代码中的 DAMPING_COEFFICIENT

g l \frac{g}{l} lg 是摆动系统中的恢复力系数,对应代码中的 GRAVITY / LENGTH

可视化源码实现

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from scipy.integrate import odeint
from math import sin, cos

# Constants
GRAVITY = 9.8
LENGTH = 1.0
DAMPING_COEFFICIENT = 0.2

def pendulum_equations_no_damping(state, t, length):
    """Equations for a simple pendulum without damping."""
    theta, omega = state
    dtheta_dt = omega
    domega_dt = -GRAVITY / length * sin(theta)
    return dtheta_dt, domega_dt

def pendulum_equations_damping(state, t, length, damping):
    """Equations for a simple pendulum with damping."""
    theta, omega = state
    dtheta_dt = omega
    domega_dt = -damping * omega - GRAVITY / length * sin(theta)
    return dtheta_dt, domega_dt

def solve_pendulum(equations, initial_state, t, args):
    """Solves the pendulum ODE."""
    return odeint(equations, initial_state, t, args=args)

def calculate_trajectory(track, length):
    """Calculates the x and y coordinates of the pendulum bob."""
    x_data = length * np.sin(track[:, 0])
    y_data = -length * np.cos(track[:, 0])
    return x_data, y_data

def initialize_animation():
    """Initializes the animation plot."""
    for ax in axes:
        ax.set_xlim(-1.5 * LENGTH, 1.5 * LENGTH)
        ax.set_ylim(-1.5 * LENGTH, 1.5 * LENGTH)
        ax.grid()
    time_text_no_damping.set_text('')
    time_text_damping.set_text('')
    return lines + time_texts

def update_animation(frame):
    """Updates the animation for each frame."""
    lines[0].set_data([0, x_data_no_damping[frame]], [0, y_data_no_damping[frame]])
    lines[1].set_data([0, x_data_damping[frame]], [0, y_data_damping[frame]])
    time_text_no_damping.set_text(f'time = {frame * 0.1:.1f}s')
    time_text_damping.set_text(f'time = {frame * 0.1:.1f}s')
    return lines + time_texts

# Time array
t = np.arange(0, 20, 0.1)

# Initial state (theta, omega)
initial_state = (1.0, 0)

# Solve ODE for pendulum with and without damping
track_no_damping = solve_pendulum(pendulum_equations_no_damping, initial_state, t, args=(LENGTH,))
track_damping = solve_pendulum(pendulum_equations_damping, initial_state, t, args=(LENGTH, DAMPING_COEFFICIENT))

# Calculate trajectory
x_data_no_damping, y_data_no_damping = calculate_trajectory(track_no_damping, LENGTH)
x_data_damping, y_data_damping = calculate_trajectory(track_damping, LENGTH)

# Create plot
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
lines = [axes[0].plot([], [], 'o-', lw=2, color='blue')[0], 
         axes[1].plot([], [], 'o-', lw=2, color='green')[0]]
time_template = 'time = %.1fs'
time_text_no_damping = axes[0].text(0.05, 0.9, '', transform=axes[0].transAxes)
time_text_damping = axes[1].text(0.05, 0.9, '', transform=axes[1].transAxes)
time_texts = [time_text_no_damping, time_text_damping]

# Add titles
axes[0].set_title('Pendulum without Damping')
axes[1].set_title('Pendulum with Damping')

# Create animation
ani = animation.FuncAnimation(
    fig, update_animation, frames=len(x_data_no_damping), init_func=initialize_animation, interval=50
)

# Save animation
ani.save('double_pendulum.gif', writer='imagemagick', fps=100)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1912536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第57-agent机器人助理自动获取喵星人资讯

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第57-agent机器人助理自动获取喵星人资讯 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript…

FastReport 指定sql 和修改 数据库连接地址的 工具类 :FastReportHelper

FastReport 指定sql 和修改 数据库连接地址的 工具类 :FastReportHelper 介绍核心代码:完整代码: 介绍 在FastReport中,经常会遇到需要给 sql 加条件的情况,或者给数据库地址做更换。 (废话不多说&#x…

Elasticsearch基础(四):Elasticsearch语法与案例介绍

文章目录 Elasticsearch语法与案例介绍 一、Restful API 二、查询语法 1、ES分词器 2、ES查询 2.1、match 2.2、match_phrase 2.3、multi_match 2.4、term 2.5、terms 2.6、fuzzy 2.7、range 2.8、bool Elasticsearch语法与案例介绍 一、Restful API Elastics…

Echarts实现github提交记录图

最近改个人博客&#xff0c;看了github的提交记录&#xff0c;是真觉得好看。可以移植到自己的博客上做文章统计 效果如下 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf-8"> …

需求分析|泳道图 ProcessOn教学

文章目录 1.为什么使用泳道图2.具体例子一、如何绘制确定好泳道中枢的角色在中央基于事实来绘制过程不要纠结美观先画主干处理流程再画分支处理流程一个图表达不完&#xff0c;切分子流程过程数不超25 &#xff0c;A4纸的幅面处理过程过程用动词短语最后美化并加上序号酌情加上…

未羽研发测试管理平台

突然有一些觉悟&#xff0c;程序猿不能只会吭哧吭哧的低头做事&#xff0c;应该学会怎么去展示自己&#xff0c;怎么去宣传自己&#xff0c;怎么把自己想做的事表述清楚。 于是&#xff0c;这两天一直在整理自己的作品&#xff0c;也为接下来的找工作多做点准备。接下来…

2-29 基于matlab的CEEMD

基于matlab的CEEMD&#xff08;Complementary Ensemble Empirical Mode Decomposition&#xff0c;互补集合经验模态分解&#xff09;&#xff0c;先将数据精心ceemd分解&#xff0c;得到imf分量&#xff0c;然后通过相关系数帅选分量&#xff0c;在求出他们的样本熵的特征。用…

理解点对点协议:构建高效网络通信

在通信线路质量较差的年代&#xff0c;能够实现可靠传输的高级数据链路控制&#xff08;High-level Data Link Control, HDLC&#xff09;协议曾是比较流行的数据链路层协议。HDLC是一个较复杂的协议&#xff0c;实现了滑动窗口协议&#xff0c;并支持点对点和点对多点两种连接…

SpringBoot实现简单AI问答(百度千帆)

第一步&#xff1a;注册并登录百度智能云&#xff0c;创建应用并获取自己的APIKey与SecretKey&#xff0c;参考网址&#xff1a; 点击去百度智能云 第二步&#xff1a;引入千帆的pom依赖 <dependency><groupId>com.baidubce</groupId><artifactId>q…

我的FPGA

1.安装quartus 2.更新usb blaster驱动 3.新建工程 1.随便找一个文件夹&#xff0c;里面新建demo文件夹&#xff0c;表示一个个工程 在demo文件夹里面&#xff0c;新建src&#xff08;源码&#xff09;&#xff0c;prj&#xff08;项目&#xff09;&#xff0c;doc&#xff…

基于单片机的温控光控智能窗帘设计探讨

摘 要&#xff1a; 文章使用的核心原件是 AT89C52 单片机&#xff0c;以此为基础进行模块化的设计&#xff0c;在整个设计中通过加入光检测模块和温度检测模块&#xff0c;从而对室内的温度和光照强度进行检测&#xff0c;然后将检测得到的数据传输给单片机&#xff0c;单片机…

Mosh|内连接、外连接、左连接、右连接(未完)

下图取自菜鸟教程&#xff0c;侵权删&#xff5e; 一、内连接&#xff1a;Inner Joins 模版&#xff1a;SELECT * FROM A JOIN B ON 条件 含义&#xff1a;返回A与B的交集&#xff0c;列为AB列之和 练习&#xff1a;将order_items表和products表连接&#xff0c;返回产品id和…

成为编程大佬!!——数据结构与算法(1)——算法复杂度!!

前言&#xff1a;解决同一个程序问题可以通过多个算法解决&#xff0c;那么要怎样判断一个算法的优劣呢&#xff1f;&#x1f914; 算法复杂度 算法复杂度是对某个程序运行时的时空效率的粗略估算&#xff0c;常用来判断一个算法的好坏。 我们通过两个维度来看算法复杂度——…

记录docker部署好golang web项目后浏览器访问不到的问题

部署好项目&#xff0c;docker ps -a查看没有任何问题 端口映射成功&#xff0c;但是浏览器就是访问不到&#xff0c;排查后发现犯了个错&#xff0c;注意&#xff0c;项目配置文件中的端口&#xff1a; 其实也就是你项目中监听的端口&#xff1a; 必须和容器端口一致&#x…

Linux——多线程(四)

前言 这是之前基于阻塞队列的生产消费模型中Enqueue的代码 void Enqueue(const T &in) // 生产者用的接口{pthread_mutex_lock(&_mutex);while(IsFull())//判断队列是否已经满了{pthread_cond_wait(&_product_cond, &_mutex); //满的时候就在此情况下等待// 1.…

看影视学英语(假如第一季第一集)

in the hour也代表一小时吗&#xff1f;等同于in an hour&#xff1f;

Effective C++笔记之二十一:One Definition Rule(ODR)

ODR细节有点复杂&#xff0c;跨越各种情况。基本内容如下&#xff1a; ●普通&#xff08;非模板&#xff09;的noninline函数和成员函数、noninline全局变量、静态数据成员在整个程序中都应当只定义一次。 ●class类型&#xff08;包括structs和unions&#xff09;、模板&…

独立开发者系列(23)——Linux掌握小结

只要开发系统&#xff0c;就绕不开使用Linux服务器 &#xff0c;而Linux除了使用BT面板进行初级管理&#xff0c;很多稍微高级点的管理&#xff0c;还是需要命令行进行的。这里总结在不需要精通的情况下&#xff0c;掌握常见命令和环境的相关配置。 &#xff08;1&#xff09…

Linux学习之网络配置问题

Linux学习——那些我们网络配置遇到过的问题&#xff1f;ping不通百度&#xff1f;XShell连接不上&#xff1f;&#xff08;超详细&#xff09; &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感…

HTML 标签简写及全称:表格内容将通过JavaScript动态生成

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML 标签简写及全称</title><style>…