# Kuramoto-like coupled oscillators in DifferentialEquations.jl

**URL:** https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873
**Category:** General Usage
**Tags:** question, diffeq
**Created:** [September 1, 2020, 3:13am UTC](https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873 "2020-09-01T03:13:19Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![VMHidalgo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vmhidalgo/32/23055_2.png) [@VMHidalgo](https://discourse.julialang.org/u/VMHidalgo)
#### Post date: [September 1, 2020, 3:13am UTC](https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873/1 "2020-09-01T03:13:20Z")

</div>

Hi  
I’d like to know how to implement a Kuramoto-like (coupled nonlinear oscillators) system in DifferentialEquations.jl. If you are familiar with this stuff, I am trying to produce a system proposed by Matthew,Mirollo and Strogatz [Here is the paper](https://www.sciencedirect.com/science/article/abs/pii/016727899190129W)

To my understanding, this is just a system of ODE. I produced a minimal example of it here with three oscillators(below). The thing is that they use 800 oscillators.

_**How one is supposed to implement (elegantly) a large system of DiffEqs in DifferentialEquations.jl ??? With Metaprogramming? Another magic?**_

My MWE:

Each oscillator z\_{j} is just  
z\_{j}=(1-|z\_{j}|^2+iw\_{j})z\_{j}+K(mean(all \,\, z\_{j}) -z\_{j})

```julia
function parametrized_strogatz(du,u,p,t)
#Coupling constant
K=p.K
##order parameter
du[1]=(du[2]+du[3]+du[4])/3.0   
#oscillators
du[2] = (1.0-abs2(u[2])+p.w2*im)u[2]+K*(u[1]-u[2])
du[3] = (1.0-abs2(u[3])+p.w3*im)u[3]+K*(u[1]-u[3])
du[4] = (1.0-abs2(u[4])+p.w4*im)u[4]+K*(u[1]-u[4])
end
u0 = [1.0+0.0im,1.0+0.0im,1.0+0.0im] ##starting points
pushfirst!(u0,sum(u0)) ## starting point of the order parameter(sum of all oscillators)
tspan = (0.0,100.0)
# K=coupling constant 
#wi=natural frequency of oscillator i 
p = (K=0.9,w2=7,w3=10,w4=13)
prob = ODEProblem(parametrized_strogatz,u0,tspan,p)
sol = solve(prob)
p1=plot(sol,vars=(0,[1,2,3,4]),labels=["Order parameter" "oscillator 1" "oscillator 2" "oscillator 3"])

```

![anotherexample](https://global.discourse-cdn.com/julialang/original/3X/e/a/ead7791bc8cc605ccb95b252e6532eedb832627d.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: [September 1, 2020, 3:31am UTC](https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873/2 "2020-09-01T03:31:12Z")

</div>

Now just do a loop.

---

<div class="post-metadata">

### Author: ![VMHidalgo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vmhidalgo/32/23055_2.png) [@VMHidalgo](https://discourse.julialang.org/u/VMHidalgo)
#### Post date: [September 1, 2020, 3:38am UTC](https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873/3 "2020-09-01T03:38:09Z")

</div>

Hey, I am so grateful you developed this ecosystem. Many thanks.

I am afraid I do not get what you mean. Could you please explain it a little? What do I loop?

The idea is that all 800 oscillators should be instantiated simultaneously so they interact with each other from t=0

---

<div class="post-metadata">

### Author: ![VMHidalgo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vmhidalgo/32/23055_2.png) [@VMHidalgo](https://discourse.julialang.org/u/VMHidalgo)
#### Post date: [September 1, 2020, 8:02am UTC](https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873/4 "2020-09-01T08:02:50Z")

</div>

For anyone interested, this is the solution(I came up with) using loops as @ChrisRackauckas suggested. Thank you.

```julia
function parametrized_strogatz(du,u,p,t)
    #Coupling constant
    K=p["K"]
    ##centroid
    du[1]=0
    for i in 1:p["N"]
        du[1]+=du[i+1]
    end
    du[1]=du[1]/p["N"]
    #oscillators
    for i in 1:p["N"]
        du[i+1]=(1.0-abs2(u[i+1])+p["w$(i+1)"]*im)u[i+1]+K*(u[1]-u[i+1])
    end
end

```

---

<div class="post-metadata">

### Author: ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)
#### Post date: [September 1, 2020, 9:01am UTC](https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873/5 "2020-09-01T09:01:30Z")

</div>

I am not sure why you dont use a vector for the weights. Also, a named tuple for `p` seems cleaner.

```julia
par = (K = 1., N = 10, w = rand(10)) # sent to the following function

function parametrized_strogatz(du,u,p,t)
    #Coupling constant
    K = p.K
    N = p.N
    w = p.w

    ##centroid
    du[1]=0
    for i in 1:N
        du[1]+=du[i+1]
    end
    du[1]=du[1]/N
    #oscillators
    for i in 1:N
        du[i+1]=(1.0-abs2(u[i+1])+w[i+1]*im)*u[i+1]+K*(u[1]-u[i+1])
    end
end

```

---

<div class="post-metadata">

### Author: ![VMHidalgo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vmhidalgo/32/23055_2.png) [@VMHidalgo](https://discourse.julialang.org/u/VMHidalgo)
#### Post date: [September 1, 2020, 8:30pm UTC](https://discourse.julialang.org/t/kuramoto-like-coupled-oscillators-in-differentialequations-jl/45873/6 "2020-09-01T20:30:55Z")

</div>

I was doing more things with other functions that I did not post here, that is why. But yes, it is much cleaner the way you write it. Thank you
