Python 动画没有秘密
背景介绍:
Sugar 上次写过一篇《MATLAB 动画没有秘密》,这次是其姐妹篇:Python 动画也没有秘密。
但这个妹篇比姐姐要成熟很多,不仅说了如何用 Python 绘图、做动画,还由浅入深丰富了更多的知识内容。
想知道丰富了什么就请往下看吧!
Python 基本绘图
在做动画之前,先用下面的例子来看下 Python 是怎样绘图的:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animationx = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)fig = plt.figure(tight_layout=True)
plt.plot(x,y)
plt.grid(ls="--")
plt.show()
Sugar 在 Thonny IDE 下的效果是这样的:
【解读】
1、linspace()
函数与 MATLAB 的同名函数作用相同,可以参考《MATLAB 动画没有秘密》;
2、tight_layout = True
是让绘图自动紧凑布局,以免文字遮挡图线,详细请参考《matplotlib 进阶之Tight Layout guide》
3、ls="--"
这个 ls 指的是 linestyle
,指定图线的线型(与 MATLAB 非常类似),详细请参考《matplotlib绘图线条样式和线条颜色》、《Python可视化中Matplotlib(线条的详细样式及线型、保存图片、plot的详细风格和样式)、背景色、点和线的详细设置》
需要注意的是本例的 ls="--"
设定提网格线型,这一点 Sugar 觉得比 MATLAB 要灵活。
Python 基本动画
试一试下面的例子:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animationdef update_points(num):'''更新数据点'''point_ani.set_data(x[num], y[num])return point_ani,x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)fig = plt.figure(tight_layout=True)
plt.plot(x,y)
point_ani, = plt.plot(x[0], y[0], "ro")
plt.grid(ls="--")
# 开始制作动画
ani = animation.FuncAnimation(fig, update_points, np.arange(0, 100), interval=100, blit=True)# ani.save('sin_test2.gif', writer='imagemagick', fps=10)
plt.show()
效果:
【解读】
弹球建模
MATLAB 的弹球建模见《matlab三个简单物理建模实例(笔记)》
Sugar 把《matlab三个简单物理建模实例(笔记)》对译成一份 Python 版,通过对比会发现 matplotlib 与 MATLAB 很相似,非常的易学。
一、自由落体建模
import numpy as np
import matplotlib
import matplotlib.pyplot as pltg=9.8 # 重力加速度
v=0 # 设定初始速度条件
s=[0] # 设定初始位移条件
t=[0] # 设定起始时间
dt=0.1 # 设置计算步长
N=20 # 设置仿真递推次数. 仿真时间等于N与dt的乘积
for k in range(0,N):v=v+g*dt # 计算新时刻的速度s.append(s[k]+v*dt) # 新位移t.append(t[k]+dt) # 时间更新# 理论计算, 以便与仿真结果对照
t_theory=np.arange(0, N*dt, 0.01) # 设置解析计算的时间点
v_theory=g*t_theory # 解析计算的瞬时速度
s_theory=1/2*g*(t_theory**2) # 解析计算的瞬时位移# 作图: 仿真结果与解析结果对比
t=np.arange(0,N*dt+0.01,dt)
p1,p2 = plt.plot(t,s,'o', t_theory,s_theory, '-')
plt.legend([p1, p2], ["仿真结果", "理论结果"], loc='upper left', prop={'family':'SimHei','size':15})
plt.show()
效果:
改进一下:
import numpy as np
import matplotlib
import matplotlib.pyplot as pltg=9.8 # 重力加速度
v=[0] # 设定初始速度条件
s=[0] # 设定初始位移条件
t=[0] # 设定起始时间
dt=0.1 # 设置计算步长
N=20 # 设置仿真递推次数. 仿真时间等于N与dt的乘积
for k in range(0,N):v.append(v[k]+g*dt) # 计算新时刻的速度s.append(s[k]+v[len(v)-1]*dt) # 新位移t.append(t[k]+dt) # 时间更新# 理论计算, 以便与仿真结果对照
t_theory=np.arange(0, N*dt, 0.01) # 设置解析计算的时间点
v_theory=g*t_theory # 解析计算的瞬时速度
s_theory=1/2*g*(t_theory**2) # 解析计算的瞬时位移# 作图: 仿真结果与解析结果对比
t=np.arange(0,N*dt+0.01,dt)
plt.subplot(1,2,1)
p1,p2 = plt.plot(t,s,'o', t_theory,s_theory, '-')
plt.legend([p1, p2], ["位移仿真结果", "位移理论结果"], loc='upper left', prop={'family':'SimHei','size':15})
plt.subplot(1,2,2)
p3,p4 = plt.plot(t,v,'o', t_theory,v_theory, '-')
plt.legend([p3, p4], ["速度仿真结果", "速度理论结果"], loc='upper left', prop={'family':'SimHei','size':15})
plt.show()
效果:
这里仔细思考一下“位移的仿真结果为什么会在理论结果之上”,这个问题的答案就是离散采样的误差来源之一。如果想明白了,那么就能做出下面这个效果:
知道了离散采样的误差来源,就能想办法消除相应的误差,那么就会达到下图的效果:
看到这里就能理解:为什么在控制上总是倾向于更高速的处理器。以上两图的代码可以在 MultiMCU EDU 公众号后台回复 py01
获得,如果读者动脑想了,不妨与 Sugar 的代码对比一下是不是一样。
二、弹球建模
理解了上面的自由落体仿真,下面就用动画形式展示一下小球自由落体触地之后的情况。为使模型简单方便理解,需做出如下假设:
1、忽略空气阻力;
2、落点为光滑水平面,触地立即反弹;
3、固定撞击损耗(每撞击一次速度降为原来的 85%)。
下面先来看一下效果:
然后给出 Python 代码,如下:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animationdef update_points_pos(num):ani_pos.set_data(x[num], y[num])return ani_pos,def update_points_vel(num):ani_vel.set_data(x[num], v[num])return ani_vel,g=9.8 # 重力加速度
v0=0 # 初始速度
y0=1 # 初始位置
m=1 # 小球质量
t0=0 # 起始时间
K=0.85 # 弹跳的损耗系数
N=1100 # 仿真的总步进数
dt=0.005 # 仿真步长
v=[v0] # 初状态
y=[y0]
vx=2 # 水平速度
x=[0] # 水平方向的初始位置for k in range(1,N): if y[len(y)-1]>0: # 小球在空中的动力方程计算v.append(v[len(v)-1] - g*dt)y.append(y[len(y)-1] + v[len(v)-1]*dt)else: # 碰击瞬间的计算y.append(-K*v[len(v)-1]*dt) v.append(-K*v[len(v)-1]-g*dt) x.append(x[len(x)-1] + vx*dt)fig1 = plt.figure(tight_layout=True)
plt.plot(x,y,"--")
ani_pos, = plt.plot(x[0], y[0], "ro")
plt.axis([-2, 13, 0, 1])fig2 = plt.figure(tight_layout=True)
plt.plot(x,v,"--")
ani_vel, = plt.plot(x[0], v[0], "ro")
plt.axis([-2, 13, -6, 6])ani01 = animation.FuncAnimation(fig1, update_points_pos, np.arange(0, N), interval=15, blit=True)
ani02 = animation.FuncAnimation(fig2, update_points_vel, np.arange(0, N), interval=15, blit=True)plt.show()
三、Zeno 行为
弹球是展示 Zeno 现象的最简单模型之一。一般来说,Zeno 行为的特征可非正式地表示为某些混合动力系统(Hybrid System)在有限时间间隔内发生无限数量的事件。在弹球模型中,球在失去能量的同时,将以越来越小的时间间隔与地面发生多次碰撞。因此,模型会经历 Zeno 行为。具有 Zeno 行为的模型很难在计算机上进行仿真,但在许多常见的重要工程应用中又时常出现。
Wikipedia 上对于 zeno behavior 的英文描述如下:
英文不太熟的可以看下面这个自动翻译来了解一下这个有趣的现象:
四、MATLAB Simulink 弹球仿真
MATLAB Simulink 的弹球仿真本文不展开,留个链接如下:
https://ww2.mathworks.cn/help/simulink/slref/simulation-of-a-bouncing-ball.html
不展开的原因是理论基础有点高,要了解最常用的积分变换方法之一:拉普拉斯变换。这里给出与弹球仿真相关的两个拉低变换表,以供愿意研究 Simulink 的读者参考。
关注作者
欢迎扫码关注我的公众号MultiMCU EDU
。
提示:在公众号“关于我”页面可加作者微信好友。
喜欢本文求点赞,有打赏我会更有动力。
Python 动画没有秘密相关推荐
- 【第二讲】搭建界面,Excel读取,图片读取 -【Python动画设计教程】
[Python动画设计教程]系列文章目录 [第一讲]软件准备 [第二讲]搭建界面,Excel读取,图片读取 [第三讲]图像绘制 [第四讲]制作动画 文章目录 1 搭建Qt界面 1.1 搭建界面 1.2 ...
- 【第四讲】制作动画 -【Python动画设计教程】
[Python动画设计教程]系列文章目录 [第一讲]软件准备 [第二讲]搭建界面,Excel读取,图片读取 [第三讲]图像绘制 [第四讲]制作动画 文章目录 1 轮换序列的表格 2 根据表格轮换图片 ...
- 汉诺塔实践python_汉诺塔的python 动画演示
1.简介 古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个 ...
- python动画精灵_【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画...
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...
- python动画精灵梦叶罗丽_精灵梦叶罗丽中出现过多少宝石盒子?灵犀阁的盒子造型最罕见...
精灵梦叶罗丽第八季已经进入了暑期档的正式播出,不过每当想起要等待一周的时间才能看到下一集,也是有些心塞啊,所以说大家可以利用闲暇的时间回顾一下剧情,在细节中发现里面的一些有趣又好看好玩的事情或者是好看 ...
- python动画篮球大小_用Python把蔡徐坤打篮球视频转换成字符动画!
说到现在网络最火的梗,非"蔡徐坤打篮球"莫属.最近,蔡徐坤当仁不让地成为了娱乐圈被黑的最惨的明星. 自从2019年1月份,蔡徐坤成为了NBA官方形象代言人之后,他打篮球的视频片段被 ...
- python 动画场景_clarisse电影级CG场景渲染中文教学
clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级C ...
- 51个Python鲜为人知的秘密特性,老司机看完都惊叹不已
Python真的很奇妙,目前是最火的语言.语法简单,功能强大,我学Python已经好多年了,从2.6的时代一直到现在的3.8,算算也是老鸟了.今天看了一个网站,上面讲了很多Python鲜为人知的特性, ...
- 圣诞老人python代码_Python秘密圣诞老人程序如何取得更高的成功R
我决定做一个Python程序,根据硬编码的限制生成秘密的圣诞老人对(例如,某人找不到他的妻子).我的家庭成员都很忙,所以很难组织每个人随意画帽子.在 我的程序死机很少,因为不幸的随机配对使剩余的一对非 ...
最新文章
- cocos 卡牌类_优质链游大爆发,Cocos-BCX版《恶龙必须死》有什么特别之处?
- 收藏喜+1!值得使用的100个Python小技巧
- Linux常用命令汇总-cut
- ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件...
- Android ContentProvider、ContentResolver和ContentObserver的使用
- 用户类java,通过Java中的类和接口实现不同的用户类型
- 小小鸡蛋竟然能够承受1200kg重量!?
- 大学计算机试卷分析报告,(最新整理)大学试卷分析报告
- halcon中的面向对象,数据保存(续)
- IGS Viewer / IGS 文件查看器
- win10计算机的数字小键盘,win10开启数字小键盘的方法(图文)
- 使用JS调用迅雷下载网站本地视频,生成迅雷下载链接
- 排列组合数计算公式及性质
- 全球光伏多晶硅价格上涨 中美贸易纠纷不断
- html 和 css 代码 总结
- 计算机二级正式样式在哪里,满分新建样式,修改样式要学会-计算机二级等考office的省时利器...
- CCNet: Criss-Cross Attention for Semantic Segmentation阅读笔记
- Windows server2016 计算机管理中找不到用户和组
- 虾皮shopee根据ID取商品详情 API 返回值说明
- 文件夹病毒或1K病毒解决