Variable 'ep3' is undefined on some execution paths.

조회 수: 2 (최근 30일)
azadeh jalali
azadeh jalali 2021년 2월 21일
댓글: azadeh jalali 2021년 2월 24일
Hello dears,
I'm using the block named Embedded MATLAB (that link the simulink to matlab) and when I try to run the code above, return the message errors: "Variable 'ep3' is undefined on some execution paths", "Variable 'edotp3' is undefined on some execution paths". However, I define these parameters in the embedded matlab function. In below code I identified the line of error.
function y_3 = fcn3_2star_Edit_01(ys1,ys2)
de3=ys1
e3=ys2
x0nb_up=-0.9; x0z_up=-0.1; x0pb_up=0.9;
x0nb=-1; x0z=0; x0pb=1;
x0nb_bot=-1.1; x0z_bot=0.1; x0pb_bot=1.1;
%% x0z1=0; x0p=1; x0n=-1;
%%%% Mu&SigmaForMF %%%%
muP=1; muZ=0; muN=-1; sigma=0.0598957;
if e3<=x0pb && e3>0
ep3=1*max(0,exp(-(e3-x0pb)^2/0.16))
else
if e3 <=0
ep3=0;
else
if e3 >x0pb
ep3=1*max(0,1)
end
end
end
%%%%%
if e3<=x0z && e3>x0nb
ez3=1*max(0,exp(-(e3-x0z)^2/0.16));
else
if e3>=x0z && e3<x0pb
ez3=1*max(0,exp(-(e3-x0z)^2/0.16));
else
if e3<=x0nb
ez3=0 ;
else
if e3>=x0pb
ez3=0;
end
end
end
end
%%%%%
if e3<x0nb
en3=1*max(0,1);
else
if e3>=x0nb && e3<0
en3=1*max(0,exp(-(e3-x0nb)^2/0.16));
else
if e3>=0
en3=0;
end
end
end
%%%%%%%%%%%%%%%%%%%%
if de3<=x0p && de3>0
edotp3=1*max(0,exp(-(de3-x0p)^2/0.16));
else
if de3 <=0
edotp3=0;
else
if de3>x0p
edotp3=1*max(0,1);
end
end
end
%%%%%
if de3<=x0z && de3>x0nb
edotz3=1*max(0,exp(-(de3-x0z)^2/0.16));
else
if de3>=x0z && de3<x0pb
edotz3=1*max(0,exp(-(de3-x0z)^2/0.16));
else
if de3<=x0nb
edotz3=0 ;
else
if de3>=x0pb
edotz3=0;
end
end
end
end
%%%%%
if de3<x0n
edotn3=1*max(0,1);
else
if de3>=x0n && de3<0
edotn3=1*max(0,exp(-(de3-x0n)^2/0.16));
else
if de3>=0
edotn3=0;
end
end
end
%%%%%%%%%%%%%%
if 0< ep3 && ep3 <1 %%% The ERROR is in this line
p_ep3=(1/((2*sqrt(2*pi))*ep3*sigma))*sqrt(-0.16/(log(ep3)))*(exp(-(sqrt(-0.16*log(ep3))+e3-muP)^2/(2*sigma^2))+exp(-(-sqrt(-0.16*log(ep3))+e3-muP)^2/(2*sigma^2)));
PP_ep3=1-((erf((sqrt(-0.08*log(ep3))+(muP/(2^0.5))-(e3/(2^0.5)))/sigma)+erf((sqrt(2)*sqrt(-0.08*log(ep3))-muP+e3)/(sqrt(2)*sigma)))/(sqrt(2)))
else
p_ep3=0;
PP_ep3 =0;
end
%%%%%%%%%%%%%%
if 0< edotp3 && edotp3 <1 %%% The ERROR is in this line
p_edotp3=(1/((2*sqrt(2*pi))*edotp3*sigma))*sqrt(-0.16/(log(edotp3)))*(exp(-(sqrt(-0.16*log(edotp3))+de3-muP)^2/(2*sigma^2))+exp(-(-sqrt(-0.16*log(edotp3))+de3-muP)^2/(2*sigma^2)));
PP_edotp3=1-((erf((sqrt(-0.08*log(edotp3))+(muP/(2^0.5))-(de3/(2^0.5)))/sigma)+erf((sqrt(2)*sqrt(-0.08*log(edotp3))-muP+de3)/(sqrt(2)*sigma)))/(sqrt(2)))
else
p_edotp3=0;
PP_edotp3=0;
end
%%%%%%
........ the code is continuded
My code is too longe, so I only put the beginig of it up to where there is problem.

채택된 답변

Jan
Jan 2021년 2월 21일
편집: Jan 2021년 2월 21일
The message "undefined on some execution paths" means, that there is a possible combination of IF-branches, in which the variable is not defined anywhere. The solution is to create a default value before the IF branchs. This oul simplify your code massively in addition.
Replace:
if e3<=x0pb && e3>0
ep3=1*max(0,exp(-(e3-x0pb)^2/0.16))
else
if e3 <=0
ep3=0;
else
if e3 >x0pb
ep3=1*max(0,1)
end
end
end
by
ep3 = 0;
if e3 <= x0pb && e3 > 0
ep3 = 1 * max(0, exp(-(e3 - x0pb)^2 / 0.16)); % "1*" ?!?
elseif e3 > x0pb
ep3 = 1; % "1*max(0,1)" ?!?
end
The other parts can be simplified also in an equivalent way. E.g.:
if de3<=x0z && de3>x0nb
edotz3=1*max(0,exp(-(de3-x0z)^2/0.16));
else
if de3>=x0z && de3<x0pb
edotz3=1*max(0,exp(-(de3-x0z)^2/0.16));
else
if de3<=x0nb
edotz3=0 ;
else
if de3>=x0pb
edotz3=0;
end
end
end
end
can be simpified to:
edotz3 = 0;
if (de3 <= x0z && de3 > x0nb) || ...
de3 >= x0z && de3 < x0pb)
edotz3 = exp(-(de3 - x0z)^2 / 0.16);
end
Note: max(0, exp(x)) is the same as exp(x), because the result is >= 0 in every case.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Electrical Block Libraries에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by