利用Python绘画双摆操作分享

目录
  • 双摆问题
  • 2.运动过程
  • 3.公式推导过程

双摆问题

所谓双摆,就是两个连在一起的摆。

接下来本来是要推公式的,考虑考虑到大家可能会有公式恐惧症,同时又喜欢看图,所以把公式挪到后面。

所以,只需知道角速度的微分方程,就可写出对应的代码,其方程如下:

从而转为代码得到:

# 其中,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.公式推导过程

双摆的动能和势能分别为:

根据拉格朗日方程

则有:

其中,

展开可得则:

到此这篇关于利用Python画双摆的文章就介绍到这了,更多相关Python画双摆内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 啥是佩奇?使用Python自动绘画小猪佩奇的代码实例

    最近社会猪可是火遍了大江南北,不蹭下热度可对不起它.见过手画的佩奇,见过用代码画的吗? 没有?那就来看我大显身手. 用python的turtle库来画小猪佩奇. 有人问:turtle难不难? 答曰:不难,就那几个方法,跟入新手村的任务一样简单.难得是要有耐心跟一定的画画功底. 话不多说,直接上我苦苦搜寻(copy)而来的代码+注释版 温馨提示:您苦苦思念的佩奇猪在文末等你哦! # coding:utf-8 import turtle as t t.pensize(4) # 设置画笔的大小 t.c

  • Python绘画好看的星空图

    目录 一.先来看看Python星空图代码绘制成品 1两个人的星空 2明月相伴的星空 3浩瀚银河中的星空 4森林映衬下的星空 二.分解Python模拟3D星空图代码讲解 1下载并加载库 2设置屏幕和背景颜色 3在屏幕的右下角写下文字 4设置绘圆圈的基本语句 5定义一个生成背景图片的函数 6在代码中加入生成背景图片的语句 一.先来看看Python星空图代码绘制成品 1 两个人的星空 星空下,欲执子之手,相倚长青树.看皎洁月色,闻乡间气息,赏佳人芳心. 2 明月相伴的星空 圆圆明月赏晴空,星空满点洒心

  • 使用python的turtle绘画滑稽脸实例

    这是借鉴了一位兄弟的代码,然后进行修改的,原来代码存在问题,用了2小时,自己修改,终于画出了滑稽脸,也算是对于今天学的turtle绘画库的一个小小的记录吧!(有错误希望各位看官指正啊) 编译器是:Atom python 是3.7版本 运行位 Windows power shell import turtle turtle.setup(600,600,200,200) #fcae turtle.penup() turtle.goto(-210,0) turtle.seth(-90) turtle.

  • Python趣味挑战之turtle库绘画飘落的银杏树

    一.导入所需的库 import turtle import random from math import * 二.生成斐波那契数列 斐波那契数列是指前两项的和加起来等于后一项的一个数列,这里使用了两个函数来生成斐波契那数列. def Fibonacci_Recursion_tool(n): #斐波那契数列方法 if n <= 0: return 0 elif n == 1: return 1 else: return Fibonacci_Recursion_tool(n - 1) + Fibo

  • Python turtle绘画象棋棋盘

    通过使用turtle绘画象棋棋盘,供大家参考,具体内容如下 # 绘制象棋棋盘 import turtle t = turtle.Pen() t.width(2) # 设置画笔粗细 t.speed(1) # 设置画笔移动速度 # 画竖线 t.penup() t.goto(-400, -400) for i in range(9): t.pendown() if i != 0 and i != 8: t.goto(-400+i*100, 0) t.penup() t.goto(-400+i*100,

  • 基于Python中的turtle绘画星星和星空

    目录 前言: 一.画一个N边形 二.画五角星 三.一闪一闪亮晶晶 前言: Python 中的画图工具——turtle(海龟绘图),turtle 是 Python 中自带的绘图模块,最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言. 使用 turtle 控制画笔在画板上画画.而这个画笔是有形状的,默认是一个小箭头,我们可以使用 turtle.shape('turtle') 将其设成一个小海龟.

  • python用turtle库绘画圣诞树

    目录 前言 一.Turtle是什么? 二.使用步骤 1.引入库 2.turtle绘图的基础知识 三.圣诞树代码 总结 前言 圣诞节快到了,是不是想用python画一个可爱的圣诞树,我在各大网站都查了一下,都不太美观,然后我就学习了一下别人的代码改写了一下,自己加了一些东西,弄的好看一些了,给大家开源出来,欢迎大家指正学习,也欢迎转载,请注明出处哦~ 画出来的图形如图: 一.Turtle是什么? Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为

  • 你们要的Python绘画3D太阳系详细代码

    用Python画一个平面的太阳系得到一些朋友的欣赏,然后有同学提出了绘制三维太阳系的要求. 从Python画图的角度来说,三维太阳系其实并不难,问题在于八大行星对黄道面的倾斜太小,所以尽管画个三维的图,但就观感而言,无非是把二维的嵌入到三维空间罢了. 来点小行星 代码如下 from os import cpu_count import numpy as np from numpy.random import rand import matplotlib.pyplot as plt from ma

  • 一篇文章教你用Python绘画一个太阳系

    目录 日地月三体 日地火 太阳系 你们要的3D太阳系 图片上传之后不知为何帧率降低了许多... 日地月三体 所谓三体,就是三个物体在重力作用下的运动.由于三点共面,所以三个质点仅在重力作用下的运动轨迹也必然无法逃离平面. 三体运动所遵循的规律就是古老而经典的万有引力 则对于 m i 而言, 且 将其写为差分形式 由于我们希望观察三体运动的复杂形式,而不关系其随对应的宇宙星体,所以不必考虑单位制,将其在二维平面坐标系中拆分,则 #后续代码主要更改这里的参数 m = [1.33e20,3.98e14

  • python openCV自制绘画板

    本文实例为大家分享了python openCV自制绘画板的具体代码,供大家参考,具体内容如下 import numpy as np import cv2 def nothing(x): pass cv2.namedWindow('image') img = np.zeros((512,512,3),np.uint8) cv2.createTrackbar('R','image',0,255,nothing) cv2.createTrackbar('G','image',0,255,nothing

随机推荐