How do I force a zero value in Simscape language

조회 수: 14 (최근 30일)
Ries Smith
Ries Smith 2016년 3월 24일
댓글: Ries Smith 2016년 3월 28일
I have the following equation inside my custom Simscape block.
Mloc == sqrt( (Pratio^(gm1/-A.gam) * (1+(gm1/2)*Minf^2) - 1) * (2/gm1) );
I am encountering an issue where Pratio is near 1.0 and Minf is near zero, however rounding errors are causing the value inside the sqrt to become negative. How do I force the value inside the sqrt to remain non-negative? Here are some example numbers showing this situation.
sqrt(((14.715780533017/14.715780064774)^(0.4/-1.4) * (1+(0.4/2)*0.0001079^2) - 1) * (2/0.4))

채택된 답변

Sebastian Castro
Sebastian Castro 2016년 3월 25일
I would start off by changing the equations to something like
let
X = (Pratio^(gm1/-A.gam) * (1+(gm1/2)*Minf^2) - 1) * (2/gm1);
in
if X >= 0
Mloc == sqrt(X);
else
Mloc == {0,'appropriate_unit'};
end
end
In reality, most Simscape language blocks will have some sort of "smoothing" to prevent the sharp discontinuity -- usually a linear ramp down to zero over some threshold range (see, e.g., the Translational/Rotational friction blocks). You can try that further step if you run into problems, though.
- Sebastian

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Brakes and Detents에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by