Code
function do_analytic(x, C0, B0, N0, ka, kn, kc, Cs, U)
B = B0 * exp(-kc * x / U)
N = N0 * exp(-kn * x / U)
α1 = exp(-ka * x / U)
α2 = (kc/(ka-kc)) * (exp.(-kc * x / U) - exp(-ka * x / U))
α3 = (kn/(ka-kn)) * (exp(-kn * x / U) - exp(-ka * x / U))
C = Cs * (1 - α1) + (C0 * α1) - (B0 * α2) - (N0 * α3)
return (C, B, N)
end
# set river properties
ka = 0.6
kc = 0.4
kn = 0.25
C0 = 6.2
B0 = 9
N0 = 7
Cs = 7
U = 5
x = 0:40
# evaluate model over all x's
# this uses broadcasting
do_out = (y -> do_analytic(y, C0, B0, N0, ka, kc, kn, Cs, U)).(x)
# unpack outputs into individual arrays for C, B, and N
# this uses comprehensions to pull out the relevant components
#of the tuples that our function outputs
C = [d[1] for d in do_out]
B = [d[2] for d in do_out]
N = [d[3] for d in do_out]
# plot outputs
p1 = plot(; ylabel="DO/OD (mg/l)", xlabel="Distance (km)", left_margin=8mm, legend=:outerright, bottom_margin=10mm)
plot!(p1, x, C, color=:black, linewidth=4, label="DO")
plot!(p1, x, B, color=:green, label="CBOD", linestyle=:dash, linewidth=3)
plot!(p1, x, N, color=:blue, label="NBOD", linestyle=:dash, linewidth=3)
# plot Cs, which is a constant value
plot!(p1, x, Cs * ones(length(x)), color=:purple, label=L"C_s", linestyle=:dot, linewidth=2)
hline!([3], color=:red, linewidth=2, label="Regulatory Standard")
plot!(size=(1200, 450))
xaxis!((0, 40))


