Python中的微积分应用:从追逐曲线到抛体运动
立即解锁
发布时间: 2025-08-29 10:09:32 阅读量: 5 订阅数: 8 


Python数学与AI应用入门
### Python 中的微积分应用:从追逐曲线到抛体运动
#### 1. 追逐曲线
追逐曲线是微积分中的一个重要主题,它描述了一个主体追逐移动目标时所走过的路径。由于追逐者直接朝着目标移动,而目标也在移动,这种情况会产生各种微分方程。这些代数运算可能会非常复杂,但这也正是微积分教授们喜欢这个主题的原因。通常,微分方程的求解是为了找到一个通用的代数解,即一个函数,而不是一个具体的数值。理论上,我们将值代入函数中,以确定特定时间下粒子的位置或房间的温度。使用 Python,我们可以通过对情况进行建模并找到数值解,从而跳过代数求解步骤。虽然这样做损失了一定的通用性,但计算变得更加简便。
##### 1.1 练习 12.19:找出捕食者追上猎物的位置
一只兔子从点 (0, 0) 开始,以每秒 1 个单位的速度沿正 y 轴方向奔跑。一只狐狸从点 (20, 0) 开始追逐兔子,其速度是兔子的 1.5 倍。那么,狐狸在哪个 y 值处追上兔子呢?
具体步骤如下:
1. 首先,我们需要从 `math` 模块中导入一些用于测量距离和角度的函数:
```python
from math import sqrt, atan2, sin, cos
```
2. 编写一个函数,使用勾股定理来测量捕食者和猎物位置之间的距离:
```python
def dist(x1, y1, x2, y2):
"""Returns distance from (x1,y1) to (x2,y2)"""
return sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
```
3. 关键在于,猎物和捕食者位置之间的 y 变化量与 x 变化量的比值代表了我们所需角度的正切值。我们已知它们的位置,因此使用反正切函数 `atan2` 来计算角度,使捕食者直接指向猎物。我们真正想知道的是,为了让捕食者向猎物移动 1 个单位,其 x 和 y 坐标需要改变多少。为了使捕食者转向猎物,我们需要找到两点之间的角度,如下所示:
```python
def towards(x1, y1, x2, y2):
"""Returns unit vector in [x,y] format from point 1 to point 2"""
dx, dy = x2 - x1, y2 - y1
angle = atan2(dy, dx)
return [cos(angle), sin(angle)]
```
我们计算 x 和 y 的变化量,使用反正切函数计算角度,然后使用余弦和正弦函数来确定捕食者的 x 和 y 坐标的相应变化,使其向猎物移动 1 个单位。
4. 现在,追逐开始。我们将捕食者和猎物放置在指定的位置,然后开始一个循环,在循环中让猎物移动 1 个单位(或者为了提高精度,移动一个增量):
```python
def chase():
predator_x, predator_y = 20, 0
predator_v = 1.5 # prey is 1
prey_x, prey_y = 0, 0
inc = 0.001
while dist(predator_x, predator_y, prey_x, prey_y) > 0.001:
prey_y += 1 * inc
p_vec = towards(predator_x, predator_y, prey_x, prey_y)
predator_x += predator_v * p_vec[0] * inc
predator_y += predator_v * p_vec[1] * inc
# print(dist(predator_x, predator_y, prey_x, prey_y))
return predator_y
```
5. 运行追逐函数,并打印出捕食者追上猎物时的 y 值:
```python
y = chase()
print("Y:", y)
print("dist:", dist(1, 1, 4, 5))
print("towards:", towards(1, 1, 2, 2.732))
```
输出结果如下:
```plaintext
Y: 23.997299988652507
dist: 5.0
towards: [0.5000110003630132, 0.8660190526287391]
```
这个结果非常接近理论值 24。
##### 1.2 练习 12.20:使用海龟模块可视化追逐曲线
在这个练习中,我们将可视化捕食者和猎物的路径,即追逐曲线。Python 中有一个内置模块,基于 Logo 编程语言的虚拟海龟概念,它可以让我们轻松创建虚拟代理,这些代理可以根据我们编写的代码在屏幕上移动。完成此练习的步骤如下:
1. 首先,从 `turtle` 模块导入所需的函数:
```python
from turtle import *
```
2. 根据所需的左下角点 (-30, -30) 和右上角点 (40, 40) 设置屏幕大小:
```python
setworldcoordinates(-30, -30, 40, 40)
```
3. 设置捕食者和猎物,即创建一个 `Turtle` 对象,并设置其颜色、位置和速度。海龟在移动时会留下轨迹,因此我们使用 `penup` 方法,使其在到达起始位置之前不绘制轨迹,然后使用 `pendown` 方法,使其开始绘制:
```python
# set up predator
predator = Turtle()
predator.color("red")
predator.penup()
predator.setpos(20, 0)
predator.pendown()
predator.speed(0)
# set up prey
prey = Turtle()
prey.color("green")
prey.shape("turtle")
prey.setheading(90)
prey.speed(0)
```
4. `pursue` 函数看起来可能很熟悉,但它包含了用于计算距离甚至指向另一个海龟的内置函数:
```python
def pursue():
inc = 0.05
while predator.distance(prey) > 0.05:
predator.setheading(predator.towards(prey))
prey.forward(inc)
predator.forward(1.5 * inc)
print("y:", predator.ycor())
```
5. 执行 `pursue` 函数,在打印输出后,告诉程序结束,以免图形窗口冻结:
```python
pursue()
done()
```
如果运行这段代码,你可以看到追逐的过程。最终输出的捕食者路径是一条对数曲线。
此外,我们还可以将猎物的路径改为圆形。在让猎物向前移动的代码行之后,添加以下代码:
```python
prey.left(.3)
```
这将使猎物每步向左转动一小角度。如果每次转动的角度相同,最终它会形成一个圆形路径。
#### 2. 位置、速度和加速度
微分方程常用于研究抛体的运动路径,这也可以说是微积分的起源。牛顿发明微积分工具是为了解决他在研究行星运动时产生的微分方程,并证明地球上的落体与绕轨道运行的行星遵循相同的物理定律。
##### 2.1 练习
0
0
复制全文
相关推荐









