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

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Augusto Dufloth
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 help

Augusto
--
"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
Reply | Threaded
Open this post in threaded view
|

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

Fabrice Silva-2
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

from scipy.integrate import ode

def f(t, y, arg1):
    return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
    return [[1j*arg1, 1], [0, -arg1*2*y[1]]]

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[0])
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 regards

Fabrice

_______________________________________________
SciPy-User mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/scipy-user
Reply | Threaded
Open this post in threaded view
|

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

Fabrice Silva-2
see https://pastebin.com/TKt12AEE for a readable version of the code sample

Le 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

from scipy.integrate import ode

def f(t, y, arg1):
    return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
    return [[1j*arg1, 1], [0, -arg1*2*y[1]]]

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[0])
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 regards

Fabrice


_______________________________________________
SciPy-User mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/scipy-user
Reply | Threaded
Open this post in threaded view
|

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

Augusto Dufloth
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 regards



On Sat, Feb 1, 2020 at 0:18 Fabrice Silva <[hidden email]> wrote:
see https://pastebin.com/TKt12AEE for a readable version of the code sample

Le 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

from scipy.integrate import ode

def f(t, y, arg1):
    return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
    return [[1j*arg1, 1], [0, -arg1*2*y[1]]]

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[0])
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 regards

Fabrice

_______________________________________________
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
Reply | Threaded
Open this post in threaded view
|

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

mansing takale
Great, Nice contribution


On 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 regards



On Sat, Feb 1, 2020 at 0:18 Fabrice Silva <[hidden email]> wrote:
see https://pastebin.com/TKt12AEE for a readable version of the code sample

Le 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

from scipy.integrate import ode

def f(t, y, arg1):
    return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
    return [[1j*arg1, 1], [0, -arg1*2*y[1]]]

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[0])
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 regards

Fabrice

_______________________________________________
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