Keep y value below certain value in a loop
3 views (last 30 days)
I am trying to run a function, where y can never be below zero and never above Capacity.
The function looks like that:
remainingCharge = Capacity - usage + ChargingPower
So remainingCharge = y and is not allowed to go below 0 or beyond Capacity.
for x = 1:1:tablesize
t.remainingCharge = Capacity - t.usage(x) + t.ChargingPower(x)
if t.remainingCharge(x) > Capacity
remainingCharge(x) == Capacity
This is not working, as Capacity needs to be as long as the tablerows - currently I am adding Capacity to the table - hopfeully this works.
In the meantime if anyone has a suggestion on how to solve this I am happily taking hints!
Image Analyst on 17 Apr 2021
t.remainingCharge(x) = Capacity - t.usage(x) + t.ChargingPower(x) % x is the row number I think.
% Make it never be above Capacity
t.remainingCharge(x) = min([t.remainingCharge(x), Capacity]);
% Make it never be below 0
t.remainingCharge(x) = max([t.remainingCharge(x), 0]);
Star Strider on 17 Apr 2021
Edited: Star Strider on 17 Apr 2021
Try something like this:
x = linspace(0, 5*pi, 250);
Capacity = 0.7;
limit_y = @(y,Capacity) (y<0).*0 + (y>Capacity).*Capacity + ((y>=0) & (y<Capacity)).*y;
y = sin(x);
plot(x, y, 'LineWidth',1)
plot(x, limit_y(y,Capacity), '--', 'LineWidth',1.5)
Note that no explicit loops are necessary, since the anonymous functrion does everything in one call.
The anonymous function is designed to work on vectors, however it is certainly possible to call the anonymous function in a loop with individual scalar values as the ‘y’ argument. It will work the same way, regardless.
Experiment with it to get the result you want.
EDIT — (17 Apr 2021 at 17:12)
Added plot image to illustrate function effect —