[Scilab-users] Command integrate() is too slow under certain expressions

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

[Scilab-users] Command integrate() is too slow under certain expressions


Dear all,

The function integrate() is very handy to obtain a numerical primtive of a function, particularly useful when there is no closed form for the primitive or it is too involved. According to the documentation

x = integrate(expr, v, x0, x1 [, atol [, rtol]])

expr: a character string defining a Scilab expression.
v:    a character string, the integration variable name

However there is a case that would be interesting to handle, and it is when one has a set of experimental (or simulated) data xk, yk. Here there is no expression defining a function.

One way to circumvent this is using as the expression some sort of interpolator such as

x = integrate("interp1(xk, yk, x, ''spline'')", "x", x0, x1)

This works, but for some reason I don't quite understand it is very slow.

For instance,

x0 = 0
x1 = 0:0.01:2*%pi;
y1 = sin(x1);

tic
X = integrate("interp1(x1, y1, x, ''spline'')", "x", x0, x1);
toc

Requires 27 s to execute. In the meantime, control is seemingly returned to the console, one can enter instructions, but then the program freezes until the integrate comand finishes.

Changing "spline" to "linear" even worsens it rising to 33 s.

Has anybody an idea of what can be happening?

Maybe it computes the full interpolator for each single point? Even if so, I have only 629 values of the independent variable.

Regards,

Federico Miyara
 



_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
mottelet mottelet
Reply | Threaded
Open this post in threaded view
|

Re: Command integrate() is too slow under certain expressions

Hello,

The usual way to compute a primitive would be to use ode, like this:

function out=f(x, y, x1, y1, d1)
    out = interp(x,x1,y1,d1)
endfunction

x0 = 0
x1 = 0:0.01:2*%pi;
y1 = sin(x1);

d1 = splin(x1,y1);

y = ode(x0,-1,x1,list(f,x1,y1,d1))
Your proposition is very slow because you are recomputing the spline many times.

S.

Le 10/02/2020 à 20:52, Federico Miyara a écrit :

Dear all,

The function integrate() is very handy to obtain a numerical primtive of a function, particularly useful when there is no closed form for the primitive or it is too involved. According to the documentation

x = integrate(expr, v, x0, x1 [, atol [, rtol]])

expr: a character string defining a Scilab expression.
v:    a character string, the integration variable name

However there is a case that would be interesting to handle, and it is when one has a set of experimental (or simulated) data xk, yk. Here there is no expression defining a function.

One way to circumvent this is using as the expression some sort of interpolator such as

x = integrate("interp1(xk, yk, x, ''spline'')", "x", x0, x1)

This works, but for some reason I don't quite understand it is very slow.

For instance,

x0 = 0
x1 = 0:0.01:2*%pi;
y1 = sin(x1);

tic
X = integrate("interp1(x1, y1, x, ''spline'')", "x", x0, x1);
toc

Requires 27 s to execute. In the meantime, control is seemingly returned to the console, one can enter instructions, but then the program freezes until the integrate comand finishes.

Changing "spline" to "linear" even worsens it rising to 33 s.

Has anybody an idea of what can be happening?

Maybe it computes the full interpolator for each single point? Even if so, I have only 629 values of the independent variable.

Regards,

Federico Miyara
 



_______________________________________________
users mailing list
[hidden email]
https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users
-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
mottelet mottelet
Reply | Threaded
Open this post in threaded view
|

Re: Command integrate() is too slow under certain expressions

Sorry the ode call should be (y0 first, then x0)

y = ode(-1,x0,x1,list(f,x1,y1,d1))

The elapsed time seems OK:

--> tic;y = ode(-1,x0,x1,list(f,x1,y1,d1));toc
 ans  =

   0.002235

S.

Le 11/02/2020 à 08:17, Stéphane Mottelet a écrit :

Hello,

The usual way to compute a primitive would be to use ode, like this:

function out=f(x, y, x1, y1, d1)
    out = interp(x,x1,y1,d1)
endfunction

x0 = 0
x1 = 0:0.01:2*%pi;
y1 = sin(x1);

d1 = splin(x1,y1);

