如何用pylab的streamplot函数绘制单摆运动相平面?
如何用streamplot绘制单摆运动的相平面?
嘿,我来帮你搞定这个单摆相平面的绘制!首先得明确:streamplot是用来可视化一阶自治微分方程组的,而你的单摆方程是二阶的,所以第一步要把它拆成两个一阶方程,就像你之前处理捕食者-猎物模型那样。
步骤1:把二阶方程转化为一阶方程组
单摆的运动方程是:
d²θ/dt² = (-g/L)sin(θ)
我们引入状态变量:
- 令θ为第一个变量(摆角)
- 令ω = dθ/dt(角速度)作为第二个变量
这样就能把二阶方程拆成两个一阶方程:
- dθ/dt = ω
- dω/dt = - (g/L) sinθ
为了简化计算,我们可以取g/L = 1(相当于把时间尺度归一化),这样方程更简洁,不影响相图的形状。
步骤2:编写pylab代码
直接套用你熟悉的streamplot逻辑,代码如下:
from pylab import * # 设置参数:这里取g/L=1简化计算 g_over_L = 1 # 生成相平面的网格:θ范围覆盖-2π到2π,ω范围覆盖-3到3 theta_values, omega_values = meshgrid(arange(-2*pi, 2*pi, 0.1), arange(-3, 3, 0.1)) # 计算两个一阶方程的右端项 dtheta_dt = omega_values domega_dt = -g_over_L * sin(theta_values) # 绘制相平面流场 streamplot(theta_values, omega_values, dtheta_dt, domega_dt) # 添加标签和标题,让图更清晰 xlabel('摆角 θ') ylabel('角速度 ω') title('单摆运动的相平面') # 显示图像 show()
代码解释
- 我们扩展了θ的范围到
[-2π, 2π],这样能看到摆角绕整圈的运动情况;ω的范围[-3,3]能覆盖大部分常见的角速度值。 dtheta_dt直接等于ω,这是我们定义的一阶方程;domega_dt则是根据单摆方程计算的角速度变化率。- 最后加上标签和标题,让相图的物理意义更明确。
运行这段代码后,你会看到:小振幅的运动对应相平面上的椭圆(简谐近似的结果),而大振幅的运动则是开放的曲线(摆角超过π,摆锤绕圈的情况),完全符合单摆的物理特性!
内容的提问来源于stack exchange,提问作者skrooms
相关产品推荐
相关产品推荐

