Julia求解简谐振动的微分方程

简谐振动

简谐振动的方程为

x ¨ + ω x = 0 \ddot x+\omega x=0 x¨+ωx=0

解得

x ( t ) = A cos ⁡ ( ω t − ϕ ) v ( t ) = x ˙ ( t ) = − A ω sin ⁡ ( ω t − ϕ ) \begin{aligned} x(t)&=A\cos(\omega t-\phi)\\ v(t)&=\dot x(t) = -A\omega\sin(\omega t-\phi) \end{aligned} x(t)v(t)=Acos(ωtϕ)=x˙(t)=Aωsin(ωtϕ)

SciML求解

通过SciML的求解代码如下,首先引入模块,并定义全局变量

using OrdinaryDiffEq, Plots

ω = 1           #输入\omega然后按tab可打出ω
x₀ = [0.0]      #输入\_0 然后按tab可打出下标₀
dx₀ = [π/2]     #\pi tab
tspan = (0.0, 2π)

ϕ = atan((dx₀[1]/ω)/x₀[1])
A =(x₀[1]^2 + dx₀[1]^2)

接下来就是核心代码

#
function f(ddu,du,u,ω,t)
    ddu .= -ω^2 * u
end

# 创建二阶ODE问题
prob = SecondOrderODEProblem(f, dx₀, x₀, tspan, ω)
sol = solve(prob, DPRKN6())

#Plot
plot(sol, vars=[2,1], linewidth=2, title ="简谐振动", label = ["x" "dx"])
plot!(t->A*cos(ω*t-ϕ), lw=3, ls=:dash, label="解析解 x")
plot!(t->-A*ω*sin(ω*t-ϕ), lw=3, ls=:dash, label="解析解 dx")
savefig("ode_7.png")

结果如图所示

在这里插入图片描述

其中,DPRKN6是一个高效但不精确的求解器,采用的是龙格库塔法,并且具有6阶插值。如果感觉精度不够的话,可以改用DPRKN12,顾名思义有12阶插值,但相对来说会慢一些。

关于Runge-kutta法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值