-
Notifications
You must be signed in to change notification settings - Fork 41
Closed
Description
When evaluating Measurements.jl with DifferentialEquations.jl on a simple bouncing ball example, a very strange effect occurs (performing a multiplication outside of this example gives a different result as in this example):
Here is the bouncing ball example with Measurements.jl
module Test_bouncingBall_with_measurement
using DifferentialEquations, Measurements
function f(du,u,p,t)
du[1] = u[2]
du[2] = -9.81
end
function condition(u,t,integrator)
z = u[1] + 1e-12
return z
end
const e = 0.7 ± 0.1 # coefficient of restitution
function affect_neg(integrator)
println("Event at time = ", integrator.t, ", h = ", integrator.u[1])
v_before = integrator.u[2]
println(" v_before = ", v_before, ", e = ", e)
v_after = -e*v_before
println(" v_after = ", v_after)
integrator.u[2] = v_after
auto_dt_reset!(integrator)
set_proposed_dt!(integrator, integrator.dt)
end
cb = ContinuousCallback(condition,nothing,affect_neg! = affect_neg)
u0 = [1.0 ± 0.2, 0.0]
tspan = (0.0,2.0)
prob = ODEProblem(f,u0,tspan)
sol = solve(prob,Tsit5(),saveat=0.01,callback=cb)
end
Results in the following output:
Event at time = 0.4515236409859562, h = -0.0 ± 0.2
v_before = -4.42944691807223 ± 0.0, e = 0.7 ± 0.1
v_after = 3.1 ± 0.44
Event at time = 1.0836567383662918, h = -0.0 ± 0.34
v_before = -3.1 ± 0.44, e = 0.7 ± 0.1
v_after = 2.170428989855373 ± 2.8e-15
Note that v_after = -e*v_before
and it seems surprising that the uncertainty after this operation is nearly zero (2.8e-15). However, when perform this operation separately (outside of this example), the result is the correct one:
using Measurements
v_before = -3.1 ± 0.44
e = 0.7 ± 0.1
v_after = -e*v_before
@show v_after
Resulting output:
v_after = 2.17 ± 0.44
It is strange that when applying the same operation in the affect_neg callback, a wrong result is calculated. Is this a bug in Measurements.jl or did I made a mistake?
Metadata
Metadata
Assignees
Labels
No labels