Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Solve Differential equation using Python PyDDE solver

I am trying to solve following differential equation using python package PyDDE:

dy[i]/dt = w[i] + K/N * \sum{j=1toN} sin(y[j] -y[i]), where i = 1,2,3,4...N=50

Below is the python code to solve this equation

from numpy import random, sin, arange, pi, array, zeros
import PyDDE.pydde as p

def odegrad(s, c, t):
    global N
    K = c[0]
    theta = s[0]
    w = random.standard_cauchy(N)
    for i in range(N):
        coup_sum = 0.0
        for j in range(N):
            coup_sum += sin(theta[j] - theta[i])
        theta[i] = w[i] + (K*coup_sum)/(float (N))
    return array([theta])

# constant parameters
global N
N = 50
K = 1.0
# initial values for state theta
theta0 = zeros(N, float)
for i in range(N):
    theta0[i] = random.uniform(0, 2*pi)

odecons = array([K])
odeist = array([theta0])
odestsc = array([0.0])

ode_eg = p.dde()
ode_eg.dde(y=odeist, times=arange(0.0, 300.0, 1.0), 
       func=odegrad, parms=odecons, 
       tol=0.000005, dt=1.0, hbsize=0, nlag=0, ssc=odestsc)
ode_eg.solve()
print ode_eg.data

I am getting following error:

DDE Error: Something is wrong: perhaps one of the supplied variables has the wrong type?

DDE Error: Problem initialisation failed!

DDE Error: The DDE has not been properly initialised!

None

like image 568
ADK Avatar asked Sep 19 '14 05:09

ADK


People also ask

How do you solve a differential equation in Python?

Differential equations are solved in Python with the Scipy. integrate package using function odeint or solve_ivp. t: Time points at which the solution should be reported. Additional internal points are often calculated to maintain accuracy of the solution but are not reported.

Does python have an ODE solver?

t is a one-dimensional independent variable (time), S(t) is an n-dimensional vector-valued function (state), and the F(t,S(t)) defines the differential equations. S0 be an initial value for S. The function F must have the form dS=F(t,S), although the name does not have to be F.


1 Answers

So I have had a look at what was going on internally, and both errors

DDE Error: Something is wrong: perhaps one of the supplied variables has the wrong type?
DDE Error: Problem initialisation failed!

come from the following operation failing: map(float,initstate) (see the source, line 162). This comes from the fact that Y and your other variables are vectors. Mostly this means that you should not use array([theta]) but you should use theta

Full script:

from numpy import random, sin, arange, pi, array, zeros
import PyDDE.pydde as p

def odegrad(s, c, t):
    global N
    K = c[0]
    #Change here
    theta = s
    w = random.standard_cauchy(N)
    for i in range(N):
        coup_sum = 0.0
        for j in range(N):
            coup_sum += sin(theta[j] - theta[i])
        theta[i] = w[i] + (K*coup_sum)/(float (N))
    #Change here
    return theta

# constant parameters
global N
N = 50
K = 1.0
# initial values for state theta
theta0 = zeros(N, float)
for i in range(N):
    theta0[i] = random.uniform(0, 2*pi)

odecons = array([K])
#Change here
odeist = theta0
odestsc = array([0.0])

ode_eg = p.dde()
ode_eg.dde(y=odeist, times=arange(0.0, 300.0, 1.0), 
       func=odegrad, parms=odecons, 
       tol=0.000005, dt=1.0, hbsize=0, nlag=0, ssc=odestsc)

#You should not use this line, as the last step in ode_eg.dde() is solve.
#ode_eg.solve()
print ode_eg.data
like image 88
Flavian Hautbois Avatar answered Oct 21 '22 17:10

Flavian Hautbois