【发布时间】:2018-06-13 15:10:36
【问题描述】:
我一直在寻找,但找不到在 julia 中使用微分方程参数估计来拟合多个数据集的直接方法。所以,假设我们有一个带有两个参数的简单微分方程:
f1 = function (du,u,p,t)
du[1] = - p[1]*p[2] * u[1]
end
我们有 u[1] 与 t 的实验数据集。每个数据集具有不同的 p[2] 值和/或不同的初始条件。 p[1] 是我们要估计的参数。
我可以通过在迭代不同初始条件和 p[2] 值的 for 循环中求解微分方程,将解存储在数组中并针对实验数据创建损失函数来做到这一点。我想知道是否有一种方法可以用更少的代码行来做到这一点,例如,使用DiffEqBase.problem_new_parameters 来设置每个数据集的条件。在将模型拟合到实验数据时,这是一种非常常见的情况,但我在文档中找不到很好的示例。
提前谢谢你,
最好的问候
编辑 1
上述案例只是一个简化的例子。为了使其成为一个实际案例,我们可以从以下代码中创建一些虚假的实验数据:
using DifferentialEquations
# ODE function
f1 = function (du,u,p,t)
du[1] = - p[1]*p[2] * u[1]
end
# Initial conditions and parameter values.
# p1 is the parameter to be estimated.
# p2 and u0 are experimental parameters known for each dataset.
u0 = [1.,2.]
p1 = .3
p2 = [.1,.2]
tspan = (0.,10.)
t=linspace(0,10,5)
# Creating data for 1st experimental dataset.
## Experimental conditions: u0 = 1. ; p[2] = .1
prob1 = ODEProblem(f1,[u0[1]],tspan,[p1,p2[1]])
sol1=solve(prob1,Tsit5(),saveat=t)
# Creating data for 2nd experimental dataset.
## Experimental conditions: u0 = 1. ; p[2] = .2
prob2 = ODEProblem(f1,[u0[1]],tspan,[p1,p2[2]])
sol2=solve(prob2,Tsit5(),saveat=t)
# Creating data for 3rd experimental dataset.
## Experimental conditions: u0 = 2. ; p[2] = .1
prob3 = ODEProblem(f1,[u0[2]],tspan,[p1,p2[1]])
sol3=solve(prob3,Tsit5(),saveat=t)
sol1、sol2 和 sol3 现在是我们的实验数据,每个数据集使用不同的初始条件和 p[2] 组合(代表一些实验变量(例如温度、流量...)
目标是使用实验数据 sol1、sol2 和 sol3 估计 p[1] 的值,让DiffEqBase.problem_new_parameters 或其他替代方案迭代实验条件。
【问题讨论】:
-
分享一些示例数据集
标签: julia mathematical-optimization least-squares differentialequations.jl