Griggs Hutaff Griggs Hutaff - 8 months ago 73
Python Question

How does this user-defined function work with scipy integrate odeint?

I am working on a project for electrical engineering where we plot the voltage over a capacitor in a RLC circuit as a function of time. I based my code on the following tutorial: Python-ODE for RLC Circuit. My code is fully functional but I just want a better understanding of how the user defined function and the SciPy integrating function works. I have read the documentation but I still have some specific questions. Here is my code:

from scipy.integrate import odeint # for integrating ode
import matplotlib.pyplot as plt # for plotting commands
import numpy as np #For loadtxt and linspace modules

R,L,C,tl,numplot = np.loadtxt('UserInput_RLC_Values.txt',unpack=True)

def RLC(A,t):
Vc,m=A
V = 2.0 #voltageSource
res=[m,(V-Vc-(m*R*C))/(L*C)]
return res

time = np.linspace(0.0,tl,numplot)
vc,m = odeint(RLC,[0.0,0.0],time).T


Here are my questions:


  1. What role are the parameter values A and t playing in the function RLC? Why is A assigned to both Vc (capacitor voltage) and m (dummy variable for v')? Is t even used?

  2. When I call RLC function inside the odeint module why aren't there any parameters?

  3. What does the .T at the end of the odeint module mean? I can't find anything about it in documentation.



Thanks for any insight on this. I hope this isn't a lazy question but I think fully understanding this will help me a great deal.

Answer Source

The ODE function passed to odeint needs to have the format f(state, time) where time is the independent variable and state the state vector. The corresponding (vector-valued) differential equation is y'(t)=f(y(t),t)

  1. ) For the standard ODE solvers you need to convert higher-order equations into systems of first order. Here using m as momentum (?) variable, m = dVc/dt. Then dm/dt = d²Vc/dt² is the second derivative.

    If the input is state = [ Vc, m ] the output needs to be [ dVc/dt, dm/dt ] = [ m, Eqn(t,Vc,m) ] where d²Vc/dt² = Eqn(t,Vc,dVc/dt) is a form of the original equation.

    t just needs to be present in the argument list, even if the ODE is time-invariant.

  2. ) You are passing the function as reference/address, not a function value

  3. ) It means "transpose". The result of odeint is a list of state vectors, which are pairs of numbers. Transposing it transforms it into a pair of lists that can be assigned to a pair of variables.