Quantcast

[Scilab-users] Avoiding a loop

classic Classic list List threaded Threaded
6 messages Options
Frieder Nikolaisen Frieder Nikolaisen
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[Scilab-users] Avoiding a loop

Hello,

I did write an example code, but I do not like the time consuming way I solved the problem. With 50 000 lines in the matrix, it wouldn't be fun.

How can I avoid using the for-loop?

10,     80;
11,     200
15,     0];

batt = 1000;
gen = 0;

n = 1
for n=1:5

    if P(n,2) > 100 then
        if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
        else
        gen = gen + P(n,2) * (P(n+1,1) - P(n,1))
        end
    
    else
    batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
    end
disp('n ' + string(n))
disp('batt ' + string(batt))
disp('gen ' + string(gen))
end

Thanks alot!


Best regards
Frieder
 

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Tim Wescott Tim Wescott
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Avoiding a loop

I had a cool solution for you, but then I saw that you're implementing
a difference equation, with current values of batt (for instance)
depending on prior values.

I think that no, you can't eliminate the loop.  If speed is a concern
and if you're using the code heavily, you can put it in a C function --
but that's only for really heavy pro users.

On Wed, 2017-05-10 at 17:23 +0200, Frieder Nikolaisen wrote:

> Hello,
> I did write an example code, but I do not like the time consuming way
> I solved the problem. With 50 000 lines in the matrix, it wouldn't be
> fun.
> How can I avoid using the for-loop?
> 10,     80;
> 11,     200
> 15,     0];
>
> batt = 1000;
> gen = 0;
>
> n = 1
> for n=1:5
>
>     if P(n,2) > 100 then
>         if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
>         else
>         gen = gen + P(n,2) * (P(n+1,1) - P(n,1))
>         end
>     
>     else
>     batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
>     end
> disp('n ' + string(n))
> disp('batt ' + string(batt))
> disp('gen ' + string(gen))
> end
> Thanks alot!
>
> Best regards
> Frieder 
>  
> _______________________________________________
> users mailing list
> [hidden email]
> http://lists.scilab.org/mailman/listinfo/users
--

Tim Wescott
www.wescottdesign.com
Control & Communications systems, circuit & software design.
Phone: 503.631.7815
Cell:  503.349.8432



_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Amanda Osvaldo Amanda Osvaldo
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Avoiding a loop

In reply to this post by Frieder Nikolaisen
What it's the equation you need to compute ?
Perhaps I can help.

I think it's possible to compute with something in this way:

map = find (P(:,2) > 100 );
if batt > 800 then
    batt = batt - P(map,2) * (P(map+1,1) - P(map,1));
end


On Wed, 2017-05-10 at 17:23 +0200, Frieder Nikolaisen wrote:

Hello,

I did write an example code, but I do not like the time consuming way I solved the problem. With 50 000 lines in the matrix, it wouldn't be fun.

How can I avoid using the for-loop?

10,     80;
11,     200
15,     0];

batt = 1000;
gen = 0;

n = 1
for n=1:5

    if P(n,2) > 100 then
        if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
        else
        gen = gen + P(n,2) * (P(n+1,1) - P(n,1))
        end
    
    else
    batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
    end
disp('n ' + string(n))
disp('batt ' + string(batt))
disp('gen ' + string(gen))
end

Thanks alot!


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

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Frieder Nikolaisen Frieder Nikolaisen
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Avoiding a loop

Thanks for all the answers.


I feared that there is no way around a loop. During the process batt (Battery) is charged and discharged. In my example, it is only discharged. I will code the entire problem with a loop, maybe somebody knows something to speed up the process with the full problem. (Tim: I am not a programming pro, a C-function might not be a solution. )
Why do I try avoidng a loop? I do have txt-document with 50 000 to 100 000 lines about a (hybrid-)locomotive shunting process. I do need to optimize the energy managment. Because I am not mathemtic student, I have to solve the problem empirical (try and error). The programm has to run a few hundred times. With a matrix thats no problem, but with matrixes only, I can only calculate the diesel usage without any battery energy storage.

Thanks for the checking my code anyway.


