2012-02-27 17 views
5

Ben çalıştırdığınızda şu anda, ancak, bir birleştiğinde ODE sistemini hesaplamak için scipy en odeint kullanarak bir piton acemi değilim, piton kabuk hepOdeint nasıl başarılı yapılır?

>>> 
Excess work done on this call (perhaps wrong Dfun type). 
Run with full_output = 1 to get quantitative information. 
>>> 

Yani, benim zaman adımı ve son bir kez değiştirmek zorunda olduğunu söyle Entegre edilebilir hale getirmek için. Bunu yapmak için farklı bir kombinasyon denemeliyim ki bu oldukça acı verici. Herkes bana ode sistemini başarıyla entegre etmek için zaman adımını ve son süreyi otomatik olarak değiştirmesi için odeint'dan nasıl sorabilirim? Burada

ve odeint çağrısında kod parçasıdır:

wrapped_bloch3 fonksiyonu işlem dy/dt olan
def main(t, init_pop_a, init_pop_b, *args, **kwargs): 
    """ 
    solve the obe for a given set of parameters 
    """ 
    # construct initial condition 
    # initially, rho_ee = 0 
    rho_init = zeros((16,16))*1j ######## 
    rho_init[1,1] = init_pop_a 
    rho_init[2,2] = init_pop_b 
    rho_init[0,0] = 1 - (init_pop_a + init_pop_b)######## 
    rho_init_ravel, params = to_1d(rho_init) 
    # perform the integration 
    result = odeint(wrapped_bloch3, rho_init_ravel, t, args=args) 
         # BUG: need to pass kwargs 
    # rewrap the result 
    return from_1d(result, params, prepend=(len(t),)) 

things = [2*pi, 20*pi, 0,0, 0,0, 0.1,100] 
Omega_a, Omega_b, Delta_a, Delta_b, \ 
init_pop_a, init_pop_b, tstep, tfinal = things 
args = (Delta_a, Delta_b, Omega_a, Omega_b) 
t = arange(0, tfinal + tstep, tstep) 
data = main(t, init_pop_a, init_pop_b, *args) 

plt.plot(t,abs(data[:,4,4])) 

.

+2

Eğer odeint için kodunuzu, özellikle aramanın daha verebilir misiniz? –

+0

Yardım almak için sağladığınızdan çok daha fazla ayrıntı eklemeniz gerekecek: Hangi tür ODE'lerle çalışıyorsunuz? Sertleşiyorlar mı? Odeint'e Jacobian işlevi sağlıyor musunuz? Makul olduğundan emin misin? – talonmies

+0

tekrarladığınız için teşekkürler ve sorumu güncelledim :) – user1233157

cevap

1

DÜZENLEME: Ben zaten burada bir cevap var not:

odeintcomplex ODE systems in scipy kompleks değerli denklemler ile çalışmaz. Ben olsun

from scipy.integrate import odeint 
import numpy as np 
def func(t, y): 
    return 1 + 1j 
t = np.linspace(0, 1, 200) 
y = odeint(func, 0, t) 
# -> This outputs: 
# 
# TypeError: can't convert complex to float 
# odepack.error: Result from function call is not a proper array of floats. 
diğer gazel çözücüsü tarafından denkleminizi çözebilir

:

from scipy.integrate import ode 
import numpy as np 

def myodeint(func, y0, t): 
    y0 = np.array(y0, complex) 
    func2 = lambda t, y: func(y, t) # odeint has these the other way :/ 
    sol = ode(func2).set_integrator('zvode').set_initial_value(y0, t=t[0]) 
    y = [sol.integrate(tp) for tp in t[1:]] 
    y.insert(0, y0) 
    return np.array(y) 

def func(y, t, alpha): 
    return 1j*alpha*y 

alpha = 3.3 
t = np.linspace(0, 1, 200) 
y = myodeint(lambda y, t: func(y, t, alpha), [1, 0, 0], t) 
İlgili konular