四阶龙格-库塔是的'= yy′=y

计算科学 龙格库塔 微分方程
2021-12-04 17:53:34

我的问题很简单,但是越看越不满足。我的问题是如何为y=y. 起初,我会假设以下内容:

k1=yn

k2=yn+h2k1

在这里,您实际上可以开始看到我遇到的部分问题,即似乎在第二个等式中我们正在添加苹果和橙子,因为h不是无单位的。尽管如此,继续前进:

k3=yn+h2k2

k4=yn+h k3

现在把所有东西放在一起,

yn+1=yn+h6(k1+2k2+2k3+k4)
.

因此,对于所有这些,似乎我们正在添加苹果和橙子(我的情况正是如此,通过获取速度的导数来找到位置)。此外,在求解下一步的最后一个方程中,y根本没有出现在其中,对我来说这似乎很奇怪(根本不对)。为了澄清为什么我在这一点上感到困惑,因为通常第一步是欧拉步骤,在这种情况下,整个事情放在一起看起来像:

yn+1=yn+h yn

我提出这个问题的部分原因是因为我得到了y现在需要映射它的导数(就像上面的欧拉方法一样)。我在更复杂的方程上多次使用 RK4,但由于某种原因,这个似乎不太正确。谢谢!

3个回答

答案很简单。您已经在第一个等式中比较了苹果和橙子。垃圾进垃圾出。方程y=y如果写得好是

dy/dx=y.
你现在看到了吗?要更正它,只需编写:dy/dx=ay,在哪里a是一个常数,在我们的例子中,a=1以单位为单位1/x.

你必须记住,你正在整合一些东西。积分通常看起来像这样

F(x)=f(x)dx

这里dx也不是无单位的,所以原则上你是在乘以一个苹果(f) 通过某事 (dx) 得到一个橙色 (F)。

那个问题y不显示不清楚。当我在这里重述龙格-库塔方案时,也许会变得很清楚

给定y=f(t,y)有初始值y(t0)=y0您可以计算离散时间序列yn=y(tn)

yn+1=yn+h6(k1+2k2+2k3+k4),tn+1=tn+h
在哪里
k1=f(t,yn)k2=f(t+h/2,yn+hk1/2)k3=f(t+h/2,yn+hk2/2)k4=f(t+h,yn+hk3)


这是 Julia 中的快速 RK4 实现,以表明没有任何问题。

using Plots

# Function definition y' = y
f(t,y) = y

# Boundary condition y(0) = 1
y = 1

# Time step
dt = 0.01

# Arrays for time an solution
time = collect(0:dt:1)
sol = similar(time)

# integration loop
for (n,t) in enumerate(time)
    sol[n] = y
    k1 = f(t     ,y        )
    k2 = f(t+dt/2,y+dt/2*k1)
    k3 = f(t+dt/2,y+dt/2*k2)
    k4 = f(t+dt  ,y+dt  *k3)
    y  = y + dt/6*(k1 + 2*k2 + 2*k3 + k4)
end

plot(time,sol)
plot!(time,exp(time))

在此处输入图像描述

这是一个棘手的问题,因为数学家通常会忽略单位。在使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如果你关心单位,这是不好的速记。