Am 10.05.2017 um 20:53 schrieb Amanda Osvaldo:
What it's the equation you need to compute ?
Perhaps I can help.

I think it's possible to compute with something in this way:

map = find (P(:,2) > 100 );
if batt > 800 then
    batt = batt - P(map,2) * (P(map+1,1) - P(map,1));
end


On Wed, 2017-05-10 at 17:23 +0200, Frieder Nikolaisen wrote:

Hello,

I did write an example code, but I do not like the time consuming way I solved the problem. With 50 000 lines in the matrix, it wouldn't be fun.

How can I avoid using the for-loop?

10,     80;
11,     200
15,     0];

batt = 1000;
gen = 0;

n = 1
for n=1:5

    if P(n,2) > 100 then
        if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
        else
        gen = gen + P(n,2) * (P(n+1,1) - P(n,1))
        end
    
    else
    batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
    end
disp('n ' + string(n))
disp('batt ' + string(batt))
disp('gen ' + string(gen))
end

Thanks alot!


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


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


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Tim Wescott Tim Wescott
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Avoiding a loop

Depending on how often you switch between battery and generator, and
how icky-picky you're willing to be, there may be a way to reduce
computation.

It looks like the term P(n,2) * (P(n+1,1) - P(n,1)) is always there,
and you're either adding it to 'gen' (is it energy production?) or
subtracting it from 'batt'.

If you really want to go there, you can vectorize "if" statements by
using boolean expressions on vectors and the "find" function, which
returns indexes of true results.  Then you can use "cumsum" on your
P(n,2) * (P(n+1,1) - P(n,1)) term to find where the battery state of
charge (I assume that's what 'batt' is) hits 800.

It'll be complicated.  It'll be prone to error.  Proving that it's
correct will be a pain.  But when you get it working, it'll be
considerably faster.

On Thu, 2017-05-11 at 09:17 +0200, Frieder Nikolaisen wrote:

> Thanks for all the answers. 
>
> I feared that there is no way around a loop. During the process batt
> (Battery) is charged and discharged. In my example, it is only
> discharged. I will code the entire problem with a loop, maybe
> somebody knows something to speed up the process with the full
> problem. (Tim: I am not a programming pro, a C-function might not be
> a solution. )
> Why do I try avoidng a loop? I do have txt-document with 50 000 to
> 100 000 lines about a (hybrid-)locomotive shunting process. I do need
> to optimize the energy managment. Because I am not mathemtic student,
> I have to solve the problem empirical (try and error). The programm
> has to run a few hundred times. With a matrix thats no problem, but
> with matrixes only, I can only calculate the diesel usage without any
> battery energy storage. 
> Thanks for the checking my code anyway. 
>
> Am 10.05.2017 um 20:53 schrieb Amanda Osvaldo:
> > What it's the equation you need to compute ?
> > Perhaps I can help.
> >
> > I think it's possible to compute with something in this way:
> >
> > map = find (P(:,2) > 100 );
> > if batt > 800 then
> >     batt = batt - P(map,2) * (P(map+1,1) - P(map,1));
> > end
> >
> >
> > On Wed, 2017-05-10 at 17:23 +0200, Frieder Nikolaisen wrote:
> > > Hello,
> > > I did write an example code, but I do not like the time consuming
> > > way I solved the problem. With 50 000 lines in the matrix, it
> > > wouldn't be fun.
> > > How can I avoid using the for-loop?
> > > 10,     80;
> > > 11,     200
> > > 15,     0];
> > >
> > > batt = 1000;
> > > gen = 0;
> > >
> > > n = 1
> > > for n=1:5
> > >
> > >     if P(n,2) > 100 then
> > >         if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) -
> > > P(n,1))
> > >         else
> > >         gen = gen + P(n,2) * (P(n+1,1) - P(n,1))
> > >         end
> > >     
> > >     else
> > >     batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
> > >     end
> > > disp('n ' + string(n))
> > > disp('batt ' + string(batt))
> > > disp('gen ' + string(gen))
> > > end
> > > Thanks alot!
> > >
> > > Best regards
> > > Frieder 
> > >  
> > > _______________________________________________
> > > users mailing list
> > > [hidden email]
> > > http://lists.scilab.org/mailman/listinfo/users
> >  
> > _______________________________________________
> > users mailing list
> > [hidden email]
> > http://lists.scilab.org/mailman/listinfo/users
>  
> _______________________________________________
> users mailing list
> [hidden email]
> http://lists.scilab.org/mailman/listinfo/users
--

