背景介绍:
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 动画没有秘密相关推荐

  1. 【第二讲】搭建界面,Excel读取,图片读取 -【Python动画设计教程】

    [Python动画设计教程]系列文章目录 [第一讲]软件准备 [第二讲]搭建界面,Excel读取,图片读取 [第三讲]图像绘制 [第四讲]制作动画 文章目录 1 搭建Qt界面 1.1 搭建界面 1.2 ...

  2. 【第四讲】制作动画 -【Python动画设计教程】

    [Python动画设计教程]系列文章目录 [第一讲]软件准备 [第二讲]搭建界面,Excel读取,图片读取 [第三讲]图像绘制 [第四讲]制作动画 文章目录 1 轮换序列的表格 2 根据表格轮换图片 ...

  3. 汉诺塔实践python_汉诺塔的python 动画演示

    1.简介 古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个 ...

  4. python动画精灵_【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画...

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...

  5. python动画精灵梦叶罗丽_精灵梦叶罗丽中出现过多少宝石盒子?灵犀阁的盒子造型最罕见...

    精灵梦叶罗丽第八季已经进入了暑期档的正式播出,不过每当想起要等待一周的时间才能看到下一集,也是有些心塞啊,所以说大家可以利用闲暇的时间回顾一下剧情,在细节中发现里面的一些有趣又好看好玩的事情或者是好看 ...

  6. python动画篮球大小_用Python把蔡徐坤打篮球视频转换成字符动画!

    说到现在网络最火的梗,非"蔡徐坤打篮球"莫属.最近,蔡徐坤当仁不让地成为了娱乐圈被黑的最惨的明星. 自从2019年1月份,蔡徐坤成为了NBA官方形象代言人之后,他打篮球的视频片段被 ...

  7. python 动画场景_clarisse电影级CG场景渲染中文教学

    clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级C ...

  8. 51个Python鲜为人知的秘密特性,老司机看完都惊叹不已

    Python真的很奇妙,目前是最火的语言.语法简单,功能强大,我学Python已经好多年了,从2.6的时代一直到现在的3.8,算算也是老鸟了.今天看了一个网站,上面讲了很多Python鲜为人知的特性, ...

  9. 圣诞老人python代码_Python秘密圣诞老人程序如何取得更高的成功R

    我决定做一个Python程序,根据硬编码的限制生成秘密的圣诞老人对(例如,某人找不到他的妻子).我的家庭成员都很忙,所以很难组织每个人随意画帽子.在 我的程序死机很少,因为不幸的随机配对使剩余的一对非 ...

最新文章

  1. cocos 卡牌类_优质链游大爆发,Cocos-BCX版《恶龙必须死》有什么特别之处?
  2. 收藏喜+1!值得使用的100个Python小技巧
  3. Linux常用命令汇总-cut
  4. ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件...
  5. Android ContentProvider、ContentResolver和ContentObserver的使用
  6. 用户类java,通过Java中的类和接口实现不同的用户类型
  7. 小小鸡蛋竟然能够承受1200kg重量!?
  8. 大学计算机试卷分析报告,(最新整理)大学试卷分析报告
  9. halcon中的面向对象,数据保存(续)
  10. IGS Viewer / IGS 文件查看器
  11. win10计算机的数字小键盘,win10开启数字小键盘的方法(图文)
  12. 使用JS调用迅雷下载网站本地视频,生成迅雷下载链接
  13. 排列组合数计算公式及性质
  14. 全球光伏多晶硅价格上涨 中美贸易纠纷不断
  15. html 和 css 代码 总结
  16. 计算机二级正式样式在哪里,满分新建样式,修改样式要学会-计算机二级等考office的省时利器...
  17. CCNet: Criss-Cross Attention for Semantic Segmentation阅读笔记
  18. Windows server2016 计算机管理中找不到用户和组
  19. 虾皮shopee根据ID取商品详情 API 返回值说明
  20. 文件夹病毒或1K病毒解决

热门文章

  1. vue antvG6 多功能tree图 树图树结构
  2. Spring面向切面编程(AOP)详解
  3. 【微信辅助】解放自媒体双手,微信好友验证建群拉群一步到位
  4. javascript oo实现(面向对象)
  5. php yii框架路由,yii框架怎样定义路由_PHP开发框架教程
  6. js 实现post跳转页面
  7. 饥荒私人服务器设定修改,饥荒服务器-自定义世界设置
  8. motorola摩托罗拉笔试题2
  9. matlab 2017b破解版安装教程
  10. android代码设置锁屏签名,华为手机怎么设置锁屏文字签名?