Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 如何修复setindex中的TypeError!在微分方程中.jl_Julia_Typeerror_Ode_Differential Equations - Fatal编程技术网

Julia 如何修复setindex中的TypeError!在微分方程中.jl

Julia 如何修复setindex中的TypeError!在微分方程中.jl,julia,typeerror,ode,differential-equations,Julia,Typeerror,Ode,Differential Equations,最近,我开始学习Julia的(v1.0.3)differentialsequations.jl软件包。我试图解决一个简单的ODE系统,其结构与我的真实模型相同,但要小得多。 根据我使用的解算器,该示例要么解算,要么抛出错误。考虑这个MWE,CSTR中的一个连续/平行反应的化学工程模型: using DifferentialEquations using Plots # Modeling a consecutive / parallel reaction in a CSTR # A -->

最近,我开始学习Julia的(v1.0.3)
differentialsequations.jl
软件包。我试图解决一个简单的ODE系统,其结构与我的真实模型相同,但要小得多。 根据我使用的解算器,该示例要么解算,要么抛出错误。考虑这个MWE,CSTR中的一个连续/平行反应的化学工程模型:

using DifferentialEquations
using Plots

# Modeling a consecutive / parallel reaction in a CSTR
# A --> 2B --> C, C --> 2B, B --> D
# PETERSEN-Matrix
#   No.     A       B       C       D       Rate
#   1      -1       2                       k1*A
#   2              -2       1               k2*B*B
#   3               2      -1               k3*C
#   4              -1               1       k4*B

function fpr(dx, x, params, t)
    k_1, k_2, k_3, k_4, q_in, V_liq, A_in, B_in, C_in, D_in = params
    # Rate equations
    rate = Array{Float64}(undef, 4)
    rate[1] = k_1*x[1]
    rate[2] = k_2*x[2]*x[2]
    rate[3] = k_3*x[3]
    rate[4] = k_4*x[2]

    dx[1] = -rate[1] + q_in/V_liq*(A_in - x[1])
    dx[2] = 2*rate[1] - 2*rate[2] + 2*rate[3] - rate[4] + q_in/V_liq*(B_in - x[2])
    dx[3] = rate[2] - rate[3] + q_in/V_liq*(C_in - x[3])
    dx[4] = rate[4] + q_in/V_liq*(D_in - x[4])
end 

u0 = [1.5, 0.1, 0, 0]
params = [1.0, 1.5, 0.75, 0.15, 3, 15, 0.5, 0, 0, 0]
tspan = (0.0, 15.0)
prob = ODEProblem(fpr, u0, tspan, params)
sol = solve(prob)
plot(sol)
这很好用。 但是,如果a选择不同的解算器,例如
Rosenbrock23()
Rodas4()
,则ODE未解算,我得到以下错误:

ERROR: LoadError: TypeError: in setindex!, in typeassert, expected Float64,
got ForwardDiff.Dual{Nothing,Float64,4}
我不会在这里粘贴整个stacktrace,因为它很长,但是您可以通过将
sol=solve(prob)
更改为
sol=solve(prob,Rosenbrock23())
来轻松地复制它。在我看来,当解算器试图推导雅可比矩阵时,会出现错误,但我不知道为什么。为什么默认解算器工作,而其他解算器不工作


请告诉我为什么会发生此错误,以及如何修复此错误?

自动区分通过在函数中传递
Dual
类型来工作,而不是通常使用的浮点数。因此,问题出现了,因为您将内部值
rate
固定为
Vector{Float64}
类型(请参见第三点和)。幸运的是,这很容易修复(而且更好看,IMHO):

这适用于
Rosenbrock23
Rodas4


或者,您可以使用
Rosenbrock23(autodiff=false)
(我认为它将使用有限差分)关闭AD,或者提供一个雅可比矩阵。

自动微分通过将
类型传递给您的函数来工作,而不是通常使用它的浮点数。因此,问题出现了,因为您将内部值
rate
固定为
Vector{Float64}
类型(请参见第三点和)。幸运的是,这很容易修复(而且更好看,IMHO):

这适用于
Rosenbrock23
Rodas4


或者,您可以使用
Rosenbrock23(autodiff=false)
(我认为,它将使用有限差分),或者提供雅可比数。

如果您没有
rate[2]=k_2*x[2]*x[2]
?如果您没有
rate[2]=k_2*x[2]*x[2]
?同样值得注意的是,关闭autodiff,比如
Rosenbrock23(autodiff=false)
,也可以。或者提供一个雅可比函数。答案中有一个小错误,因为第四个速率实际上是
k_4*x[2]
,而不是
k_4*x[4]
,第二个速率应该是@LutzL所指出的
k_2*x[2]*x[2]
。因此整个表达式读作
rate=[k_1*x[1],k_2*x[2]*x[2],k_3*x[3],k_4*x[2]]
。现在,autodiff可以工作了!我还有两个问题:首先,我想将
rate
作为解决方案对象的一部分,这样它可以与
u
t
一样查看。这有可能吗?第二,当我使用
参数化函数.jl
时,autodiff也不工作,但错误消息不同。我可能应该为第二期发布一个新问题并引用此问题。是的,请确实提出一个新问题。完成,。问题1如何?是否可以存储中间变量(除了
u
t
)在
sol
对象中?如果是,怎么做?同样值得注意的是,关闭autodiff,如
Rosenbrock23(autodiff=false)
,也可以工作。或者提供一个雅可比函数。答案中有一个小错误,因为第四个速率实际上是
k_4*x[2]
,而不是
k_4*x[4]正如@LutzL所指出的,第二个速率应该是
k_2*x[2]*x[2]
。因此,整体表达式为
rate=[k_1*x[1],k_2*x[2]*x[2],k_3*x[3],k_4*x[2]]
。现在,autodiff可以工作了!我还有两个问题:首先,我想将
rate
作为解决方案对象的一部分,这样它可以与
u
t
一样查看。这有可能吗?第二,当我使用
参数化函数.jl
时,autodiff也不工作,但错误消息不同。我可能应该为第二期发布一个新问题并引用此问题。是的,请确实提出一个新问题。完成。问题1如何?是否可以将中间变量(除
u
t
)存储在
sol
对象中?如果可以,如何?
julia> function fpr(dx, x, params, t)
           k_1, k_2, k_3, k_4, q_in, V_liq, A_in, B_in, C_in, D_in = params
           # Rate equations
           # should actually be rate = [k_1*x[1], k_2*x[2]*x[2], k_3*x[3], k_4*x[2]], as per @LutzL's comment
           rate = [k_1*x[1], k_2*x[2], k_3*x[3], k_4*x[2]]

           dx[1] = -rate[1] + q_in/V_liq*(A_in - x[1])
           dx[2] = 2*rate[1] - 2*rate[2] + 2*rate[3] - rate[4] + q_in/V_liq*(B_in - x[2])
           dx[3] = rate[2] - rate[3] + q_in/V_liq*(C_in - x[3])
           dx[4] = rate[4] + q_in/V_liq*(D_in - x[4])
       end