[SciPy-user] ODE solver's in scipy

Nils Wagner nwagner at mecha.uni-stuttgart.de
Mon Nov 4 08:44:04 EST 2002


Robert Kern schrieb:
> 
> On Mon, Nov 04, 2002 at 01:51:19PM +0100, Nils Wagner wrote:
> 
> [snip]
> 
> > Traceback (most recent call last):
> >   File "ivp.py", line 46, in F
> >     return linalg.solve(A(P, Pl, M, K, t,z), f(P, M, K, z))
> >   File "ivp.py", line 37, in A
> >     A[0:n,0:n] = (1.0-t)*(K[0:n,0:n]-z[n]*M[0:n,0:n])+t*P[0:n,0:n]
> > TypeError: unsubscriptable object
> > odepack.error: Error occured while calling the Python function named F
> >
> > So, what has to be amended in my program ivp.py ?
> 
> First, you must return values from functions, not assign values to the
> name of the function.
> 
> Incorrect:
> 
> def A():
>   A = zeros(...)
> 
> Correct:
> 
> def A():
>   return zeros(...)
> 
> or
> 
> def A():
>   tmp = zeros(...)
>   tmp[n,:] = ...
>   return tmp
> 
> Secondly, I don't think you are indexing correctly in A(). A[0:n,0:n]
> references the whole array, not just the diagonal.
> 
> To reference a diagonal, A.flat[0:n:n+1] works if A is still contiguous.
> 
> (Side-question to everybody else: Is there a convenience function
> somewhere in Numeric or scipy_base that allows setting the k-diagonal of
> a matrix? A.flat[0:n:n+1]?)
> 
> Third, (this is what's causing the exception) you aren't actually
> calling P(t,z) and Pl(t,z) so Python is trying to index a function.
> 
> I've attached my modifications. By the way, is z[n] supposed to change?
> Because the return value of F() has n elements, not n+1. I'm surprised
> the code runs, but it does. If it doesn't change, then you shouldn't
> have to recalculate P or Pl all the time.
> 
> I have to hit the sack now, so I'll try to get back to this tomorrow.
> 
> > Nils
> 
> --

Actually, A is a so-called bordered matrix.

A = [A_11 a_12; a_21 0]

where

A_11 = (1-t)*(K-lambda*M)+ t*P

a_12 = -(1-t)*M*x + t*Pl*x
s_21 = x^T
s_22 = 0 

The first elements of z should contain the time-varying eigenvector x(t)
The last element of z should be the eigenvalue, which varies with time,
that is lambda=lambda(t).

Nils


> Robert Kern
> Ruddock House President
> kern at caltech.edu
> 
> "In the fields of hell where the grass grows high
>  Are the graves of dreams allowed to die."
>   -- Richard Harter
> 
>   ------------------------------------------------------------------------
> 
>    ivp_kern.pyName: ivp_kern.py
>               Type: Plain Text (text/plain)



More information about the SciPy-User mailing list