Engee 文档
Notebook

参数不确定性的钟摆模型

在本演示中,我们将研究启动数学摆模型的过程,该模型的值用点差设置。

与此同时,我们将检查库具有哪些功能。 DifferentialEquations (解决颂歌)和 Plots (图输出)在实现Julia的关键技术方面multimethods(多重调度)。 这项技术允许Julia包选择正确的方法来处理最意想不到的数据类型。

环境准备

我们将需要这个演示的库。 MeasurementsDifferentialEquations. 如果系统上未安装其中一个,请键入 ]add Measurements (和 ]add DifferentialEquations)在单独的新单元格中或在命令提示符下运行命令。

In [ ]:
Pkg.add(["DifferentialEquations", "Measurements"])
In [ ]:
using Measurements, DifferentialEquations

首先,我们将设置环境和钟摆本身的参数。

In [ ]:
g = 9.81 ± 0.01; # Гравитационная постоянная 
L = 1.00 ± 0.02; # Длина подвеса маятника

访问符号 ± 您可以使用命令行上的LaTeX命令输入它: \pm. 按下选项卡后,您将收到一个符号,可用于计算,并在某些库中解释,特别是 Measurements.

图书馆的作用 Measurements 目标是正确处理点差(公差)。 例如,使得从相同测量中减去一个测量不会使误差传播加倍。

In [ ]:
x = 1 ± 0.01;
x - x
Out[0]:
$0.0 \pm 0.0$

在这方面,加法和减法的工作方式不同。

In [ ]:
x + x
Out[0]:
$2.0 \pm 0.02$

求解微分方程问题的陈述

在这个例子中,我们实现了一个数学钟摆的简化模型。:

哪里 -重力常数, -钟摆的长度, -摆的偏转角度弧度。 采用小角度近似 ,因此,假设 .

我们将设置初始速度和偏转角度,以及模拟的时间限制。

In [ ]:
u₀ = [0 ± 0.0, π/6 ± 0.01]
tspan = (0.0, 6.3)
Out[0]:
(0.0, 6.3)

小写的零可以在命令行中作为LaTeX命令输入。: \_0 并按tab键。 转换后,您将获得一个新字符,您可以将其复制到剪贴板并在变量名称中使用。

让我们来定义摆锤的方程.

In [ ]:
function pendulum( u, p, t )
    θ = u[1]
     = u[2]
    du = [, (-g/L) * θ]
    return du
end
Out[0]:
pendulum (generic function with 1 method)

每个向量由两个值组成。 状态向量 u 它由摆锤的挠度θ及其速度dθ的值组成。 反过来,导数的矢量包括摆的速度Dθ和作用在负载上的力。

创建计算任务并启动它

In [ ]:
prob = ODEProblem( pendulum, u₀, tspan )
Out[0]:
ODEProblem with uType Vector{Measurement{Float64}} and tType Float64. In-place: false
timespan: (0.0, 6.3)
u0: 2-element Vector{Measurement{Float64}}:
   0.0 ± 0.0
 0.524 ± 0.01

我们看到这个论点 u 此函数具有类型 Measurement,论点 t 有一个类型 Float64 他们一起工作很好。 现在让我们运行模拟。

In [ ]:
sol = solve( prob, Tsit5(), reltol=1e-6 );
In [ ]:
plot( sol.t, first.(sol.u), label="положение" )
plot!( sol.t, last.(sol.u), label="скорость" )
Out[0]:

正如我们所看到的,功能 plot 自动设置置信边界,实际上是用参数补充图形 yerr.

分析解决方案

这种方法的第一个实际应用可能是将数值解和解析解的误差与这个问题进行比较。

In [ ]:
u = u₀[2] .* cos.( sqrt( g/L ) .* sol.t );
In [ ]:
plot( sol.t, last.(sol.u), label="Численным методом" )
plot!( sol.t, u, label="Аналитическим", title="Сравнение решений задачи моделирования маятника" )
Out[0]:

无论是函数的值还是两个解的每个点的分布,我们都看不到任何差异。

备注

在发布时,此库的帮助文本尚未包含在Engee文档中,因此这里有一个指向开发人员页面的链接:https://github.com/JuliaPhysics/Measurements.jl (这是第一次,可以使用浏览器的内置工具进行翻译)。

测量包的差异化特征

我们已经实现了功能 pendulum(u, p, t),其使用 return. 包裹 DifferentialEquations 它还可以实现功能 in-place,调用的方法将看起来像 pendulum(du, u, p, t) 但由于这样的事实,我们不直接控制变化的类型 du,数据类型传播 Measurement 它被中断,这个版本的钟摆描述将不起作用。 这就是为什么我们使用 return.

绘图如何与测量包一起工作的特点

正如你所看到的,我们两个图中的第一个的输出也分为两个命令。 功能 plot,虽然它接受类型的输入数据 Measurement,不具有用于处理此类数据的多个向量的特定配方。 我们无法成功致电 plot( sol.t, sol.u ),发生类型转换错误。

结论

我们已经成功地找到了微分方程的数值解,并推导出了数学钟摆建模问题的公差图,其输入值被设置为具有精度公差的数字。