如何在DiscreteCallback中的指定时间读取相应的值?

问题描述 投票:0回答:1

类似于this question,我正在尝试使用与时间有关的输入参数来解决此ODE。它由一系列discrete callbacks组成。在某些时候,参数会更改(而不是状态!)。时间和值存储在nx2 Array中。但是我无法在指定的时间获取affect函数来找到相应的参数值。在给定的示例中,分配给u[1]的值通常是恒定的。考虑一下这个MWE(具有非常类似于Matlab的方法),它可以正确运行without回调:

using DifferentialEquations
using Plots

function odm2prod(dx, x, params, t)
    k_1, f_1, V_liq, X_in, Y_in, q_in = params

    rho_1 = k_1*x[1]
    q_prod = 0.52*f_1*x[1]
    # Differential Equations
    dx[1] = q_in/V_liq*(X_in - x[1]) - rho_1
    dx[2] = q_in/V_liq*(Y_in - x[2])
end

x0      = [3.15, 1.5]
tspan   = (0.0, 7.0)
params  = [0.22, 43, 155, 249, 58, 0]
prob    = ODEProblem(odm2prod, x0, tspan, params)

input   = [1.0 60; 1.1 0; 2.0 60; 2.3 0; 4.0 430; 4.05 0]
dosetimes = input[:,1]
function affect!(integrator)
    ind_t = findall(integrator.t == dosetimes)
    integrator.p[6] = input[ind_t, 2]
end
cb = PresetTimeCallback(dosetimes, affect!)
sol = solve(prob, Tsit5(), callback=cb, saveat=1/12)

plot(sol, vars=[1, 2])

它不起作用。该错误起源于第22行,因为在Julia中似乎未定义将矢量与标量进行比较,或者我不知道有一种特殊的语法。

我知道可以使用time-dependent parameters in Julia,但是我想这仅适用于连续函数,不适用于离散更改!我没有看过interpolate的帮助,但不确定如何在特定情况下使用它。

有人可以告诉我如何使它正常工作吗?应该只需要几行代码。另外,除非它们重合,否则我不一定要将dosetimes作为sol.t的一部分。

julia differential-equations differentialequations.jl
1个回答
0
投票

文档使用错误,findall,您使用文档]

findall(f::Function, A)

返回I的索引或关键字的向量A,其中f(A[I])返回true

然后,您必须考虑到搜索“ all”的结果是一个列表。如您所愿,它只有一个元素,请仅使用第一个元素

function affect!(integrator)
    ind_t = findall(t -> t==integrator.t, dosetimes)
    integrator.p[6] = input[ind_t[1], 2]
end

您得到了情节

plot of the ode solution

© www.soinside.com 2019 - 2024. All rights reserved.