这是一个棘手的问题,因为数学家通常会忽略单位。在使DifferentialEquations.jl 与单位兼容时,我自己实际上遇到了这个问题。在这个 notebook中,我使用了 Unitful.jl 的 unitful-arithmetic。本质上,您只需使用 Julia 的字符串宏以u"s"
秒为单位进行放置单位,并使用隐式乘法来2u"s"
表示“两秒”。知道这一点,请注意
using DifferentialEquations
f = (t,y) -> 0.5*y
u0 = 1.5u"N"
prob = ODEProblem(f,u0,(0.0u"s",1.0u"s"))
sol = solve(prob,Tsit5())
这会引发错误,并且非常接近您的方程式。为什么?错误很明显:
DimensionError: 1.5 N and 0.015 N s are not dimensionally compatible.
这正是您所看到的。它计算hk1具有单位Ns生成中间估计值,但这个值需要有单位N. 这是错的吗?不,我错了!请记住f(t,u)=y′=dydt. 它应该是一个速率,所以它需要是y每秒。当你这样做时:
f = (t,y) -> 0.5*y/3.0u"s"
prob = ODEProblem(f,u0,(0.0u"s",1.0u"s"))
sol = solve(prob,Tsit5())
# the printout
retcode: Success
Interpolation: specialized 4th order "free" interpolation
t: 3-element Array{Quantity{Float64, Dimensions:{𝐓}, Units:{s}},1}:
0.0 s
0.143116 s
1.0 s
u: 3-element Array{Quantity{Float64, Dimensions:{𝐋 𝐌 𝐓^-2}, Units:{N}},1}:
1.5 N
1.53621 N
1.77204 N
你看到它有效。所以是的,k是一个速率,所以它需要以单位为单位,然后当你乘以h,您现在再次获得以单位为单位的值。
究竟发生了什么?hk1只是一个估计y(t+h)(注意单位排列)。那一步就是欧拉。然后你使用y(t)和估计y(t+h)估计y(t+h/2)(某种中点)。然后你使用当前y(t+h/2)修正估计值y(t+h/2)(一种 Picard 迭代)。然后你使用更正的y(t+h/2)估计走半步,得到一个y(t+h)估计。然后你平均这个y(t+h)用第一个估计(记住hk1?),然后将中点的变化加倍以获得最后一步的另外两个估计值,并对所有这些值进行加权平均。那就是RK4。如果你检查这上面的单位,它们都会排成一行。
所以y′=y如果你关心单位,这是不好的速记。