利用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


猜你喜欢
- 前言滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到环境准备pip
- 1. 如何阻止事件冒泡 //非IE if (event && event.stopPropagation) event.st
- 这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 本文实例为大家分享了python3.5基于TCP实现文件传输的具体代码,供大家参考,具体内容如下服务器代码# _*_ coding:utf-
- 如何编写具有良好结构的CSS?如果在设计流程中缺乏"秩序"或"章法"是非常不利的,你得冒着风险去添加
- 一般情况下,使用pip命令安装即可:[root@dthost27 ~]# pip install mysql-python但是在实际工作环境
- 一.绘制直线在OpenCV中,绘制直线需要获取直线的起点和终点坐标,调用cv2.line()函数实现该功能。该函数原型如下所示:img =
- 本文实例讲述了Bootstrap简单实用的表单验证插件BootstrapValidator用法。分享给大家供大家参考,具体如下:Bootst
- Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field.示
- 前言前面我们已经介绍了 python面向对象入门教程之从代码复用开始(一) ,这篇文章主要介绍的是关于Python面向对象之设置对
- 在为一个项目添加权限时,遇到一个问题,就是为项目所有的url设置权限,但是一个一个手动输入太麻烦了,所以考虑用代码获取到一个项目所有的url
- python中的绘图工具有不少,比如Matplotlib等等,但这些只能用来画表格,今天我们来介绍一款可以用来画画的库——turtle。一、
- 1、File > Setting > Project:xxx > Project Interpreter 选择或添加环境2
- 熟悉js的朋友很多都遇到过js的数组与字符串相互转换的情况,本文就此作一简单介绍,示例如下:一、数组转字符串需要将数组元素用某个字符连接成字
- 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操
- 问题缘由:负责公司的开发平台研发工作,考虑的知识产权的保护工作,必须要考虑java的加密技术和js脚本的加密技术。在目前java加密很容易破
- 前言通过Python实现对大麦网近期全国演唱会数据进行爬取,通过分析,我们发现大麦网属于Python爬虫策略中“中等型”难度网站,演唱会数据
- 本例子实现从hbase获取数据,并发送kafka。使用#!/usr/bin/env python#coding=utf-8import sy
- 有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的
- IntelliJ IDEA 2021最新激活码超详细教程,成功激活到2099年。每天专业人士测试,保证可以使用才分享给大家的,放心大胆使用哈