# Jump Diffusion Process. When does a jump occur?

**URL:** <https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837>\
**Category:** New to Julia\
**Tags:** question, diffeq\
**Created:** [April 6, 2019, 12:45pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837 "2019-04-06T12:45:02Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![SSkor](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sskor/32/7623_2.png) [@SSkor](https://discourse.julialang.org/u/SSkor)\
**Post date:** [April 6, 2019, 12:45pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/1 "2019-04-06T12:45:03Z")

</div>

I continue study SDE with Julia and I straggle with `integrator`

I’d like to get simulations like this

 ![image](https://global.discourse-cdn.com/julialang/original/3X/6/5/654760e83c0a49c926f6d0f5d60448bc977f4874.png)

And I get something like that with this code:

```julia
rate(u,p,t) = 2
affect!(integrator) = (integrator.u[1] = 1)
jump = VariableRateJump(rate,affect!)
jump_prob = JumpProblem(prob,Direct(),jump)
monte_prob = MonteCarloProblem(jump_prob)
sol = solve(monte_prob,SRIW1(),num_monte=3,parallel_type=:threads,dt=0.001,
adaptive=false) 

```

![3Jump%20Diffusion%20trajectory%20NA%20NA%203](https://global.discourse-cdn.com/julialang/original/3X/6/1/61bff17303edaf8d2f1b054dc1fb3afec88913f0.png)

But when I change `(integrator.u[1] = 1)` to `(integrator.u[1] = integrator.u[1]/2)` the 1st jump occurs in the same time for all trajectories.

![4Jump%20Diffusion%20trajectory%20NA%20NA%203](https://global.discourse-cdn.com/julialang/original/3X/d/e/dee6cc191d117d7552a0d2997ea6345e3b25d37c.png)

What does an integrator mean for the jump process?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 6, 2019, 12:48pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/2 "2019-04-06T12:48:33Z")

</div>

Does this happen when `parallel_type=:none`? Need to double check the thread-safety of the RNG in this case.

---

<div class="post-metadata">

**Author:** ![SSkor](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sskor/32/7623_2.png) [@SSkor](https://discourse.julialang.org/u/SSkor)\
**Post date:** [April 6, 2019, 12:52pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/3 "2019-04-06T12:52:42Z")

</div>

Yes, this happens.  
`sol = solve(monte_prob,SRIW1(),num_monte=n,parallel_type=:none,dt=dt,adaptive=false)`  
 ![6Jump%20Diffusion%20trajectory%20NA%20NA%203](https://global.discourse-cdn.com/julialang/original/3X/e/2/e261a612a3ced6e53a883f1d3ca7d59aaae813b2.png)

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 6, 2019, 1:00pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/4 "2019-04-06T13:00:19Z")

</div>

Interesting. Can you get a simplified example which recreates this problem and post it in an issue to DiffEqJump.jl? [Issues · SciML/JumpProcesses.jl · GitHub](https://github.com/JuliaDiffEq/DiffEqJump.jl/issues) . It looks like the first jump is re-using the same random number each time. We have tests for that when doing looping but might have omitted the test when using a MonteCarloProblem, but that is obviously a good think to fix here.

---

<div class="post-metadata">

**Author:** ![SSkor](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sskor/32/7623_2.png) [@SSkor](https://discourse.julialang.org/u/SSkor)\
**Post date:** [April 6, 2019, 1:11pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/5 "2019-04-06T13:11:32Z")

</div>

If you don’t mind, at first I post the code here. Maybe I do something wrong when I convert the solution into array.

```julia
using DifferentialEquations, Plots

rate(u,p,t) = 2
affect!(integrator) = (integrator.u[1] = integrator.u[1]/2)
jump = VariableRateJump(rate,affect!)
jump_prob = JumpProblem(prob,Direct(),jump)
monte_prob = MonteCarloProblem(jump_prob)
sol = solve(monte_prob,SRIW1(),num_monte=3,parallel_type=:none,dt=0.001,adaptive=false)

#I need the trajectories of equal lengths, so I do that
A = Array{Float64}(undef, 1000, 3)
for i in 1:3
    A[:,i] = Array(sol[i])[1,1:1000]
end

pyplot() 
p = plot(A, legend = false, title="$proc_name $n")
display(p)

```

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 6, 2019, 1:21pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/6 "2019-04-06T13:21:11Z")

</div>

Oh, the jumps add a time point in there themselves since they introduce a discontinuity. If you don’t want that save, you do `save_positions=(false,false)` in `VariableRateJump`. Then `Array(sol)` will work and line up with the time points you’re expecting. I am not sure if the first jump is caused actually the same or if this rescaling you did made them look the same, so give this a shot first.

---

<div class="post-metadata">

**Author:** ![SSkor](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sskor/32/7623_2.png) [@SSkor](https://discourse.julialang.org/u/SSkor)\
**Post date:** [April 6, 2019, 1:31pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/7 "2019-04-06T13:31:16Z")

</div>

I’ve changed this line  
`jump = VariableRateJump(rate, affect!, save_positions=(false,false))`

I plot the solution without rescaling. Nothing changes.  
 ![image](https://global.discourse-cdn.com/julialang/original/3X/e/e/ee9e0dcc08b1857bb7e35e17225dfe81aeaf6733.png)

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 6, 2019, 1:35pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/8 "2019-04-06T13:35:53Z")

</div>

Yup okay, this requires an issue. Somehow the callback init which is supposed to re-sample that random number isn’t being called. I think it’s confined to only variable rate jumps though.

---

<div class="post-metadata">

**Author:** ![SSkor](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sskor/32/7623_2.png) [@SSkor](https://discourse.julialang.org/u/SSkor)\
**Post date:** [April 6, 2019, 1:47pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/9 "2019-04-06T13:47:21Z")

</div>

Okay, I’m posting an issue!

What the sense in this line for the jumps? `affect!(integrator) = (integrator.u[1] = 1)` or `integrator.u[1] = integrator.u[1]`  
As I understand, it affects on the size of jumps at time points, doesn’t it? But in what time points?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 6, 2019, 1:54pm UTC](https://discourse.julialang.org/t/jump-diffusion-process-when-does-a-jump-occur/22837/10 "2019-04-06T13:54:08Z")

</div>

I’m confused why that would matter too, hence the need to investigate 😉