y = ode(x0,-1,x1,list(f,x1,y1,d1))
Your proposition is very slow because you are recomputing the spline many times.

S.

Le 10/02/2020 à 20:52, Federico Miyara a écrit :

Dear all,

The function integrate() is very handy to obtain a numerical primtive of a function, particularly useful when there is no closed form for the primitive or it is too involved. According to the documentation

x = integrate(expr, v, x0, x1 [, atol [, rtol]])

expr: a character string defining a Scilab expression.
v:    a character string, the integration variable name

However there is a case that would be interesting to handle, and it is when one has a set of experimental (or simulated) data xk, yk. Here there is no expression defining a function.

One way to circumvent this is using as the expression some sort of interpolator such as

x = integrate("interp1(xk, yk, x, ''spline'')", "x", x0, x1)

This works, but for some reason I don't quite understand it is very slow.

For instance,

x0 = 0
x1 = 0:0.01:2*%pi;
y1 = sin(x1);

tic
X = integrate("interp1(x1, y1, x, ''spline'')", "x", x0, x1);
toc

Requires 27 s to execute. In the meantime, control is seemingly returned to the console, one can enter instructions, but then the program freezes until the integrate comand finishes.

Changing "spline" to "linear" even worsens it rising to 33 s.

Has anybody an idea of what can be happening?

Maybe it computes the full interpolator for each single point? Even if so, I have only 629 values of the independent variable.

Regards,

Federico Miyara
 



_______________________________________________
users mailing list
[hidden email]
https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users
-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users
-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
fmiyara fmiyara
Reply | Threaded
Open this post in threaded view
|

Re: Command integrate() is too slow under certain expressions


Stéphane,

Thanks for your solution.

I've found another solution that is even slightly faster: I've modified the function intsplin(), changing
both instances of sum by cumsum (and some formal details), so the same interpolator is used for the whole set of data.

Regards,

Federico Miyara



On 11/02/2020 04:23, Stéphane Mottelet wrote:

Sorry the ode call should be (y0 first, then x0)

y = ode(-1,x0,x1,list(f,x1,y1,d1))

The elapsed time seems OK:

--> tic;y = ode(-1,x0,x1,list(f,x1,y1,d1));toc
 ans  =

   0.002235

S.

Le 11/02/2020 à 08:17, Stéphane Mottelet a écrit :

Hello,

The usual way to compute a primitive would be to use ode, like this:

function out=f(x, y, x1, y1, d1)
    out = interp(x,x1,y1,d1)
endfunction

x0 = 0
x1 = 0:0.01:2*%pi;
y1 = sin(x1);

d1 = splin(x1,y1);

y = ode(x0,-1,x1,list(f,x1,y1,d1))
Your proposition is very slow because you are recomputing the spline many times.

S.

Le 10/02/2020 à 20:52, Federico Miyara a écrit :

Dear all,

The function integrate() is very handy to obtain a numerical primtive of a function, particularly useful when there is no closed form for the primitive or it is too involved. According to the documentation

x = integrate(expr, v, x0, x1 [, atol [, rtol]])

expr: a character string defining a Scilab expression.
v:    a character string, the integration variable name

However there is a case that would be interesting to handle, and it is when one has a set of experimental (or simulated) data xk, yk. Here there is no expression defining a function.

One way to circumvent this is using as the expression some sort of interpolator such as

x = integrate("interp1(xk, yk, x, ''spline'')", "x", x0, x1)

This works, but for some reason I don't quite understand it is very slow.

For instance,

x0 = 0
x1 = 0:0.01:2*%pi;
y1 = sin(x1);

tic
X = integrate("interp1(x1, y1, x, ''spline'')", "x", x0, x1);
toc

Requires 27 s to execute. In the meantime, control is seemingly returned to the console, one can enter instructions, but then the program freezes until the integrate comand finishes.

Changing "spline" to "linear" even worsens it rising to 33 s.

Has anybody an idea of what can be happening?

Maybe it computes the full interpolator for each single point? Even if so, I have only 629 values of the independent variable.

Regards,

Federico Miyara
 



_______________________________________________
users mailing list
[hidden email]
https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users
-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users
-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users

intsplin_cum.sci (2K) Download Attachment