问题标签 [differentialequations.jl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
julia - Julia 中的二阶 ODE 给出错误的结果
我正在尝试使用 julia 提供的 DifferentialEquations.jl,它工作正常,直到我尝试在二阶 ODE 上使用它。例如考虑二阶 ODE
x''(t) = x'(t) + 2* x(t),带初始条件
x'(0) = 0, x(0) = 1
它的解析解为:x(t) = 2/3 exp(-t) + 1/3 exp(2t)。
为了以数字方式解决它,我运行以下代码:
接着就,随即,
而解析解产生 134.50945587649028,所以我在这里有点迷失了。
julia - 在 Julia 中解决 DDE 的问题
我正在尝试使用 Julia 的DifferentialEquations.jl
包来解决 DDE 系统。我能够使用下面的代码解决两个对象的问题
当我试图使我的代码 ( MultiDelayedBuckle.jl
) 可扩展以解决任意数量的对象时,我遇到了一个我无法理解的错误。下面你可以看到我的代码
这是我得到的错误:
作为参考,我使用的是 Julia 1.6.0。
julia - FFTW.jl 用于 2D 阵列:扩散只发生在 1D
根据我的阅读,当 A 是 2D 数组时,使用 FFTW.jl / AbstractFFTs.jl 的 fft(A) 应该在 2D 中执行 fft,而不是按列执行。知道为什么当(我认为)我将缩放的二阶空间导数添加到 u(t,x) 时,我只看到列方向的扩散,就好像使用显式求解器一样?
谢谢!我对此很陌生。
neural-network - 训练神经微分方程时如何保证收敛?
我目前正在完成 Julia 语言的 SciML 教程研讨会练习 ( https://tutorials.sciml.ai/html/exercises/01-workshop_exercises.html )。具体来说,我坚持练习 6 第 3 部分,其中涉及训练神经网络以逼近方程组
目标是用神经网络替换 du[2] 的方程:du[2] = NN(u, p)
其中 NN 是具有参数p
和输入的神经网络u
。
我有一组网络应该尝试匹配的样本数据。损失函数是网络模型输出与样本数据之间的平方差。
我用
NN = Chain(Dense(2,30), Dense(30, 1))
. 我可以开始Flux.train!
跑步,但问题是有时神经网络的初始参数会导致 10^20 量级的损失,因此训练永远不会收敛。我的最佳尝试使用 ADAM 优化器在大约 1000 次迭代中将损失从最初的大约 2000 降低到大约 20,但我似乎无法做得更好。
如何确保我的网络始终可训练,有没有办法更好地收敛?
neural-network - 使用 sciml_train 改进通用微分方程训练的方法
大约一个月前,我问了一个关于在训练神经微分方程时更好地收敛的策略的问题。从那以后,我已经使用给我的建议使该示例起作用,但是当我将相同的建议应用于更困难的模型时,我又被卡住了。我所有的代码都在 Julia 中,主要使用 DiffEqFlux 库。为了使这篇文章尽可能简短,我不会分享我尝试过的所有代码,但如果有人想访问它来解决问题,我可以提供。
我想要做什么
我试图学习的数据来自 SIRx 模型:
我使用的初始条件是u0 = Float32.([0.062047128, 1.3126149f-7, 0.9486445]);
. 我生成了从 t=0 到 25 的数据,每 0.02 采样一次(在训练中,我只使用每 20 个点左右来提高速度,使用更多并不能提高结果)。数据如下所示:训练数据
我正在训练的 UDE 是
每个神经网络 ( ann_dS, ann_dI, ann_dx
) 都使用 定义FastChain(FastDense(3, 20, tanh), FastDense(20, 1))
。我尝试使用具有 3 个输入和 3 个输出的单个神经网络,但它速度较慢并且性能也没有更好。我还尝试首先对网络的输入进行规范化,但除了减慢速度之外,它并没有显着的区别。
我试过的
- 单拍 网络正好适合一条穿过数据中间的线。即使我在损失函数中对早期数据点进行更多加权,也会发生这种情况。单次训练
- 多重射击 我得到的最好结果是多重射击。如此处所见,它不仅仅是拟合一条直线,而且也不是完全拟合数据Multiple Shooting Result。我尝试了从 0.1 到 100 的连续性术语和从 3 到 30 的组大小,但没有显着差异。
- 各种其他策略 我也尝试过迭代地增加适合度、搭配搭配的 2 阶段训练和小批量,如下所述:https : //diffeqflux.sciml.ai/dev/examples/local_minima,https://diffeqflux .sciml.ai/dev/examples/collocation/ , https://diffeqflux.sciml.ai/dev/examples/minibatch/. 迭代地增加拟合在前几次迭代中效果很好,但随着长度的增加,它又回到拟合直线。2-stage 搭配训练在第 1 阶段效果非常好,但在第 2 阶段实际上并没有提高性能(我在第 2 阶段尝试过单拍和多拍)。最后,mini-batching 的效果与单次拍摄一样好(也就是说不是很好),但速度要快得多。
我的问题
总之,我不知道该尝试什么。有很多策略,每个策略都有很多可以调整的参数。我需要一种更准确地诊断问题的方法,以便更好地决定如何进行。如果有人有此类问题的经验,我会很感激我能得到的任何建议或指导。
julia - 如何使用 ModelingToolkit.jl 动态创建变量
主要问题是我的变量只有在运行代码后才能确定(因为变量的数量不固定)。
在旧版本的 ModelingToolkit.jl 中,我使用以下代码生成变量。
但是,它不能在最新版本中工作。这是错误。
我检查了 SymbolicUtils.jl 但没有找到其他用法。我该如何解决这个问题?
julia - 模拟反射边界 SDEProblem
我正在尝试模拟反射边界。根据此处找到的建议:我尝试了 Julia 中带有回调的随机微分方程
分别产生和。我注意到的一件事是,当 dt 较小时,反射的“质量”要好得多。我怀疑这是因为求解器只检查插值中的节点,而不是每个点。
这对选择自己的时间步长的自适应求解器有影响。例如,如果我现在使用求解器运行相同的问题,这是https://diffeq.sciml.ai/stable/solvers/sde_solve/SOSRI
上的第一个建议,我得到:
鉴于问题似乎是仅在结处评估条件,这是 a 的想法DiscreteCallback
,我尝试了使用的最后一种方法ContinuousCallback
:
但这不起作用(我想我可能没有正确使用 ContinuousCallback。结果是and ,可以说没有反射
模拟这些过程的推荐方法是什么,以及显式时间步求解器是唯一受支持的方法吗?
julia - 在 ODE 模型中加入强制函数以进行贝叶斯估计
我是 Julia 的 Turing 包的新手,需要一些帮助!
我一直在尝试使用离散强制函数估计模型的参数q(t)
,其中的值q(t)
是离散的并且是从文件中读取的。BoundsError
代码在求解 ODE 模型时抛出了一个错误。
下面提到的是使用的完整 Julia 脚本:
由于堆栈跟踪错误很长,我分享了查看链接: Full error。
在错误中:
- 第 62 行是
dy[1] = -β*w(t)*m(t)*I*S/N + λ*R; # S
- 第 107 行是
predicted = solve(problem, Tsit5(), saveat=1.0)
- 第 123 行是
chain = sample(model, NUTS(0.65), MCMCThreads(), 10000, number_of_chains);
有人可以帮我吗?提前致谢!
julia - 来自DifferentialEquations.jl 的Heston 模型示例给出桥接分布错误
在尝试运行解释SDE 上的 DE 教程的代码时,我得到以下堆栈跟踪(仅前几行):
我怀疑这与我定义相关维纳过程的方式有关。这是我要运行的代码块:
编辑: 如果我告诉它不要明确使用自适应方法,求解器就可以工作。例如,
但是,我不明白为什么
- 没有为此 CorrelatedWienerProcess 定义桥接分布属性!“对象”(数学上,它类似于默认的 WienerProcess)
- 求解函数的自动选择器在找不到桥接分布时不会尝试非自适应方法。