Tim Wescott
www.wescottdesign.com
Control & Communications systems, circuit & software design.
Phone: 503.631.7815
Cell:  503.349.8432



_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Frieder Nikolaisen Frieder Nikolaisen
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Avoiding a loop

Hello Tim,

Yes. batt is the is the State of Charge of the battery. P(n,2)  (kN) is the power taken rom battery, engine or both. I will calculate the battery in As, so P(n,2) is only an in alternate value - but thats fare to complicated for the example code.

"Proving that it's correct will be a pain." - prooving the for-loop and getting the same result with your way - that might be a prooving.

As I have to code the loop anyway, I will consider your if the loop is very slow.

 

Best regards

Frieder

Am 2017-05-11 18:48, schrieb Tim Wescott:

Depending on how often you switch between battery and generator, and
how icky-picky you're willing to be, there may be a way to reduce
computation.

It looks like the term P(n,2) * (P(n+1,1) - P(n,1)) is always there,
and you're either adding it to 'gen' (is it energy production?) or
subtracting it from 'batt'.

If you really want to go there, you can vectorize "if" statements by
using boolean expressions on vectors and the "find" function, which
returns indexes of true results.  Then you can use "cumsum" on your
P(n,2) * (P(n+1,1) - P(n,1)) term to find where the battery state of
charge (I assume that's what 'batt' is) hits 800.

It'll be complicated.  It'll be prone to error.  Proving that it's
correct will be a pain.  But when you get it working, it'll be
considerably faster.

On Thu, 2017-05-11 at 09:17 +0200, Frieder Nikolaisen wrote:
Thanks for all the answers.  I feared that there is no way around a loop. During the process batt (Battery) is charged and discharged. In my example, it is only discharged. I will code the entire problem with a loop, maybe somebody knows something to speed up the process with the full problem. (Tim: I am not a programming pro, a C-function might not be a solution. ) Why do I try avoidng a loop? I do have txt-document with 50 000 to 100 000 lines about a (hybrid-)locomotive shunting process. I do need to optimize the energy managment. Because I am not mathemtic student, I have to solve the problem empirical (try and error). The programm has to run a few hundred times. With a matrix thats no problem, but with matrixes only, I can only calculate the diesel usage without any battery energy storage.  Thanks for the checking my code anyway.  Am 10.05.2017 um 20:53 schrieb Amanda Osvaldo:
What it's the equation you need to compute ? Perhaps I can help. I think it's possible to compute with something in this way: map = find (P(:,2) > 100 ); if batt > 800 then     batt = batt - P(map,2) * (P(map+1,1) - P(map,1)); end On Wed, 2017-05-10 at 17:23 +0200, Frieder Nikolaisen wrote:
Hello, I did write an example code, but I do not like the time consuming way I solved the problem. With 50 000 lines in the matrix, it wouldn't be fun. How can I avoid using the for-loop? 10,     80; 11,     200 15,     0]; batt = 1000; gen = 0; n = 1 for n=1:5     if P(n,2) > 100 then         if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) - P(n,1))         else         gen = gen + P(n,2) * (P(n+1,1) - P(n,1))         end          else     batt = batt - P(n,2) * (P(n+1,1) - P(n,1))     end disp('n ' + string(n)) disp('batt ' + string(batt)) disp('gen ' + string(gen)) end Thanks alot! Best regards Frieder    _______________________________________________ users mailing list [hidden email] http://lists.scilab.org/mailman/listinfo/users
  _______________________________________________ users mailing list [hidden email] http://lists.scilab.org/mailman/listinfo/users
  _______________________________________________ users mailing list [hidden email] http://lists.scilab.org/mailman/listinfo/users

 

 

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