[SciML教程]Julia求解常微分方程

SciML可以用AI求解偏微分方程,可以说十分黑科技了。

官网提供了notebook教程,可通过如下方式开启,

>]
pkg> add https://github.com/SciML/SciMLTutorials.jl
# 按退格键退出pkg
julia> using SciMLTutorials
julia> SciMLTutorials.open_notebooks()

常微分方程可以写成如下形式

u ′ = f ( u , p , t ) u'=f(u,p,t) u=f(u,p,t)

其中, t t t为自变量, p p p为模型参数, u u u是因变量, f f f是关于 u , t u,t u,t的非线性模型。

接下来引入第一个案例:

u ′ = 0.98 u , u ( 0 ) = 1.0 u'=0.98u,u(0)=1.0 u=0.98u,u(0)=1.0

这个方程的解析解为 e 0.98 t e^{0.98t} e0.98t,是一个非常简单的微分方程,适合用于代码的验证。

其代码如下

using DifferentialEquations #如果未装,会提示是否安装,选择是
f(u,p,t) = 0.98u            #新建一个待求方程
u0 = 1.0                    #初值
tspan = (0.0,1.0)           #时间范围
#新建一个常微分方程问题
prob = ODEProblem(f,u0,tspan)
sol = solve(prob)

sol就是对这个ODE的求解结果,包含代表自变量和因变量的成员,分别是sol.tsol.u,通过plot(sol)可对二者进行绘制,出图如下

using Plots; gr()
plot(sol)
savefig("ode_1.png")

在这里插入图片描述

接下来对比一下solve的结果和解析解,

plot!(sol.t, t->1.0*exp(0.98t),lw=3,ls=:dash,label="True Solution!")
savefig("ode_2.png")

出图如下

在这里插入图片描述

sol虽然有两个成员,但其本身并非两列的数组,而是一个复杂的类。sol本身也可以像函数一样调用。例如

julia> sol(1.5)
4.3471420001896455

故而,可以对比一下sol和解析解的差值,即拟合误差

plot(0:0.1:1, t->(sol(t)-1.0*exp(0.98t)),label="error")
savefig("ode_3.png")

在这里插入图片描述
可见误差尚可。

猜你喜欢

转载自blog.csdn.net/m0_37816922/article/details/123417647