2014-09-19 20 views
6

Я пытаюсь решить дифференциальное уравнение с помощью питона пакета PyDDE:Решить дифференциальное уравнение с помощью Python PyDDE решатель

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

Ниже питон код для решения этого уравнения

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 

я получаю следующее ошибка:

DDE Ошибка: что-то не так: возможно, одна из поставляемых переменных имеет неправильный тип?

DDE Ошибка: инициализация проблемы не удалась!

DDE Ошибка: DDE не был правильно инициализирован!

Ни

+0

Ваш код выглядит правильно, какая версия Python вы используете? Единственное, что я могу думать, это проблема в том, что либо odecons, odeist, либо odestsc на самом деле не массив или вам может понадобиться вернуть только тету в функцию ode grad. Пройдите через код и напечатайте типы всех переменных. –

+0

@JaredReeves Я использую Python 2.7.8 и установил PyDDE с https://github.com/hensing/PyDDE, так как у меня возникла проблема установки с текущей версией PyDDE. Я пробовал все возможные вещи, однако я сделаю это снова, как вы упомянули. – ADK

+0

Я бы просто использовал sympy. –

ответ

1

Так у меня не было смотреть на то, что происходит внутри, и как ошибки

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

приходят из следующей операции неисправного: карта (с плавающей точкой, initstate) (см source, строка 162). Это происходит из-за того, что Y и ваши другие переменные являются векторами. В основном это означает, что вы не должны использовать array([theta]) но вы должны использовать theta

Полный сценарий:

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 
Смежные вопросы