Py学习  »  Python

我用Python模拟了谷爱凌的凌空一跃

图灵教育 • 2 年前 • 302 次点击  

题图 | 央视新闻 - https://weibo.com/u/2656274875



明天上午,谷爱凌将代表中国队冲击自由式滑雪女子U型场地技巧赛金牌。预祝她再创佳绩!


上图源自央视新闻微博


虽然谷爱凌获得大跳台首金已经过去好些天,但大家还意犹未尽地热议着她的“惊鸿一跳”


碰巧我这段时间正在学图灵新出版的《程序员数学:用 Python 学透线性代数和微积分》一书,刚好学到用欧拉方法近似计算运动对象的轨迹


谷爱凌的凌空一跃让我灵光乍现:这不就是绝佳的练手机会吗?


所谓学以致用,我决定尝试用书中知识模拟谷爱凌的大跳台抛物线。


更具体的背景知识请见《程序员数学:用Python学透线性代数和微积分》一书的第 9 章。


接下来就开始吧!


我们要做的是编写一个 Python 函数,用来实现欧拉方法,然后用该函数模拟谷爱凌的致胜一跳。


欧拉方法是一种近似积分的重要技巧。它的核心思想是从一个量的初始值(如坐标)和一个描述其导数(如速度和加速度)的方程开始,根据导数求这个量变化后的值



定义“爱凌跳”函数


我把这个Python 函数命名为eileen_jump。它接受以下参数。


- s0:初始坐标

- v0:初始速度

- a:加速度向量

- total_time:要模拟的总时间

- step_count:步数


以下是函数 eileen_jump 的定义,其中的函数 add 和 scale 稍后定义。


def eileen_jump(s0,v0,a,total_time,step_count):    trajectory = [s0]    s = s0    v = v0    dt = total_time/step_count # 每个时间阶段的持续时间dt是总时间除以步数    for _ in range(0,step_count):        s = add(s,scale(dt,v))        v = 


    
add(v,scale(dt,a))        trajectory.append(s)    return trajectory



计算参数值


当谷爱凌从首钢滑雪大跳台腾空时,她的重力加速度是 9.80 m/s²重力加速度是一个指向地心的向量,任何抛射物(人)都有同样的加速度向量。


我们以大跳台为基础,构建一个二维坐标系。在这个坐标系中,谷爱凌腾空时刻的加速度向量为:


a = (0, -9.80)



根据清华大学建筑学院院长、首钢滑雪大跳台总设计师张利在《开讲啦》分享的一张设计图,我粗略计算,首钢滑雪大跳台的起跳台高度约为 4 米。


也就是说,谷爱凌腾空时刻的坐标为:
s0 = (0, 4)


根据媒体发布的数据,谷爱凌的起跳角度约为 35 度,起跳速度约为 13.8m/s,因此初始速度为:
(13.8·cos(35°), 13.8*sin(35°))


剩下两个参数可以这样取值。

total_time = 2.3

step_count = 100



模拟轨迹


万事俱备,接下来导入要用到的 Python 包,开始模拟。完整代码如下所示:


from


    
 math import pi,sin,cos import matplotlib.pyplot as plt  
# 定义scale函数def scale(scalar,v): return (scalar * v[0], scalar * v[1])
# 定义add函数def add(v1,v2): return (v1[0] + v2[0], v1[1] + v2[1])
# 定义eileen_jump函数def eileen_jump(s0,v0,a,total_time,step_count): trajectory = [s0] s = s0 v = v0 dt = total_time/step_count # 每个时间阶段的持续时间dt是总时间除以步数 for _ in range(0,step_count): s = add(s,scale(dt,v)) v = add(v,scale(dt,a)) trajectory.append(s) return trajectory
if __name__ == '__main__':
angle = 35 * pi/180 s0 = (0,4) v0 = (13.8*cos(angle),13.8*sin(angle)) a = (0,-9.80)
result = eileen_jump(s0,v0,a,2.3,100)
for r in result: x, y = r[0] , r[1] plt.scatter(x,y)     plt.show()

模拟结果如下:



当然,各个参数的取值并不严格精确。如果能知道它们的精确值,那么模拟结果将更准确。



新 书 推 荐

保罗·奥兰德(Paul Orland)——著

百度KFive —— 译



代码和数学是相知相惜的好伙伴,它们基于共同的理性思维,数学公式的推导可以自然地在编写代码的过程中展开。


本书将带领程序员使用自己擅长的工具,即代码,来解决机器学习和游戏设计等领域中的数学问题,重新发现数学之美。





向上滑动查看目录


第1章 通过代码学数学 1
1.1 使用数学和软件解决商业问题 2
1.2 如何高效学习数学 9
1.3 用上你训练有素的左脑 11
1.4 小结 14
第一部分 向量和图形
第2章 二维向量绘图 16
2.1 二维向量绘图 16
2.2 平面向量运算 25
2.3 平面上的角度和三角学 41
2.4 向量集合的变换 57
2.5 用Matplotlib绘图 61
2.6 小结 62
第3章 上升到三维世界 63
3.1 在三维空间中绘制向量 64
3.2 三维空间中的向量运算 70
3.3 点积:测量向量对齐 78
3.4 向量积:测量定向区域 88
3.5 在二维平面上渲染三维对象 96
3.6 小结 102
第4章 变换向量和图形 103
4.1 变换三维对象 105
4.2 线性变换 117
4.3 小结 132
第5章 使用矩阵计算变换 134
5.1 用矩阵表示线性变换 135
5.2 不同形状矩阵的含义 148
5.3 用矩阵平移向量 163
5.4 小结 174
第6章 高维泛化 176
6.1 泛化向量的定义 177
6.2 探索不同的向量空间 188
6.3 寻找更小的向量空间 205
6.4 小结 220
第7章 求解线性方程组 222
7.1 设计一款街机游戏 223
7.2 找到直线的交点 227
7.3 将线性方程泛化到更高维度 240
7.4 通过解线性方程来改变向量的基 253
7.5 小结 257
第二部分 微积分和物理仿真
第8章 理解变化率 261
8.1 根据体积计算平均流速 262
8.2 绘制随时间变化的平均流速 266
8.3 瞬时流速的近似值 271
8.4 体积变化的近似值 278
8.5 绘制随时间变化的体积图 283
8.6 小结 290
第9章 模拟运动的对象 291
9.1 模拟匀速运动 291
9.2 模拟加速 295
9.3 深入研究欧拉方法 296
9.4 用更小的时间步执行欧拉方法 300
9.5 小结 305
第 10章 使用符号表达式 306
10.1 用计算机代数系统计算精确的导数 309
10.2.1 将表达式拆分成若干部分 310
10.2.3 使用Python语言实现表达式树 311
10.2.4 练习 313
10.3 符号表达式的应用 315
10.4 求函数的导数 323
10.5 自动计算导数 330
10.6 符号化积分函数 335
10.7 小结 338
第 11章 模拟力场 339
11.1 用向量场对引力建模 339
11.2 引力场建模 342
11.3 把引力加入小行星游戏 345
11.4 引入势能 350
11.5.1 用横截面测量陡度 354
11.5.2 计算偏导数 356
11.5.3 用梯度求图形的陡度 357
11.5.4 用势能的梯度计算力场 359
11.5.5 练习 361
11.6 小结 364
第12章 优化物理系统 365
12.1 测试炮弹模拟器 367
12.2 计算最佳射程 373
12.3 增强模拟器 381
12.4 利用梯度上升优化范围 388
12.5 小结 399
第13章 用傅里叶级数分析声波 400
13.1 声波的组合和分解 401
13.2 用Python播放声波 402
13.3 把正弦波转化为声音 406
13.4 组合声波得到新的声波 412
13.5 将声波分解为傅里叶级数 419
13.6 小结 428
第三部分 机器学习的应用
第14章 数据的函数拟合 431
14.1 衡量函数的拟合质量 433
14.2 探索函数空间 441
14.3 使用梯度下降法寻找最佳拟合线 445
14.4 非线性函数拟合 448
14.5 小结 453
第15章 使用logistic回归对数据分类 455
15.1 用真实数据测试分类函数 456
15.2 绘制决策边界 460
15.3 将分类问题构造为回归问题 464
15.4 探索可能的logistic函数 471
15.5 寻找最佳logistic函数 477
15.6 小结 483
第16章 训练神经网络 484
16.1 用神经网络对数据进行分类 485
16.2 手写数字图像分类 486
16.3 设计神经网络 491
16.4 用Python构建神经网络 499
16.5 使用梯度下降法训练神经网络 504
16.6 使用反向传播计算梯度 509
16.7 小结 513
附录A 准备Python(图灵社区下载)
附录B Python技巧和窍门(图灵社区下载)
附录C 使用OpenGL和PyGame加载和渲染三维模型(图灵社区下载)
附录D 数学符号参考(图灵社区下载)




名人推荐


“这本书循序渐进地介绍了程序员应该掌握的有用的数学概念。” 

——Christopher Haupt,Swoogo 公司工程副总裁 


 “这本书严谨而简明地概述了对现代编程起支撑作用的数学知识。” 

——Dan Sheikh,BCG Digital Ventures 公司工程师 


 “实用、引人入胜。推荐所有程序员阅读。” 

——Vincent Zhu,RethinkXSocia 网站联合创始人兼CTO


 “这本书为需要提高数学技能的程序员建造了一座桥梁,使数学不再那么神秘、那么难以理解。” 

——Robert Walsh,Excalibur Solutions 公司总裁




参考资料:


https://tv.cctv.com/2021/10/24/VIDEd6UZkFcseVOReA7Wvpqw211024.shtml

 

https://content-static.cctvnews.cctv.com/snow-book/video.html?item_id=17236332578558502720

 

https://w.yangshipin.cn/video?type=0&vid=f000010uqrc&channel=ysyy_aoyun



各位小伙伴,如果您对这本书感兴趣可以加下面的群,在这里你会找到更多志同道合的小伙伴,可以一起探讨一下学习python或数学时面临的问题~


python交流群

数学交流群


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/127229
 
302 次点击