利用Python绘画双摆操作分享
作者:微小冷 发布时间:2022-12-08 21:30:36
标签:Python,绘画,双摆
1.双摆问题
所谓双摆,就是两个连在一起的摆。
接下来本来是要推公式的,考虑考虑到大家可能会有公式恐惧症,同时又喜欢看图,所以把公式挪到后面。
所以,只需知道角速度的微分方程,就可写出对应的代码,其方程如下:
从而转为代码得到:
# 其中,lam,mu,G_L1,M为全局变量
def derivs(state, t):
dydx = np.zeros_like(state)
th1,om1,th2,om2 = state
dydx[0] = state[1]
delta = state[2] - state[0]
cDelta, sDelta = np.cos(delta), np.sin(delta)
sTh1,_,sTh2,_ = np.sin(state)
den1 = M - mu*cDelta**2
dydx[1] = (mu * om1**2 * sDelta * cDelta
+ mu * G_L1 * sTh2 * cDelta
+ mu * lam * om2**2 * sDelta
- M * G_L1 * sTh1)/ den1
dydx[2] = state[3]
den2 = lam * den1
dydx[3] = (- mu * lam * om2**2 * sDelta * cDelta
+ M * G_L1 * sTh1 * cDelta
- M * om1**2 * sDelta
- M * G_L1 * sTh2)/ den2
return dydx
接下来根据微分方程的解,便可进行绘图。
# 这段代码用于设置初值,并调用integrate求解微分方程组
import numpy as np
import scipy.integrate as integrate
G = 9.8
L1,L2 = 1.0, 1.0
G_L1 = G/L1
lam = L2/L1 #杆长度比L2/L1
mu = 1.0 #质量比M2/M1
M = 1+mu
# 生成时间
dt = 0.01
t = np.arange(0, 20, dt)
th1,th2 = 120.0, -10.0 #初始角度
om1,om2 = 0.0, 0.00 #初始角速度
state = np.radians([th1, om1, th2, om2])
# 微分方程组数值解
y = integrate.odeint(derivs, state, t)
# 真实坐标
x1 = L1*sin(y[:, 0])
y1 = -L1*cos(y[:, 0])
x2 = L2*sin(y[:, 2]) + x1
y2 = -L2*cos(y[:, 2]) + y1
至此,就得到了所有位置处的坐标,从而可以观察到双摆的轨迹如图所示
绘图代码为:
import matplotlib.pyplot as plt
plt.scatter(x1,y1,marker='.')
plt.scatter(x2,y2,marker='.')
plt.show()
若将时间设置得长一点,然后在画图的时候更改一下颜色,就会看到双摆的运动区间,可见自然界还是挺有情怀的
其绘图代码为:
plt.plot(x1,y1,marker='.',alpha=0.2, linewidth=0.2)
plt.plot(x2,y2,marker='.',alpha=0.2, linewidth=2, c='r')
plt.axis('off')
plt.show()
当然,也可以将其运动轨迹以一种三维的形式绘制出来
ax = plt.gca(projection='3d')
ax.plot3D(t,x1,y1,linewidth=1)
plt.show()
额……好吧,看来并没有什么情怀。
但是,如果把这两个小球分别当作两个星球,而我们又在一颗星球上,那么所观测到的另一颗星球的运动大致如下,不出意外是个圆,毕竟圆形二者之间的距离是恒定的。
绘图代码为:
ax = plt.gca(projection='3d')
ax.plot3D(t,x2-x1,y2-y1,linewidth=0.5)
plt.show()
如果更改一下初值,则图形将有如下变化
初值设为:
th1,th2 = 0, 0 #初始角度
om1,om2 = 120.0, 108.00 #初始角速度
2.运动过程
最后,还是传统技能,绘制一下双摆的运动过程如下:
代码为:
import matplotlib.animation as animation
# 下面为绘图过程
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(111, autoscale_on=False, xlim=(-2, 2), ylim=(-2, 2))
ax.set_aspect('equal')
ax.grid()
line, = ax.plot([], [], 'o-', lw=2)
time_template = 'time = %.1fs'
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)
# 初始化图形
def init():
line.set_data([], [])
time_text.set_text('')
return line, time_text
def animate(i):
thisx = [0, x1[i], x2[i]]
thisy = [0, y1[i], y2[i]]
line.set_data(thisx, thisy)
time_text.set_text(time_template % (i*dt))
return line, time_text
ani = animation.FuncAnimation(fig, animate, range(1, len(y)),
interval=dt*1000, blit=True, init_func=init)
ani.save("dua_1.gif",writer='imagemagick')
plt.show()
3.公式推导过程
双摆的动能和势能分别为:
根据拉格朗日方程
则有:
其中,
展开可得则:
来源:https://blog.csdn.net/m0_37816922/article/details/123850164
0
投稿
猜你喜欢
- 前言web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展。然而,正所谓成也萧何败也萧何,开放的特性、搜索引
- ISNULL 使用指定的替换值替换 NULL。 &nb
- 在 玉伯 的文章 《一道大题目,嘿嘿》 中有这样一段代码:[] == ![]也许很多同学迷惑:咦,这个如何转换呢?首先,我们了解下逻辑 NO
- 目录一、Python GUI 编程简介二、流行GUI框架总结三、代码演示四、界面一、Python GUI 编程简介Tkinter 模块(Tk
- asp 在线备份 恢复 sql server 数据库,对于远程没有提供sql server远程连接或打包下载的朋友是个临时解决方法,对于大数
- 常用当前循环.作用default数据为空时设置默认值length取变量长度filesizeformat文件大小转成可读slice从指定位置到
- 本文主要介绍的是MySQL慢查询分析方法,前一段日子,我曾经设置了一次记录在MySQL数据库中对慢于1秒钟的SQL语句进行查询。想起来有几个
- 在你自己安装了一个新的MySQL服务器后,你需要为MySQL的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MySQL
- Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–>迭代器定义:对于list、string、tuple
- 本文实例讲述了js控制多图左右滚动切换效果。分享给大家供大家参考。具体如下:这是一款纯js实现点击左右按钮图片自动左右平滑滚动,默认5个一组
- 选择了MySQL的安装版本后,要做的第二项决策是你是使用源码分发版还是二进制分发版。大多数情况,如果你的平台上已经有了一个二进制分发版,你可
- 本文实例讲述了Django实现简单分页功能的方法。分享给大家供大家参考,具体如下:使用django的第三方模块django-pure-pag
- 方法1: 代码如下:truncate table TableName 删除表中的所有的数据的同时,将自动增长清零。 如果有外键参考这个表,这
- 5月20日,微软正式提供了Windows XP下可用的雅黑字体下载,雅黑字体是一款近乎完美的字体,解决了宋体小文字无法辩认的问
- 本文实例讲述了Python使用爬虫抓取美女图片并保存到本地的方法。分享给大家供大家参考,具体如下:图片资源来自于www.qiubaichen
- 因为需要一个html形式的数据统计界面,所以做了一个基于pyecharts包的可视化程序,当然matplotlib还是常用的数据可视化包,只
- 1、程序执行代码:#Author by Andy#_*_ coding:utf-8 _*_import os,sys,timeBase_di
- 这两副图片哪张更能勾起你买东西的欲望呢?相信大多数买家更喜欢看大图,实物图,产品细节图等.如果我们的卖家更能倾听下我们买家的心声.他们的产品
- number(<p>,<s>)精度p取值范围1~38有效位s取值范围-84~127最高整数位数=p-ss正数,小数点
- 自从SQL Server 2005推出后,因为有了更好的性能,所以有很多与SQL Server 2000相关的应用程序需要升级到这个版本。但