Julia 用读入外强迫求解常微分方程组

Julia 用读入外强迫求解常微分方程组,julia,ode,differentialequations.jl,Julia,Ode,Differentialequations.jl,在Julia中,我想解一个有外力g1t,g2t的常微分方程组 从文件中读取强制力 我用这项研究来学习Julia和包微分方程,但我很难找到正确的方法 我可以想象使用回调可以工作,但这似乎相当麻烦 您知道如何实现这种外部强制吗?您可以使用集成函数中的函数。因此,您可以使用类似的方法从文件中的数据构建插值多项式,然后执行以下操作: g1 = interpolate(data1, options...) g2 = interpolate(data2, options...) p = (g1,g2) #

在Julia中,我想解一个有外力g1t,g2t的常微分方程组

从文件中读取强制力

我用这项研究来学习Julia和包微分方程,但我很难找到正确的方法

我可以想象使用回调可以工作,但这似乎相当麻烦


您知道如何实现这种外部强制吗?

您可以使用集成函数中的函数。因此,您可以使用类似的方法从文件中的数据构建插值多项式,然后执行以下操作:

g1 = interpolate(data1, options...)
g2 = interpolate(data2, options...)
p = (g1,g2) # Localize these as parameters to the model

function f(du,u,p,t)
g1,g2 = p
  du[1] = ... + g1[t] # Interpolations.jl interpolates via []
  du[2] = ... + g2[t]
end
# Define u0 and tspan
ODEProblem(f,u0,tspan,p)

您可以使用集成函数中的函数。因此,您可以使用类似的方法从文件中的数据构建插值多项式,然后执行以下操作:

g1 = interpolate(data1, options...)
g2 = interpolate(data2, options...)
p = (g1,g2) # Localize these as parameters to the model

function f(du,u,p,t)
g1,g2 = p
  du[1] = ... + g1[t] # Interpolations.jl interpolates via []
  du[2] = ... + g2[t]
end
# Define u0 and tspan
ODEProblem(f,u0,tspan,p)

感谢@Chris Rackauckas提出的好问题和回答。 下面是此类问题的完整可复制示例。请注意,Interpolations.jl已将索引更改为g1t


感谢@Chris Rackauckas提出的好问题和回答。 下面是此类问题的完整可复制示例。请注意,Interpolations.jl已将索引更改为g1t


如果看不到你想做什么,就很难知道。我猜你可能需要将数据重新写入另一种格式:也许它只想插值向量。我们可以在或中更详细地讨论这一点。这些方法对于长时间的讨论更好,而StackOverflow只是简单的问题->答案。好的,谢谢,我在重新加载新代码时遇到了一些问题。我得多玩一会儿,以防遇到新问题,我会参加讨论小组。再次感谢!如果看不到你想做什么,就很难知道。我猜你可能需要将数据重新写入另一种格式:也许它只想插值向量。我们可以在或中更详细地讨论这一点。这些方法对于长时间的讨论更好,而StackOverflow只是简单的问题->答案。好的,谢谢,我在重新加载新代码时遇到了一些问题。我得多玩一会儿,以防遇到新问题,我会参加讨论小组。再次感谢!
using Interpolations
using DifferentialEquations
using Plots

time_forcing = -1.:9.
data_forcing = [1,0,0,1,1,0,2,0,1, 0, 1]
g1_cst = interpolate((time_forcing, ), data_forcing, Gridded(Constant()))
g1_lin = scale(interpolate(data_forcing, BSpline(Linear())), time_forcing)

p_cst = (g1_cst) # Localize these as parameters to the model
p_lin = (g1_lin) # Localize these as parameters to the model


function f(du,u,p,t)
  g1 = p
  du[1] = -0.5 + g1(t) # Interpolations.jl interpolates via ()
end

# Define u0 and tspan
u0 = [0.]
tspan = (-1.,9.) # Note, that we would need to extrapolate beyond 
ode_cst = ODEProblem(f,u0,tspan,p_cst)
ode_lin = ODEProblem(f,u0,tspan,p_lin)

# Solve and plot
sol_cst = solve(ode_cst)
sol_lin = solve(ode_lin)

# Plot
time_dense = -1.:0.1:9.
scatter(time_forcing, data_forcing,   label = "discrete forcing")
plot!(time_dense, g1_cst(time_dense), label = "forcing1",  line = (:dot,   :red))
plot!(sol_cst,                        label = "solution1", line = (:solid, :red))
plot!(time_dense, g1_lin(time_dense), label = "forcing2",  line = (:dot,   :blue))
plot!(sol_lin,                        label = "solution2", line = (:solid, :blue))