# [SciPy-User] How to create a request to change a function? Classic List Threaded 5 messages Open this post in threaded view
|

## [SciPy-User] How to create a request to change a function?

 Hello,I have a request to change one of scipy’s function.I am trying to use odeint to integrate a set of equations of motion. My state equations rely on time dependent inputs. And these inputs are numpy arrays.When I do a flight path reconstruction, the inputs comes from the inertial system of the aircraft and I plug it into the state equations, so I get the deterministic position of the aircraft and than I can compare it to the measured values.The issue is that I can’t input an array. Searching stackoverflow I saw solutions using for-loops and assigning an arg for each time step. This is counter productive and create a huge time calculation for long arrays.I created my own C-dll to deal with this for loop issue, but it’s super counter productive. Can we get an option that the input args are arrays if same size of t, and as the state is integrated, the index of the arg follows the states?Thanks for your helpAugusto-- "The greatest challenge to any thinker is stating the problem in a way that will allow a solution." - Bertrand Russell _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: How to create a request to change a function?

 Le vendredi 31 janvier 2020, Augusto Dufloth a écrit :Hello,I have a request to change one of scipy’s function.I am trying to use odeint to integrate a set of equations of motion. My state equations rely on time dependent inputs. And these inputs are numpy arrays.When I do a flight path reconstruction, the inputs comes from the inertial system of the aircraft and I plug it into the state equations, so I get the deterministic position of the aircraft and than I can compare it to the measured values.The issue is that I can’t input an array. Searching stackoverflow I saw solutions using for-loops and assigning an arg for each time step. This is counter productive and create a huge time calculation for long arrays.I created my own C-dll to deal with this for loop issue, but it’s super counter productive. Can we get an option that the input args are arrays if same size of t, and as the state is integrated, the index of the arg follows the states?Hi,As far as I understand, you want to use time-varying parameters (which includes right-hand side terms of ODEs) specified as numpy array (i.e., at discrete time values) while ODEs are defined in the continuous-time domain. Specification of an extrapolation method is required for the well-posedness of the problem: the most trivial is the "Sample-and-hold" process which maintain values until next sample step.One simple solution (maybe one that you arleady tested) is to use the ode class and its integrate method.Adapting the example given in the docs https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode`from scipy.integrate import ode``def f(t, y, arg1):`` return [1j*arg1*y + y, -arg1*y**2]``def jac(t, y, arg1):`` return [[1j*arg1, 1], [0, -arg1*2*y]]``r = ode(f, jac).set_integrator('zvode', method='bdf')``t = np.arange(0, 10, 1)``results = np.empty((len(t), 1 + len(y0)), dtype=float) + np.nan``r.set_initial_value([1.0j, 2.0], t)``for ind in range(len(t) - 1):`` r.set_f_params(param[ind]).set_jac_params(param[ind])`` tmp_result = r.integrate(t[ind+1])`` if not r.successful():`` break`` results[ind] = tmp_result`This introduced a reasonnable overhead in performance while begin quite readable.Best regardsFabrice _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: How to create a request to change a function?

 see https://pastebin.com/TKt12AEE for a readable version of the code sampleLe vendredi 31 janvier 2020, Fabrice Silva a écrit :Le vendredi 31 janvier 2020, Augusto Dufloth a écrit :Hello,I have a request to change one of scipy’s function.I am trying to use odeint to integrate a set of equations of motion. My state equations rely on time dependent inputs. And these inputs are numpy arrays.When I do a flight path reconstruction, the inputs comes from the inertial system of the aircraft and I plug it into the state equations, so I get the deterministic position of the aircraft and than I can compare it to the measured values.The issue is that I can’t input an array. Searching stackoverflow I saw solutions using for-loops and assigning an arg for each time step. This is counter productive and create a huge time calculation for long arrays.I created my own C-dll to deal with this for loop issue, but it’s super counter productive. Can we get an option that the input args are arrays if same size of t, and as the state is integrated, the index of the arg follows the states?Hi,As far as I understand, you want to use time-varying parameters (which includes right-hand side terms of ODEs) specified as numpy array (i.e., at discrete time values) while ODEs are defined in the continuous-time domain. Specification of an extrapolation method is required for the well-posedness of the problem: the most trivial is the "Sample-and-hold" process which maintain values until next sample step.One simple solution (maybe one that you arleady tested) is to use the ode class and its integrate method.Adapting the example given in the docs https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode`from scipy.integrate import ode``def f(t, y, arg1):`` return [1j*arg1*y + y, -arg1*y**2]``def jac(t, y, arg1):`` return [[1j*arg1, 1], [0, -arg1*2*y]]``r = ode(f, jac).set_integrator('zvode', method='bdf')``t = np.arange(0, 10, 1)``results = np.empty((len(t), 1 + len(y0)), dtype=float) + np.nan``r.set_initial_value([1.0j, 2.0], t)``for ind in range(len(t) - 1):`` ``r.set_f_params(param[ind]).set_jac_params(param[ind])`` tmp_result = r.integrate(t[ind+1])`` if not r.successful():`` break`` results[ind] = tmp_result`This introduced a reasonnable overhead in performance while begin quite readable.Best regardsFabrice _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user
 Thanks for your email!My point is: for the sake of the formal definition of ode, the function is lacking a convenient feature. Since you have to input as an argument a time array, it would be super useful to have the option to also input time-varying arguments of the same length as t.Checking stackoverflow you find that many people would benefit from this addition.Because of the lack of this feature, I had to create my own ODE as a C function. In a practical example the time to solve my system was reduced by 20 fold. As compared to the solution you provided (and I also tried in the past). I believe this could be even faster, but I lack the skills of code optimization.Kind regardsOn Sat, Feb 1, 2020 at 0:18 Fabrice Silva <[hidden email]> wrote:see https://pastebin.com/TKt12AEE for a readable version of the code sampleLe vendredi 31 janvier 2020, Fabrice Silva a écrit :Le vendredi 31 janvier 2020, Augusto Dufloth a écrit :Hello,I have a request to change one of scipy’s function.I am trying to use odeint to integrate a set of equations of motion. My state equations rely on time dependent inputs. And these inputs are numpy arrays.When I do a flight path reconstruction, the inputs comes from the inertial system of the aircraft and I plug it into the state equations, so I get the deterministic position of the aircraft and than I can compare it to the measured values.The issue is that I can’t input an array. Searching stackoverflow I saw solutions using for-loops and assigning an arg for each time step. This is counter productive and create a huge time calculation for long arrays.I created my own C-dll to deal with this for loop issue, but it’s super counter productive. Can we get an option that the input args are arrays if same size of t, and as the state is integrated, the index of the arg follows the states?Hi,As far as I understand, you want to use time-varying parameters (which includes right-hand side terms of ODEs) specified as numpy array (i.e., at discrete time values) while ODEs are defined in the continuous-time domain. Specification of an extrapolation method is required for the well-posedness of the problem: the most trivial is the "Sample-and-hold" process which maintain values until next sample step.One simple solution (maybe one that you arleady tested) is to use the ode class and its integrate method.Adapting the example given in the docs https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode`from scipy.integrate import ode``def f(t, y, arg1):`` return [1j*arg1*y + y, -arg1*y**2]``def jac(t, y, arg1):`` return [[1j*arg1, 1], [0, -arg1*2*y]]``r = ode(f, jac).set_integrator('zvode', method='bdf')``t = np.arange(0, 10, 1)``results = np.empty((len(t), 1 + len(y0)), dtype=float) + np.nan``r.set_initial_value([1.0j, 2.0], t)``for ind in range(len(t) - 1):`` ``r.set_f_params(param[ind]).set_jac_params(param[ind])`` tmp_result = r.integrate(t[ind+1])`` if not r.successful():`` break`` results[ind] = tmp_result`This introduced a reasonnable overhead in performance while begin quite readable.Best regardsFabrice _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user -- "The greatest challenge to any thinker is stating the problem in a way that will allow a solution." - Bertrand Russell _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user
 Great, Nice contributionOn Sat, Feb 1, 2020 at 4:11 AM Augusto Dufloth <[hidden email]> wrote:Thanks for your email!My point is: for the sake of the formal definition of ode, the function is lacking a convenient feature. Since you have to input as an argument a time array, it would be super useful to have the option to also input time-varying arguments of the same length as t.Checking stackoverflow you find that many people would benefit from this addition.Because of the lack of this feature, I had to create my own ODE as a C function. In a practical example the time to solve my system was reduced by 20 fold. As compared to the solution you provided (and I also tried in the past). I believe this could be even faster, but I lack the skills of code optimization.Kind regardsOn Sat, Feb 1, 2020 at 0:18 Fabrice Silva <[hidden email]> wrote:see https://pastebin.com/TKt12AEE for a readable version of the code sampleLe vendredi 31 janvier 2020, Fabrice Silva a écrit :Le vendredi 31 janvier 2020, Augusto Dufloth a écrit :Hello,I have a request to change one of scipy’s function.I am trying to use odeint to integrate a set of equations of motion. My state equations rely on time dependent inputs. And these inputs are numpy arrays.When I do a flight path reconstruction, the inputs comes from the inertial system of the aircraft and I plug it into the state equations, so I get the deterministic position of the aircraft and than I can compare it to the measured values.The issue is that I can’t input an array. Searching stackoverflow I saw solutions using for-loops and assigning an arg for each time step. This is counter productive and create a huge time calculation for long arrays.I created my own C-dll to deal with this for loop issue, but it’s super counter productive. Can we get an option that the input args are arrays if same size of t, and as the state is integrated, the index of the arg follows the states?Hi,As far as I understand, you want to use time-varying parameters (which includes right-hand side terms of ODEs) specified as numpy array (i.e., at discrete time values) while ODEs are defined in the continuous-time domain. Specification of an extrapolation method is required for the well-posedness of the problem: the most trivial is the "Sample-and-hold" process which maintain values until next sample step.One simple solution (maybe one that you arleady tested) is to use the ode class and its integrate method.Adapting the example given in the docs https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode`from scipy.integrate import ode``def f(t, y, arg1):`` return [1j*arg1*y + y, -arg1*y**2]``def jac(t, y, arg1):`` return [[1j*arg1, 1], [0, -arg1*2*y]]``r = ode(f, jac).set_integrator('zvode', method='bdf')``t = np.arange(0, 10, 1)``results = np.empty((len(t), 1 + len(y0)), dtype=float) + np.nan``r.set_initial_value([1.0j, 2.0], t)``for ind in range(len(t) - 1):`` ``r.set_f_params(param[ind]).set_jac_params(param[ind])`` tmp_result = r.integrate(t[ind+1])`` if not r.successful():`` break`` results[ind] = tmp_result`This introduced a reasonnable overhead in performance while begin quite readable.Best regardsFabrice _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user -- "The greatest challenge to any thinker is stating the problem in a way that will allow a solution." - Bertrand Russell _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user -- Sincerely Yours,Dr. Mansing V. Takale,Assistant Professor,Department of Physics,Shivaji University, Kolhapur-416004 India (M.S.)Contact: +91-9673041222 _______________________________________________ SciPy-User mailing list [hidden email] https://mail.python.org/mailman/listinfo/scipy-user