How to pass arguments as tuple to odeint?

Question:

I wanted to use odeint of scipy with a function

def func(y,t,a=123,b=456)

then use it as

odeint(func,y0,t)

If I want to change the values a and b using args

odeint(func,y0,t,args=(a=1,b=2))

It complains that arguments are not tuple.
It may be a very elementary question,
how can I pass keyword arguments as a tuple?

odeint(func,y0,t,args=...?)
Asked By: user2775514

||

Answers:

You just need to remove the assignments to make a legit tuple:

odeint(func,y0,t,args=(123, 456))

There’s another answer here with an example of calling odeint with arguments.

Answered By: pneumatics

I know this is old, but here is my solution:

  1. first, we must segment the time we are going to use according to the parameters we are going to use.

  2. then, we made a zip(time, a, b) loop, therefore, a and b must have the same length.

    def time_segment(tobesimilar, dt_float=0.01):
        '''time_segment produces an array of dt-length time intervals, the shape of the output is ( len(tobesimilar), 2)
        inputs: 
            tobesimilar: array or list, which length (len) is only used as a reference     to be duplicated 
            dt: float, dt refers to what is going to be our integration step, in this case, it is used as the interval length.
        output: 
            tmp: array, such as tmp.shape= (len(tobesimilar),2) 
            '''
        newt=np.arange(0,len(tobesimilar)*dt, dt)
    
        #segments the nwet[a,b] in n intervals [a_i,b_i]
        #whith a_0 = 0 and b_n = newt[-1] 
         if len(newt)%2==0: #if len(newt) is even, no problem
             tmp = [[newt[i],newt[i+1]] for i in range(len(newt)-1)]
         else: #if len(newt) is odd, just add an item
             newt= np.append(newt,newt[-1]+dt)
             tmp = [[newt[i],newt[i+1]] for i in range(len(newt)-1)]
    
         #turns tmp into an array cause <3 (heart) numpy
         tmp=np.array(tmp)
    
         return tmp
    
    def func(t,y,a=123,b=456):
       return print( "what ever your function does" )
    
    a=np.array([1,2,3,45,67,88])
    b=np.array([54,4,1,99,42,100])
    y_0= 0 #initial condition
    solution=np.asanyarray([y_0]) #preallocate the output
    time=time_segment(vol, dt=dt)
    
    for ts in zip(time, a, b):
        y = odeint(func, y0=solution[-1], t=ts[0], args=(ts[1],ts[2],), tfirst= True)
        solution = np.append(solution, [y.T[0][1]])
    
    
Answered By: Erre Hache
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.