SciML求解单摆问题

单摆问题可表示为

θ ¨ + g L sin ⁡ θ = 0 \ddot{\theta} + \frac{g}{L}{\sin\theta} = 0 θ¨+Lgsinθ=0

其中, g g g是重力加速度; L L L是摆长; θ \theta θ是摆动角度,这个方程是没有解析解的。

当角度比较小时,有 sin ⁡ ( θ ) ≈ θ \sin(\theta) \approx \theta sin(θ)θ,则钟摆问题可简化为线性形式

θ ¨ + g L θ = 0 \ddot{\theta} + \frac{g}{L}{\theta} = 0 θ¨+Lgθ=0

当角度较大时,可通过数值求解。首先,将其拆分成一阶的微分方程组

θ ˙ = ω ω ˙ = − g L sin ⁡ θ \begin{aligned} &\dot{\theta} = \omega \\ &\dot{\omega} = - \frac{g}{L}{\sin\theta} \end{aligned} θ˙=ωω˙=Lgsinθ

using OrdinaryDiffEq, Plots
plotlyjs()

const g = 9.81  #g是常量
L = 1.0

u₀ = [0,π/2]
tspan = (0.0,6.0)

#定义问题
function simplependulum(du,u,t)
    θ = u[1]
    ω = u[2]        #\omega + tab = ω
    du[1] = ω
    du[2] = -(g/L)*sin(θ)
end

prob = ODEProblem(simplependulum, u₀, tspan)
sol = solve(prob,Tsit5())

# plotlyjs绘图面板中有个相机的图标,点击可保存图片
plot!(sol, title ="钟摆问题", xaxis = "时间", label = ["θ" "ω"])

如图所示

SciML求解单摆问题_第1张图片

其中Tsit5是一阶非线性微分方程组的求解器,之前在求解衰减曲线时曾经用过,但并未做出说明。Tsit5是SciML优先推荐的求解器,是5阶Tsitouras方法,是一种经过改进的龙格库塔法。

在物理学中,除了建立物理量随时间的变化关系之外,有时还需要建立物理量之间的关系,尤其是速度与坐标的关系,二者构成了系统可能存在的所有状态,俗称相空间。

在三维空间中,速度和动量分别有三个方向,所以三维空间中的相空间一般有6个维度。但对于摆动问题来说,可以将速度和位置简化至一维,所以相空间有两个维度。

由于我们的绘图空间也有两个维度,所以只能画线,也就是说,只能从相空间中抽出一些线来绘制。

p = plot(sol,vars = (1,2), xlims = (-15,15), title = "相空间", xaxis = "速度", yaxis = "位置", leg=false)
# 用于绘图的函数
function phase_plot(func, u0, p)
    prob = ODEProblem(func,u0,(0.0,2pi))
    sol = solve(prob,Vern9()) # Vern9精度更高
    plot!(p,sol,vars = (1,2))
end
for i in -4pi:pi/2:4π
    for j in -4pi:pi/2:4π
        phase_plot(simplependulum, [j,i], p)
    end
end
plot(p,xlims = (-15,15))

结果如下

SciML求解单摆问题_第2张图片

你可能感兴趣的:(julia,julia,sciml,微分方程,ode,ode45)