qwebfub3i4u
qwebfub3i4u

Reputation: 319

Error when calculating RHS of ode "no method matching Float64(::Num)"

I have some code that uses a function to calculate some changes in concentration, but I get an error of:

ERROR: LoadError: MethodError: no method matching Float64(::Num)
Closest candidates are:
  (::Type{T})(::Real, ::RoundingMode) where T<:AbstractFloat at rounding.jl:200
  (::Type{T})(::T) where T<:Number at boot.jl:760
  (::Type{T})(::AbstractChar) where T<:Union{AbstractChar, Number} at char.jl:50

I have attached a MWE below. The code initializes some parameters, and uses the initialized parameters to calculate additional parameters (Ke and kb), then inputs these parameters into my function oderhs(c,Ke,kb,aw,aw²,aw³,ρζ,ρζ²,ρζ³,γ,γ²) which should return dc which is my solution vector that I require.

using DifferentialEquations
@parameters t c0[1:4] Ke[1:2] kb[1:2] aw aw² aw³ ρ ζ ρζ ρζ² γ γ² T

# Calculate parameters
ρ = 0.592
ζ = 1.0
ρζ  = ρ*ζ
ρζ² = ρζ*ρζ
ρζ³ = ρζ*ρζ²

aw = 0.995
aw² = aw*aw
aw³ = aw*aw²

γ = 1.08
γ² = γ*γ

T = 590.0
# calculate equilibrium constants
Ke[01] = (1.0E-06)*10.0^(-4.098 + (-3245.2/T) + (2.2362E+05/(T^2)) + (-3.9984E+07/(T^3)) + (log10(ρ) * (13.957 + (-1262.3/T) + (8.5641E+05/(T^2)))) )
Ke[02] = 10^(28.6059+0.012078*T+(1573.21/T)-13.2258*log10(T))

# calculate backward rate constants
kb[01] = Ke[01]*ρζ²/γ²
kb[02] = Ke[02]*γ/ρζ


# set initial concentrations
c0 = [0.09897, 0.01186, 2.94e-5, 4.17e-8]

function oderhs(c,Ke,kb,aw,aw²,aw³,ρζ,ρζ²,ρζ³,γ,γ²)
      # rename c to their corresponding species
      H₃BO₃   = c[1]; H₄BO₄⁻ = c[2]; OH⁻ = c[3]; H⁺ = c[4];
      # rename Ke to their corresponding reactions
      Ke_iw1 = Ke[1]; Ke_ba1 = Ke[2];
      # rename kb to their corresponding reactions
      kb_iw1 = kb[1]; kb_ba1 = kb[2];
      # determine the rate of reaction for each reaction
      r_iw1 = kb_iw1*(H⁺*OH⁻ - Ke_iw1*ρζ²*aw/γ²)
      r_ba1 = kb_ba1*(H₄BO₄⁻ - H₃BO₃*OH⁻*Ke_ba1*γ/ρζ)
      dc = zeros(eltype(c),4)
      # calculate the change in species concentration
      dc[1] = r_ba1
      dc[2] = r_ba1
      dc[3] = r_iw1 + r_ba1
      dc[4] = r_iw1
      
      return dc
end

dc = oderhs(c0,Ke,kb,aw,aw²,aw³,ρζ,ρζ²,ρζ³,γ,γ²)

Upvotes: 1

Views: 303

Answers (1)

Chris Rackauckas
Chris Rackauckas

Reputation: 19132

zeros(eltype(c),4) creates an Array of Float64, which isn't what you want because you're trying to create a symbolic version of the ODE equations (right? otherwise this doesn't make sense). Thus you want to this be like zeros(Num,4), so that the return is the symbolic equations, and then you'd generate the actual code for DifferentialEquations.jl from the ModelingToolkit.jl ODESystem.

Upvotes: 2

Related Questions