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

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

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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么将几首音乐合并在一起?这四种合并方法大家都在用!

怎么将几首音乐合并在一起?在音乐的海洋中遨游时,我们是否曾被音乐的海洋所淹没?在享受旋律的流转中,我们是否频繁地在不同的曲目间穿梭,仿佛迷失在无尽的音符之中?但音乐数量的繁多,不仅带来了…

思维+并查集,1670C - Where is the Pizza?

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1670C - Where is the Pizza? 二、解题报告 1、思路分析 考虑两个数组a,b的每个位置只能从a,b中挑一个 不妨记posa[x]为x在a中位置,posb同理 我们假如位置i挑选a[i]&a…

NISP证书备考指南与经验分享

在信息安全领域,NISP(国家信息安全水平考试)作为衡量专业能力的重要标尺,不仅是职场晋升的敲门砖,更是个人技能提升的关键一步。面对这一挑战,如何高效备考,成为众多学员关注的焦点。今天,为您精心打造这份…

大语言模型垂直化训练技术与应用

在人工智能领域,大语言模型(Large Language Models, LLMs)已经成为推动技术进步的关键力量,垂直化训练技术逐渐成为研究的热点,它使得大模型能够更精准地服务于特定行业和应用场景。本文结合达观数据的分享&#xff0c…

一次零基础 自“信息收集“到“权限维持“的渗透测试全程详细记录

一、渗透总流程 1.确定目标: 在本靶场中,确定目标就是使用各种扫描工具进行ip扫描,确定目标ip。 2.信息收集: 比如平常挖洞使用fofa,天眼查,ip域名等进行查,在我们这个靶场中比如使用Wappalyz…

pdf容量大小怎么改,pdf容量太大怎么变小

在数字化时代,pdf文件因其稳定性和跨平台兼容性而成为工作、学习和生活中不可或缺的文件格式。然而,随着文件内容的丰富,pdf文件的体积也日益增大,给存储和传输带来了不少困扰。本文将为你详细介绍多种实用的pdf文件压缩方法&…

Java文件操作和IO的小案例

文章目录 案例1案例2案例3 案例1 要求: 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。 代码实现: package shixun;import java.io.File; import…

【python学习】快速了解python基本数据类型

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 整数(int)2. 浮点数(float)3. 布尔值(bool&#xf…

关于string的‘\0‘与string,vector构造特点加部分特别知识点的讨论

目录 前言: 问题一:关于string的\0问题讨论 问题二:C标准库中的string内存是分配在堆上面吗? 问题三:string与vector的capacity大小设计的特点 问题四:string的流提取问题 问题五:迭代器失…

运筹说 第118期|存储论奠基人——肯尼斯·约瑟夫·阿罗

1.导读 前面我们已经了解了存储论的相关内容,相信大家一定也有所收获,下面我们将带着大家继续了解存储论的相关内容,在本次文章中我们将一起走近存储论的奠基人之一——肯尼斯约瑟夫阿罗Kenneth J.Arrow,希望能给大家…

In Search of Lost Online Test-time Adaptation: A Survey--论文笔记

论文笔记 资料 1.代码地址 https://github.com/jo-wang/otta_vit_survey 2.论文地址 https://arxiv.org/abs/2310.20199 3.数据集地址 1论文摘要的翻译 本文介绍了在线测试时间适应(online test-time adaptation,OTTA)的全面调查,OTTA是一种专注于使机器学习…

科技创新引领水利行业升级:深入分析智慧水利解决方案的核心价值,展望其在未来水资源管理中的重要地位与作用

目录 引言 一、智慧水利的概念与内涵 二、智慧水利解决方案的核心价值 1. 精准监测与预警 2. 优化资源配置 3. 智能运维管理 4. 公众参与与决策支持 三、智慧水利在未来水资源管理中的重要地位与作用 1. 推动水利行业转型升级 2. 保障国家水安全 3. 促进生态文明建设…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤: ① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL; ② 我们还要断言一下,指定的…

智慧灌区信息化系统完整解决方案

一、背景 随着科技的快速发展,智慧灌区信息化系统正逐渐成为提高农业灌溉效率、优化水资源配置的重要手段。本文将详细介绍智慧灌区信息化系统的完整解决方案,包括系统、功能、应用以及优势分析等方面,旨在为灌区的现代化和高效管理提供有力…

靶场练习 手把手教你通关DC系列 DC1

DC1靶场通关教程 文章目录 DC1靶场通关教程前言一、信息收集1.主机存活2.端口收集3.网页信息收集4.目录收集4.1 Nikto4.2 Dirb 信息收集总结 二、漏洞发现与利用1. 发现2. 利用 三、FlagFlag1Flag2Flag3Flag4Flag5(提权) 前言 本次使用的kali机的IP地址为192.168.243.131 DC1的…

倒计时 2 周!CommunityOverCode Asia 2024 IoT Community 专题部分

CommunityOverCode 是 Apache 软件基金会(ASF)的官方全球系列大会,其前身为 ApacheCon。自 1998 年以来,在 ASF 成立之前,ApacheCon 已经吸引了各个层次的参与者,在 300 多个 Apache 项目及其不同的社区中探…

给数组/对象添加一个(key-value)对象

需要将一个value值前面加上key值,放进数组/对象中 this.$set(res.data[0],type,1) this.$set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值。 结果:…

05.C1W4.Machine Translation and Document Search

往期文章请点这里 目录 OverviewWhat you’ll be able to do!Learning Objectives Transforming word vectorsOverview of TranslationTransforming vectors Align word vectorsSolving for RFrobenius normFrobenius norm squaredGradient K nearest neighborsFinding the tr…

Open3D 点对面的ICP算法配准(精配准)

目录 一、概述 1.1核心思想 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 3.3计算数据 一、概述 基于点对面的ICP(Iterative Closest Point)配准算法是ICP的一种变体,它通过最小化源…

骏网一卡通之类的游戏卡有什么用?

感觉现在打端游的人越来越少了 而且游戏充值卡显得就很鸡肋,在家里整理东西,翻出来好多骏网一卡通,但是我又不打游戏 想着把这卡送给有需要的朋友,不然也是浪费,问了一圈送不出去 还好最后在收卡云上卖掉了&#xf…