Asked by pratama mahadika
on 9 May 2019

r_gear = [17 9.6 6.3 4.6 3.7 3.5];

Tv = (144 + 0.48.*inp.W{1}.^2 + 1800.*inp.W{2}) .* 0.3;

and w{3} is a gear number vector

w{1} is a speed vector

w{2} is a acceleration vector

Tg = (inp.W{3}>0) .* (Tv>0) .* Tv ./ r_gear(inp.W{3} + (inp.W{3}==0)) ./ 0.95...

+ (inp.W{3}>0) .* (Tv<=0) .* Tv ./ r_gear(inp.W{3} + (inp.W{3}==0)) .* 0.95;

i don't know what this mathematical symbol means

(inp.W{3}>0) .* (Tv>0) .* Tv ./ r_gear(inp.W{3} + (inp.W{3}==0))

does it mean every value from W{3} must be a positive? and what happen if the value is a negative?

Any help would be appreciate thank you.....

i'm using m.file from ETH Zurich with qss toolbox

Answer by Walter Roberson
on 9 May 2019

Accepted Answer

In MATLAB, comparisons return logical values, false and true, which are nearly always convertable to numeric values 0 and 1.

If you wanted to express a piecewise condition,

first_condition -> first_formula

second_condition -> second_formula

third_condition -> third_formula

then there is a "trick" of expressing it as

first_condition .* first_formula + second_condition .* second_formula + third_condition .* third_formula

Thus, (inp.W{3}>0) .* (Tv>0) .* Expression1 + (inp.W{3}>0) .* (Tv<=0) .* Expression2 can be mentally translated as,

in the positions where inp.W{3}>0 and Tv>0 are both true, then the result is Expression1

in the positions where inp.W{3}>0 and Tv<=0 are both true, then the result is Expression2

This trick has a small catch: it only works in cases where the formula does not give NaN or inf for the positions where the condition is false. For example,

(x ~= 0) .* (1/x) + (x == 0) .* ones(size(x))

looks like it should express

x non 0 -> 1/x

x is 0 -> 1

but it doesn't do so. Both sides of the .* are calculated, so in the places where x is 0, then you calculate

(0 ~= 0) .* (1/0)

%which is

0 .* inf

which is nan rather than being 0. But in cases where the formula is never inf or nan, you can do fine:

(x ~= 0) .* (1/(x+1)) + (x == 0) .* ones(size(x))

is fine, and expresses

x non 0 -> 1/(x+1)

x is 0 -> 1

pratama mahadika
on 9 May 2019

thanks for the answer

i have one more question

what does it mean by

r_gear(inp.W{3} + (inp.W{3}==0))

i don't get the meaning of (inp.W{3}==0)

Walter Roberson
on 10 May 2019

inp.W{3} extracts the third cell array entry from the field named W of the structure or object named inp. == 0 compares that to 0, returning an array of logical false and logical true values that is the same size as inp.W{3} is. When used in a mathematical operation such as +, the false get converted to 0 and the true get converted to 1, so the part after the + is an array of 0 and 1. That array is then added to the inp.W{3} array.

The equivalent of this is:

keep inp.W{3} the same in each case where inp.W{3} is not 0

add 1 to inp.W{3} in the case where inp.W{3} is 0

in other words, use 1 as the subscript where the subscript would have been 0, and otherwise use the original value.

Now, because subscripts can only validly be positive integers, never negative integers, there is another way to express this:

r_gear( max(inp.W{3}, 1) )

max(0,1) is 1. max(1,1) is 1. max(2,1) is 2. So this max() expression has the effect of replacing 0 with 1 and otherwise leaving the value as-is.

pratama mahadika
on 10 May 2019

thank you very much sir :)

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.