[SciPy-user] Using odeint to solve complex-valued ode's

David L. Goldsmith David.L.Goldsmith at noaa.gov
Fri Nov 17 17:09:52 CST 2006

Robert Kern wrote:
> Calling real(f) where f is a function object won't do anything sensible. In
> fact, what's happening is that numpy doesn't recognize it as an ndarray, so it
> calls array(f) to make it an array. array() doesn't recognize it as any kind of
> sequence or number, so it assumes that you wanted to treat it as a scalar type
> numpy.object_ (the numpy scalar version of object arrays). I believe when faced
> with an object array, real() simply returns its input just like it does for any
> dtype that is not explicitly complex. The result is a scalar object, which is
> not callable; thus, you get that exception.
Yeah, I figured something like that was what was happening.

>> This is correct from what I remember. I don't think that the underlying ODEPACK
>> handles complex-valued ODEs (except as converted to a real vector-valued ODE)
OK.  Perhaps you can save me a little time.  Let cv() = transpose(u + 
iv, u' + iv').  Then if I have:

cv()' = L * cv() = A*cv() + iB*cv() (where A and B, the real and 
imaginary parts of L, resp., are real-valued 2x2 matrices)

which expanded and separated into real and imaginary parts becomes:

cv(u, u')' = A*cv(u,u') - B*cv(v,v')
cv(v, v')' = A*cv(v,v') + B*cv(u,u')

then this is equivalent to the four by four real-valued system:
                          |  A -B |
cv(u, u', v, v')' = |  B  A | * cv(u, u', v, v'), correct?  (I hope none 
of my former linear algebra teachers are reading this :-) .  If they 
are: for the record, A) I'm 99% sure this is right; B) I could of course 
go look it up, but all my LA books are at work and I'm working at home; 
and C) I'm still capable of proving it, but it's time consuming, thus 
the preface: "perhaps you can save me a little time".)

Thanks as always,


More information about the SciPy-user mailing list