简体   繁体   中英

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM